一、基础介绍:
SMI:串行管理接口(Serial Management Interface),也被称作MII管理接口(MII Management Interface),包括MDC和MDIO两条信号线。
MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC由MAC产生,作用是为MDIO提供时钟。
二、示例说明
MCU通过SMI读取外部PHY寄存器,MCU采用S32K148,使用S32DS SDK开发
1、MCU对外部PHY的配置
1)PHY的配置结构体说明
2)PHY地址的确认
当连接的PHY为外部PHY时,addr字段表示PHY的SMI/MDIO地址,以便在总线唯一表示PHY设备。基础PHY地址由外部跳线后的输入电平决定,最终将作为Port5的地址。
pinstraps :通过外部跳线决定输入电平
由上图可知,硬件pinstraps表示二进制从高到低为1000,十进制为16,也就是说port5的地址是16,port6依次递增
3)在PE中进行配置
2、通信协议说明
1)可以通过Clause 22和Clause45来访问MMDs寄存器,Clause45需要通过Clause22间接访问
2)使用Clause22的13寄存器作为Clause45的操作寄存器
使用Clause22的14寄存器作为Clause45的数据/地址 寄存器
3)通过Clause22访问Clause45
三、示例:通过PHY读取Port口的Link状态
1、Link状态的获取
Link状态位于MMD01寄存器,需要通过C22选择MMD1寄存器
2、代码实现
#define PMA_STATUS1_ADDR 1U
#define PMA_PMD_REG 1U
#define CL22_CL45_CONTROL_ADDR 13U
#define CL22_CL45_ADDRDATA_ADDR 14U
#define PHY_ADDR_CONFIG 16U
static void read_cl45_reg(uint8_t phy, uint16_t devadr, uint16_t devreg, uint16_t *reg)
{
g_phyConfig->addr = phy;
PHY_Write(0U, CL22_CL45_CONTROL_ADDR, 0x00&devadr); //选择PMA/PMD
PHY_Write(0U, CL22_CL45_ADDRDATA_ADDR, devreg); //操作C45 PMA_STATUS1寄存器
PHY_Write(0U, CL22_CL45_CONTROL_ADDR, 0x4000|devadr); //01:w 10:r
PHY_Read(0U, CL22_CL45_ADDRDATA_ADDR, reg);
}
int main()
{
uint8_t get_reg_val = 0;
read_cl45_reg(PHY_ADDR_CONFIG,PMA_PMD_REG,PMA_STATUS1_ADDR,&get_reg_val );
printf("Get register value is [%d]", get_reg_val);
}
调用SDK读写函数
四、附件
附件 为通信条款说明