88e6321/88e6320 寄存器配置
一、寄存器介绍
设备寄存器映射表如下图所示:

从图中可以看到:SMI device地址从0x00 到0x1d,其中地址0x00到0x0f为PHY寄存器,0x10到0x16为POrt 寄存器,0x1B 为 Global1,0x1C为 Global2,0x1D 为 Global3.
对于单芯片模式,phy寄存器的读写(port: 3 4 12 13 )的读写需要借助 GLOBAL2的pc pd寄存器进行读写。port 以及 Global 寄存器可以直接读写。
芯片模式分为单芯片模式和多芯片模式,ADDR[4:0]为0x1f时为单芯片模式,此芯片的设备地址为0x00。当ADDR[4:0]为其他值时为多芯片模式。
CPU 模式:当N0_CPU为0时,为CPU模式,此时PHY寄存器以及port端口需要初始化时配置以及使能。当N0_CPU为1时,为NO CPU模式,此时PHY寄存器以及port寄存器自动使能。
GPIO 输出125M时钟,多个GPIO配置相同的功能时,只有编号最小的那个IO口功能生效。
二、驱动代码
1、寄存器读写。
参考https://blog.csdn.net/jingling122/article/details/118295347
2、PHY寄存器的读写
/*!* \fn write_smi_phy_reg* \brief PHY寄存器设置* \param [in] uint16_t dev_addr PHY地址,单芯片寻址模式下为0x03或0x04* \param [in] uint16_t reg_addr 寄存器地址* \param [in] uint32_t reg_value 写入值* * \retval error_code_t */
u16 WAN_write_smi_phy_reg( u8 dev_addr, u8 reg_addr, u16 reg_value)
{volatile u16 time_out;u32 smi_reg;time_out = 100;// 检测当前PHY是否Busydo {smi_reg = PHY_WAN_Reg_Read(GLOBAL2_DEV_ADDR, SMI_PHY_CMD_REG); if (time_out-- < 1) {PHY_ASSERT;return FALSE;}} while (smi_reg & SMI_BUSY);// 先将需要写入的数据写入SMI_PHY_DATA_REG,待后续写命令时完成传输PHY_WAN_Reg_Write(GLOBAL2_DEV_ADDR, SMI_PHY_DATA_REG, reg_value);smi_reg = SMI_BUSY | (dev_addr << 5) | (SMI_WRITE << 10) | (reg_addr << 0) | (SMI_CLAUSE22 << 12); //!< 设置需要写入的命令(写命令、smi地址、phy寄存器地址、条款) By: Ouqichen 2019年2月11日// 写入命令 PHY_WAN_Reg_Write( GLOBAL2_DEV_ADDR, SMI_PHY_CMD_REG, smi_reg); return TRUE;
}/*****************************************************************************!* \fn read_smi_phy_reg* \brief PHY寄存器读取* * \param [in] uint16_t dev_addr PHY地址,单芯片寻址模式下为0x03或0x04* \param [in] uint16_t reg_addr 寄存器地址* \param [out] uint32_t *reg_value 读出值* * \retval error_code_t *******************************************************************************/u16 WAN_read_smi_phy_reg( u16 dev_addr, u16 reg_addr, u16 *reg_value)
{volatile u16 time_out;u32 smi_reg;time_out =100;// 检测当前PHY是否Busy do {smi_reg=PHY_WAN_Reg_Read( GLOBAL2_DEV_ADDR, SMI_PHY_CMD_REG);if (time_out-- < 1) {PHY_ASSERT;return FALSE;}} while (smi_reg & SMI_BUSY);smi_reg = SMI_BUSY | (dev_addr << 5) | (SMI_READ_22 << 10) | (reg_addr << 0) | (SMI_CLAUSE22 << 12);//!< 设置需要写入的命令(读命令、smi地址、phy寄存器地址、条款) By: Ouqichen 2019年2月11日// 写入命令 PHY_WAN_Reg_Write( GLOBAL2_DEV_ADDR, SMI_PHY_CMD_REG, smi_reg);// 检测当前PHY是否Busytime_out =100;do {smi_reg =PHY_WAN_Reg_Read( GLOBAL2_DEV_ADDR, SMI_PHY_CMD_REG);if (time_out-- < 1) {PHY_ASSERT;return FALSE;}} while (smi_reg & SMI_BUSY);//待总线不忙碌时读取数据 *reg_value = PHY_WAN_Reg_Read( GLOBAL2_DEV_ADDR, SMI_PHY_DATA_REG);return TRUE;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
