如何使用SmartMDA在MCX MCU上实现MDIO从接口
该软件随应用笔记提供,主要介绍如何使用SmartDMA实现MDIOI从设备接口功能。
主板:FRDM-MCXN947
类别:HMI、工业、网络、用户界面
外设:以太网、GPIO
工具链:IAR
目录
1.软件
- MCUXpresso IDE V11.10.0 或更高版本。
- SDK216000FRDM-MCXN947
- 适用于 Visual Studio Code 的 MCUXpresso:此示例支持适用于 Visual Studio Code 的 MCUXpresso,有关如何使用 Visual Studio Code 的更多信息请参阅此处。
2.硬件
- Type-C USB 线缆
- 两组FRDM-MCXN947
- 个人电脑
- 逻辑器件:Saleae logic pro16
- 一些杜邦线
3. 设置
3.1 步骤 1
此应用需要两块 FRDM-MCXN947 开发板来实现 MDIO 通信,其中一块用作 MDIO 主设备,另一块用作 MDIO 从设备。两块开发板通过两个引脚和地线连接。硬件连接如下表所示。
| 功能 | MDIO 主控 FRDM-MCXN947 板 | MDIO从属FRDM-MCXN947 板 |
| ---------------- | ----------------------------------------------- | --------------------------------------------- |
| MDIO | J1-7(P1-21) | J1-1(P316) |
| 多数据中心 | R191 的焊盘 1(移除 R191) (P120) | J1-5(P3_20) |
| 接地 | J5-8(接地) | J5-8(接地) |
- 用USB线将逻辑设备连接到PC,将逻辑设备连接到MDIO信号。
- 使用 USB type-C 电缆将 FRDM-MCXN947 板连接到 PC。
- 连接两块FRDM-MCXN947板的信号引脚。
3.1 步骤 2
- 准备主板固件
值得一提的是,MCXN947 的以太网外设具有 MDIO 主设备功能。用户可以通过相应 SDK 中名为“txrxrxpoll”的示例来演示 MDIO 主设备功能。示例路径为:SDK216000FRDM-MCXN947boardsfrdmmcxn947driverexamplesenettxrx_rxpoll。
重要的代码例程如下:
```
```
static void MDIO_Init(void)
{
(void)CLOCKEnableClock(senetClock[ENETGetInstance(EXAMPLEENET_BASE)]);
EXAMPLEENETBASE->MACMDIOADDRESS = ENETMACMDIOADDRESSCR(0);
}
static statust MDIOWrite(uint8t phyAddr, uint8t devAddr,uint16t regAddra, uint16t data)
{
uint32t reg = EXAMPLEENETBASE->MACMDIOADDRESS & ENETMACMDIOADDRESSCRMASK;
/* Build MII write command. */
EXAMPLEENETBASE->MACMDIOADDRESS =
? reg | ENETMACMDIOADDRESSGOC0(1) | ENETMACMDIOADDRESSPA(phyAddr) | ENETMACMDIOADDRESSRDA(devAddr)| ENETMACMDIOADDRESS_C45E(1);
EXAMPLEENETBASE->MACMDIODATA = (regAddra << 16) | data;
EXAMPLEENETBASE->MACMDIOADDRESS |= ENETMACMDIOADDRESSGB_MASK;
while (((EXAMPLEENETBASE->MACMDIOADDRESS & ENETMACMDIOADDRESSGB_MASK) != 0U))
{
}
}
static statust MDIORead(uint8t phyAddr, uint8t devAddr, uint16t regAddr, uint16t *pData)
{
uint32t reg = EXAMPLEENETBASE->MACMDIOADDRESS & ENETMACMDIOADDRESSCRMASK;
/* Build MII read command. */
EXAMPLEENETBASE->MACMDIOADDRESS = reg | ENETMACMDIOADDRESSGOC0(1) | ENETMACMDIOADDRESSGOC1(1) |ENETMACMDIOADDRESSPA(phyAddr) | ENETMACMDIOADDRESSRDA(devAddr)| ENETMACMDIOADDRESSC45E(1);
EXAMPLEENETBASE->MACMDIODATA = (regAddr << 16);
EXAMPLEENETBASE->MACMDIOADDRESS |= ENETMACMDIOADDRESSGB_MASK;
while (((EXAMPLEENETBASE->MACMDIOADDRESS & ENETMACMDIOADDRESSGB_MASK) != 0U))
{
}
*pData = (EXAMPLEENETBASE->MACMDIODATA & ENETMACMDIODATAGD_MASK);
}
The operations code as below:
MDIO_Init();
for(uint32_t i = 0; i < 8*4; i = i+4)
{
? MDIO_Write(0x10, 0x20, 0x8000+i, i);
? SDK_DelayAtLeastUs(10, SystemCoreClock);
}
for(uint32_t i = 0; i < 8*4; i = i+4)
{
? MDIO_Write(0x10, 0x20, 0x9000+i, i+0x100);
? SDK_DelayAtLeastUs(10, SystemCoreClock);
}
for(uint32_t i = 0; i < 8*4; i = i+4)
{
? MDIO_Write(0x10, 0x20, 0xa000+i, i+0x200);
? SDK_DelayAtLeastUs(10, SystemCoreClock);
}
for(uint32_t i = 0; i < 8*4; i = i+4)
{
? MDIO_Write(0x10, 0x20, 0xb000+i, i+0x300);
? SDK_DelayAtLeastUs(10, SystemCoreClock);
}
for(uint32_t i = 0; i < 8*4; i = i+4)
{
? MDIORead(0x10, 0x20, 0x8000+i, &grec_data);
? PRINTF("addr:0x%4x,RxD:0x%4x.rn",0x8000+i,grecdata);
}
for(uint32_t i = 0; i < 8*4; i = i+4)
{
? MDIORead(0x10, 0x20, 0x9000+i, &grec_data);
? PRINTF("addr:0x%4x,RxD:0x%4x.rn",0x9000+i,grecdata);
}
for(uint32_t i = 0; i < 8*4; i = i+4)
{
? MDIORead(0x10, 0x20, 0xa000+i, &grec_data);
? PRINTF("addr:0x%4x,RxD:0x%4x.rn",0xa000+i,grecdata);
}
for(uint32_t i = 0; i < 8*4; i = i+4)
{
? MDIORead(0x10, 0x20, 0xb000+i, &grec_data);
? PRINTF("addr:0x%4x,RxD:0x%4x.rn",0xb000+i,grecdata);
}
```
- 将从属项目导入 MCUXpresso IDE。
- 打开 MCUXpresso IDE,在快速启动面板中,选择?从应用程序代码中心导入?。
? - 在搜索栏中输入演示名称。
- 点击?复制GitHub链接?,MCUXpresso IDE将自动检索项目属性,然后单击?下一步>?。
? - 选择主分支然后点击?Next>?,选择MCUXpresso工程,点击Finish按钮完成导入。
?
- 使用微型 USB 线连接 PC 主机和开发板上的 USB 端口 (J17)。
- 分别编译并下载主从机固件到主从机板。
- 重置并运行。
4.结果
- 打开连接到MDIO主板串口的PC主机软件,然后重置主板。
- 重置演示板,首先重置 MDIO 从板,然后重置 MDIO 主板。
- 可以看到MDIO主板打印的串口日志如下:
地址:0x8000,RxD:0x 0。
地址:0x8004,RxD:0x 4。
地址:0x8008,RxD:0x 8。
地址:0x800c,RxD:0x c。
地址:0x8010,RxD:0x c.
地址:0x8014,RxD:0x c。
地址:0x8018,RxD:0x c。
地址:0x801c,RxD:0x 1c。
地址:0x9000,RxD:0x 1c。
地址:0x9004,RxD:0x 1c。
地址:0x9008,RxD:0x 108。
地址:0x900c,RxD:0x 10c。
地址:0x9010,RxD:0x 110。
地址:0x9014,RxD:0x 114。
地址:0x9018,RxD:0x 118。
地址:0x901c,RxD:0x 11c。
地址:0xa000,RxD:0x 200。
地址:0xa004,RxD:0x 204。
地址:0xa008,RxD:0x 208。
地址:0xa00c,RxD:0x 20c。
地址:0xa010,RxD:0x 210。
地址:0xa014,RxD:0x 214。
地址:0xa018,RxD:0x 218。
地址:0xa01c,RxD:0x 21c。
地址:0xb000,RxD:0x 300。
地址:0xb004,RxD:0x 304。
地址:0xb008,RxD:0x 308。
地址:0xb00c,RxD:0x 30c。
地址:0xb010,RxD:0x 310。
地址:0xb014,RxD:0x 314。
地址:0xb018,RxD:0x 318。
地址:0xb01c,RxD:0x 31c。
5. 支持
在此提供帮助的 URL。
项目元数据
来源:恩智浦appcodehub