EFM8与W5500以太网模块SPI通信配置指南

📅 2026/7/15 10:40:05
EFM8与W5500以太网模块SPI通信配置指南
1. EFM8 Universal Bee与W5500以太网模块的硬件连接在开始配置SPI通信之前我们需要先确保硬件连接正确。EFM8 Universal Bee开发板与W5500以太网模块的连接需要注意以下几个关键点电源匹配W5500通常需要3.3V供电而EFM8 Universal Bee开发板也提供3.3V输出。确保使用正确的电压供电避免因电压不匹配导致的模块损坏。SPI引脚连接EFM8的SPI0_MOSI连接W5500的MOSIEFM8的SPI0_MISO连接W5500的MISOEFM8的SPI0_SCK连接W5500的SCKEFM8的一个GPIO引脚连接W5500的CS片选复位电路W5500需要一个复位信号可以连接到EFM8的一个GPIO引脚通过软件控制复位。中断引脚可选如果需要使用中断功能可以将W5500的INT引脚连接到EFM8的一个中断引脚。注意在连接SPI信号线时建议使用短而粗的导线并尽可能减少并行走线的长度以降低信号干扰。如果通信距离较长超过10cm可能需要考虑添加终端电阻或使用缓冲器。2. EFM8的SPI0接口配置EFM8 Universal Bee的SPI0接口配置是通信成功的关键。以下是详细的配置步骤和参数说明2.1 SPI寄存器配置首先需要配置SPI0的控制寄存器// SPI0配置寄存器 SPI0CFG 0x40; // SPI使能主模式时钟极性0时钟相位0 SPI0CN0 0x03; // SPI主模式使能NSS信号由软件控制 // 时钟分频设置 SPI0CKR 0x1F; // SPI时钟 系统时钟/(2*(SPI0CKR1))配置说明时钟极性(CPOL)和时钟相位(CPHA)需要与W5500的SPI模式匹配W5500通常支持模式0和模式3时钟频率不宜过高建议初始设置为1MHz以下稳定后可尝试提高NSS(片选)信号建议使用GPIO手动控制而不是硬件自动控制2.2 GPIO引脚配置配置用于SPI通信的GPIO引脚// MOSI(P0.0), MISO(P0.1), SCK(P0.2)配置为推挽输出 P0MDOUT | 0x05; // P0.0和P0.2为推挽输出 P0SKIP | 0x01; // 跳过P0.0的数字输入 // 片选引脚配置(假设使用P1.0) P1MDOUT | 0x01; // P1.0为推挽输出 P1 | 0x01; // 初始时片选为高(不选中)2.3 SPI通信函数实现实现基本的SPI读写函数// SPI写一个字节 void SPI_Write(uint8_t data) { SPI0DAT data; // 写入数据 while(!(SPI0CN0 0x80)); // 等待传输完成 SPI0CN0 ~0x80; // 清除SPIF标志 } // SPI读一个字节 uint8_t SPI_Read(void) { SPI0DAT 0xFF; // 发送dummy数据 while(!(SPI0CN0 0x80)); // 等待传输完成 SPI0CN0 ~0x80; // 清除SPIF标志 return SPI0DAT; // 返回接收到的数据 } // SPI连续读写 void SPI_ReadWrite(uint8_t *txData, uint8_t *rxData, uint16_t len) { for(uint16_t i0; ilen; i) { if(txData) { SPI_Write(txData[i]); if(rxData) rxData[i] SPI_Read(); } else { rxData[i] SPI_Read(); } } }3. W5500以太网模块初始化W5500的初始化是确保网络通信正常的关键步骤需要按照特定顺序配置各个寄存器。3.1 W5500硬件复位在软件初始化前建议先进行硬件复位// 假设复位引脚连接到P1.1 #define W5500_RST_PIN P1_1 void W5500_HardReset(void) { W5500_RST_PIN 0; // 拉低复位 delay_ms(10); // 保持至少500us W5500_RST_PIN 1; // 释放复位 delay_ms(100); // 等待芯片稳定 }3.2 W5500寄存器读写函数实现W5500的寄存器读写函数// W5500片选控制(假设使用P1.0) #define W5500_CS_PIN P1_0 // W5500写寄存器 void W5500_Write(uint16_t addr, uint8_t data) { uint8_t cmd[4] {addr8, addr0xFF, 0x80, data}; W5500_CS_PIN 0; // 选中W5500 SPI_ReadWrite(cmd, NULL, 4); W5500_CS_PIN 1; // 释放片选 } // W5500读寄存器 uint8_t W5500_Read(uint16_t addr) { uint8_t cmd[4] {addr8, addr0xFF, 0x00, 0x00}; uint8_t rcv[4]; W5500_CS_PIN 0; // 选中W5500 SPI_ReadWrite(cmd, rcv, 4); W5500_CS_PIN 1; // 释放片选 return rcv[3]; }3.3 W5500基础配置配置W5500的基本网络参数void W5500_Init(void) { // 1. 配置MAC地址 W5500_Write(0x0009, 0x00); // MAC地址寄存器 W5500_Write(0x000A, 0x08); W5500_Write(0x000B, 0xDC); W5500_Write(0x000C, 0x11); W5500_Write(0x000D, 0x22); W5500_Write(0x000E, 0x33); // 2. 配置网关、子网掩码和IP地址 W5500_Write(0x0001, 192); // IP地址 W5500_Write(0x0002, 168); W5500_Write(0x0003, 1); W5500_Write(0x0004, 100); W5500_Write(0x0005, 255); // 子网掩码 W5500_Write(0x0006, 255); W5500_Write(0x0007, 255); W5500_Write(0x0008, 0); W5500_Write(0x0011, 192); // 网关 W5500_Write(0x0012, 168); W5500_Write(0x0013, 1); W5500_Write(0x0014, 1); // 3. 配置PHY W5500_Write(0x002E, 0x01); // PHY配置寄存器自动协商 // 4. 启用ping响应 W5500_Write(0x002A, 0x01); // Ping响应使能 }4. 网络连接测试与Ping功能验证完成上述配置后我们需要验证W5500是否正确连接到网络并能够响应Ping请求。4.1 网络状态检测首先检查W5500的物理连接状态uint8_t W5500_CheckLink(void) { uint8_t phycfgr W5500_Read(0x002E); if(phycfgr 0x01) { return 1; // 连接正常 } return 0; // 无连接 }4.2 Ping测试流程在PC端进行Ping测试的步骤确保PC与W5500在同一局域网内打开命令提示符(cmd)输入命令ping 192.168.1.100与W5500配置的IP一致观察返回结果4.3 常见问题排查如果Ping不通可以按照以下步骤排查检查物理连接确认网线已正确连接确认W5500的LED指示灯状态连接和活动指示灯检查IP配置确认W5500的IP地址与PC在同一子网确认网关和子网掩码设置正确检查SPI通信使用逻辑分析仪或示波器检查SPI信号确认片选信号在通信期间保持低电平确认时钟和数据信号波形正常检查W5500寄存器读取PHY配置寄存器(0x002E)确认连接状态确认Ping响应功能已启用(0x002A bit01)降低SPI时钟频率如果SPI时钟过快可能导致通信不稳定尝试降低SPI0CKR的值减小时钟频率4.4 调试技巧在实际调试中我发现以下几个技巧很有帮助逐步验证法先验证SPI基本通信是否正常然后验证W5500寄存器读写是否正确最后再测试网络功能使用示波器观察SPI时钟和数据线的波形检查信号质量是否有过冲或振铃软件调试实现一个简单的寄存器读写测试函数通过读取已知寄存器值如版本寄存器验证通信网络抓包使用Wireshark等工具捕获网络流量确认Ping请求是否到达W5500检查W5500是否发送了响应通过以上步骤大多数Ping不通的问题都能被定位和解决。在实际项目中我发现SPI时钟相位和极性的配置错误是最常见的问题源建议在初始化时仔细检查这些参数是否与W5500的要求匹配。