总线协议:GPIO模拟SMI(MDIO)协议(3):SMI协议测试

11 篇文章 1 订阅
6 篇文章 0 订阅

0 工具准备

TN1305 Technical note
IEEE802.3-2018
STM32F4xx中文参考手册

1 测试方案

我们前面已经完成了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协议读写寄存器功能是否正常。

1.1 读寄存器测试函数

读寄存器测试函数直接调用我们之前设计好的协议层读寄存器函数即可。

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;
}

1.2 写寄存器测试函数

写寄存器测试函数直接调用我们之前设计好的协议层写寄存器函数即可。

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;
}

2 测试结果

2.1 读取PHY设备寄存器

复位PHY芯片后,我们首先读取寄存器2的值:
在这里插入图片描述
读取到的寄存器值为0x0007,和LAN8720技术手册中的定义一样,说明读PHY设备寄存器功能正常。

2.2 写PHY设备寄存器

首先将LAN8720的寄存器2的值设置为0xAA55,然后读取LAN8720的值,查看是否为0xAA55。测试结果如下:
在这里插入图片描述
可以看到读取值和写入值一致,说明写PHY设备寄存器功能正常。

2.3 读写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设备寄存器稳定性测试正常。

3 工程文件下载地址

工程文件已经上传至CSDN,有需要的可以直接下载。
https://download.csdn.net/download/kevin1499/88768490

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NW嵌入式开发

感谢您的支持,让我们一起进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值