RT-Thread论坛
直播中

半导体开发

11年用户 920经验值
擅长:可编程逻辑
私信 关注
[问答]

MCU无法检测到W5500是怎么回事?

在兆易创新 GD32F303,国民技术 N32G457和ST STM32F103上试用了W5500以太网模块(RT-Thread版本是rt-thread-4.1.1),
只有STM32F103上可以检测到W5500,在GD32F303和N32G457都显示为Wiznet chip not detected。
在三个MCU上用的都是同一个SPI接口,RST,INT,CS用的GPIO都是一样的,在三个BSP中修改的地方也是基本上一样的。
不知道各位有没有碰到类似的情况,有的话帮忙解答一下,谢谢。


回帖(1)

王飞

2025-10-24 17:59:11

针对MCU无法检测到W5500的问题(GD32F303、N32G457上报错,仅STM32F103正常),结合您描述的环境一致性(相同SPI接口、引脚配置、BSP修改),以下是系统性的排查建议和解决方案:




关键排查点




  1. SPI时序兼容性  



    • 时钟极性/相位(CPOL/CPHA)

      确认所有MCU的SPI模式与W5500要求一致(仅支持Mode 0(CPOL=0, CPHA=0)Mode 3(CPOL=1, CPHA=1))。  

      • 检查drv_spi.c中SPI配置结构体(如rt_spi_configuration):  
        cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; // 优先使用Mode 0


    • 时钟频率

      降低初始调试频率(例如 1-2 MHz),排除高速时序问题:  
      cfg.max_hz = 1 * 1000 * 1000; // 调整为1MHz测试




  2. 复位(RST)时序

    W5500要求复位脉冲低电平维持至少 500ns,复位后需等待 2ms 以上再操作:


    // 复位代码示例(需严格时序)
    rt_pin_write(RST_PIN, PIN_LOW);
    rt_hw_us_delay(1);       // 至少500ns,此处用1µs
    rt_pin_write(RST_PIN, PIN_HIGH);
    rt_thread_mdelay(5);     // 等待5ms确保芯片就绪



  3. 片选(CS)信号问题  



    • 检查CS引脚是否被其他外设占用(如SPI Flash)。  

    • 在SPI传输函数中确认CS引脚被正确拉低/拉高:  
      // 手动控制CS(若自动CS失效)
      rt_pin_write(CS_PIN, PIN_LOW);
      spi_transfer_message(...); // SPI传输
      rt_pin_write(CS_PIN, PIN_HIGH);




  4. SPI总线锁冲突

    添加互斥锁防止多线程竞争:


    rt_mutex_take(&spi_lock, RT_WAITING_FOREVER); // 传输前加锁
    spi_wiz_read(addr, rx_buf);                   // SPI操作
    rt_mutex_release(&spi_lock);                  // 释放锁



  5. 引脚复用冲突  



    • 确认GD32/N32的SPI引脚未被其他功能占用(如JTAG):  

      • GD32F303:检查PA15(SPI_NSS)是否被JTAG占用,禁用JTAG:  
        rcu_periph_clock_enable(RCU_AF);
        gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE); // 仅启用SWD

      • N32G457:检查复用功能寄存器GPIOx_AF_CFG





  6. 电源和硬件连接  



    • 测量W5500的3.3V供电电压是否稳定(要求≥3.0V)。  

    • 检查所有SPI信号线(SCK、MOSI、MISO、CS)的连通性(万用表测试短路/断路)。  

    • 确认MCU与W5500的共地连接。






诊断步骤




  1. 读取W5500版本寄存器(0x00地址)

    在初始化代码中添加调试输出,直接读取芯片ID:


    uint8_t rx_buf[2];
    spi_wiz_read(0x00, rx_buf, 2); // 读取版本寄存器
    rt_kprintf("Chip ID: 0x%02X%02Xn", rx_buf[0], rx_buf[1]); // 正常应为0x0400


    • 若读回0xFFFF0x0000:SPI通信失败。




  2. 逻辑分析仪抓取SPI波形

    对比STM32F103与异常MCU的SPI时序:  



    • CS、SCK、MOSI信号是否正常?  

    • MOSI数据是否符合预期(W5500读命令格式:0x00 + 地址)?  

    • MISO是否有数据返回?




  3. 替换SPI底层驱动

    若问题集中在特定MCU,临时替换为软件模拟SPI(bit-banging)测试硬件SPI控制器问题:


    // 示例:软件SPI写1字节
    void soft_spi_write(uint8_t data) {
       for (int i=0; i<8; i++) {
           rt_pin_write(CLK_PIN, PIN_LOW);
           rt_pin_write(MOSI_PIN, (data >> (7-i)) & 0x01);
           rt_hw_us_delay(1);
           rt_pin_write(CLK_PIN, PIN_HIGH);
           rt_hw_us_delay(1);
       }
    }





特定MCU注意事项




  • GD32F303

    确认时钟树配置(APB总线时钟),SPI时钟源可能依赖rcu_apb_clock,检查rcu_periph_clock_enable(RCU_SPIx)是否使能。




  • N32G457

    检查SPI的DMA配置(若启用),关闭DMA功能进行基础测试:


    spi_init(SPIx, SPI_MODE_MASTER, SPI_CLK_DIV8, SPI_CK_PL_LOW_PH_1EDGE); // 简化配置





补充建议



  • 更新驱动与BSP

    升级RT-Thread到最新版本(如v4.1.2),并检查是否有W5500驱动补丁。

  • 检查中断冲突

    确保INT引脚配置为浮空输入(默认无中断触发):
    rt_pin_mode(INT_PIN, PIN_MODE_INPUT_PULLUP); // 上拉输入


通过以上步骤,90%的问题可定位到SPI时序、复位时序或硬件连接。重点优先检查SPI模式CS信号动作复位延时,这三者是最常见的原因。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分