TN1305 Technical note
IEEE802.3-2018
STM32F4xx中文参考手册
我们前面已经完成了GPIO模拟SMI协议的函数设计,接下来我们使用LAN8720这个PHY芯片测试我们设计的GPIO模拟SMI协议的寄存器读写功能是否正常。
在此之前,我们需要查看LAN8720的技术手册,查看其PHY地址及寄存器的值。
(1)LAN8720的PHY地址
可以看到,LAN8720的PHY地址的bit0由复位后PHYAD[0]的输入电平决定,我们这里的PHYAD[0]引脚悬空,由于有内部下拉因此LAN8720的PHY地址的值为0。原理图如下:
(2)LAN8720的寄存器值
可以看到寄存器2、3是LAN8720的ID寄存器。我们需要用到寄存器2也就是PHY ID寄存器1:
该寄存器的初始值是0x0007,支持读写,我们可以用来测试GPIO模拟SMI协议读写寄存器功能是否正常。
读寄存器测试函数直接调用我们之前设计好的协议层读寄存器函数即可。
int rdphy(int argc, char *argv[])
{
u16 phyAddr, regAddr;
u16 regVal;
if (argc != 3)
{
printf("Param1:phy addr\r\n");
printf("Param2:reg addr\r\n");
return -1;
}
phyAddr = StrToInt(argv[1]);
regAddr = StrToInt(argv[2]);
regVal = smi_read_reg(phyAddr, regAddr);
printf("Phy addr : 0x%04X\r\n", phyAddr);
printf("Reg addr : 0x%04X\r\n", regAddr);
printf("Reg val : 0x%04X\r\n", regVal);
return 0;
}
写寄存器测试函数直接调用我们之前设计好的协议层写寄存器函数即可。
int setphy(int argc, char *argv[])
{
u16 phyAddr, regAddr;
u16 regVal;
if (argc != 4)
{
printf("Param1:phy addr\r\n");
printf("Param2:reg addr\r\n");
printf("Param3:reg val\r\n");
return -1;
}
phyAddr = StrToInt(argv[1]);
regAddr = StrToInt(argv[2]);
regVal = StrToInt(argv[3]);
smi_set_reg(phyAddr, regAddr, regVal);
printf("Phy addr : 0x%04X\r\n", phyAddr);
printf("Reg addr : 0x%04X\r\n", regAddr);
printf("Reg val : 0x%04X\r\n", regVal);
return 0;
}
复位PHY芯片后,我们首先读取寄存器2的值:
读取到的寄存器值为0x0007,和LAN8720技术手册中的定义一样,说明读PHY设备寄存器功能正常。
首先将LAN8720的寄存器2的值设置为0xAA55,然后读取LAN8720的值,查看是否为0xAA55。测试结果如下:
可以看到读取值和写入值一致,说明写PHY设备寄存器功能正常。
前面已经验证了单次读取、写入寄存器功能是否正常,为了确保GPIO模拟SMI协议的可靠性,接下来进行稳定性测试。测试方法如下:
(1)设置LAN8720寄存器值为1
(2)读取LAN8720寄存器值
(3)查看读取值和设置值是否一致
(4)重复(1)-(3)且设置值+1
函数设计如下:
int testphy(int argc, char *argv[])
{
u64 cnt = 0;
u16 val = 0;
for (;;)
{
val++;
smi_set_reg(0, 2, val);
if (smi_read_reg(0, 2) != val)
{
printf("Test phy fail, cnt : %lld\r\n", cnt);
break;
}
cnt++;
if ((cnt % 10000) == 0)
{
printf("Test phy cnt : %lld\r\n", cnt);
}
Raise_Dog();
}
return 0;
}
连续测试2.9KW次读写正常,读写PHY设备寄存器稳定性测试正常。
工程文件已经上传至CSDN,有需要的可以直接下载。
https://download.csdn.net/download/kevin1499/88768490