88e1111工作在RGMII转SGMII模式下如下图
如果phy 连接phy可以ping 通,phy连接mac则不能ping通。但是如果交换机配置为1000base-x,88e1111强制1000M,也能通。但是交换机在sgmii模式下则不通。
// RGMII to SGMII Configuration
gmii2rgmii_config_t gmii2rgmii_Config =
{
.tx_clk_pad_skew = 0x0,
.rx_clk_pad_skew = 0x0,
.tx_data_pad_skew = 0x0,
.rx_data_pad_skew = 0x0,
.rx_ctl_pad_skew = 0x0,
.tx_ctl_pad_skew = 0x0,
.tx_clk_dly = 0x0,
.rx_clk_dly = 0x0,
.tx_data_dly = 0x0,
.rx_data_dly = 0x0,
.tx_ctl_dly = 0x0,
.rx_ctl_dly = 0x0,
.tx_crossover = RGMII_TO_SGMII,
.rx_crossover = SGMII_TO_RGMII,
};
GMII2RGMII_Config(pHandle,&gmii2rgmii_Config);
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题涉及到的知识点比较多,需要仔细分析。根据您提供的信息,我理解您的情况是这样的:
您的系统中有一个88e1111的芯片,它的工作模式是RGMII转SGMII。
您有两种测试方案:
您还发现,当交换机的配置为1000base-x时,88e1111的SGMII口强制为1000M时,连接到MAC处也能够ping通。但是在SGMII模式下不行。
针对这个问题,有几个可能的原因:
交换机的配置为1000base-x时,88e1111的SGMII口改为了1000M,并且使用1000base-x自适应光模块与交换机相连。这意味着在1G速率下,您的物理层连接是没有问题的。但是在SGMII模式下,如果您使用的物理层接口配置有误,或者焊接有问题,就会导致MAC无法正常通信。您可以检查一下您的物理层连接是否正确。
在RGMII转SGMII模式下,设置SGMII参数是至关重要的。您需要根据芯片手册正确设置对应的寄存器,以确保SGMII口能够正常工作。这些寄存器包括PHY_MODE控制寄存器、SGMII控制寄存器等等。您可以检查一下您的SGMII配置是否正确。
在MAC侧,您需要根据芯片手册正确配置寄存器,以使MAC能够正确地与SGMII口通信。这些寄存器包括MAC控制寄存器、PHY控制寄存器等等。您可以检查一下您的MAC配置是否正确。
在这里给出一些可能有用的代码:
SGMII配置:
/* 设置SGMII寄存器 */
#define SGMII_MODE_REG 0x10 // SGMII控制寄存器
/* SGMII mode */
#define SGMII_TX_CLK_DELAYED_MASK 0x8000 // TX时钟延迟控制
#define SGMII_RX_CLK_DELAYED_MASK 0x4000 // RX时钟延迟控制
#define SGMII_SPEED_1000 0x2000 // 1000M速率
#define SGMII_SPEED_100 0x1000 // 100M速率
#define SGMII_FULL_DUPLEX 0x0800 // 全双工
#define SGMII_PREAMBLES 0x0400 // SGMII前导码控制
#define SGMII_TX_EN 0x0200 // SGMII TX使能
#define SGMII_RX_EN 0x0100 // SGMII RX使能
#define SGMII_AN_EN 0x0080 // SGMII AN功能使能
#define SGMII_LINK_UP 0x0040 // SGMII连接状态
#define SGMII_MODE_SGMII 0x0001 // SGMII模式
#define SGMII_SPEED_BOTH (SGMII_SPEED_1000 | SGMII_SPEED_100)
#define SGMII_DEF_CONF \
SGMII_TX_CLK_DELAYED_MASK | SGMII_RX_CLK_DELAYED_MASK | \
SGMII_SPEED_BOTH | SGMII_FULL_DUPLEX | SGMII_PREAMBLES | \
SGMII_TX_EN | SGMII_RX_EN | SGMII_AN_EN | SGMII_MODE_SGMII
writel(SGMII_DEF_CONF, SGMII_MODE_REG);
MAC配置:
/* 设置MAC寄存器 */
#define MAC_CONFIG_REG 0x0 // MAC控制寄存器
#define PHY_IF_SEL 0x80 // PHY接口选择
#define FULL_DUPLEX 0x40 // 全双工
#define PROMISCUOUS 0x20 // 接收所有帧
#define CRC_CHECK 0x10 // CRC校验
#define LOOPBACK 0x08 // 回环模式
#define TX_ENABLE 0x04 // 传输使能
#define RX_ENABLE 0x02 // 接收使能
#define RESET 0x01 // 软件复位
#define MAC_DEF_CONF \
PHY_IF_SEL | FULL_DUPLEX | \
CRC_CHECK | TX_ENABLE | RX_ENABLE
writel(MAC_DEF_CONF, MAC_CONFIG_REG);
希望这些信息可以对您有所帮助。如果问题仍然无法解决,请提供更多详细信息和代码,以便我们更好地帮助您。
如果我的回答解决了您的问题,请采纳!