一、硬件连接方案
1. 引脚映射表
| W5500引脚 |
功能说明 |
STM32F4引脚 |
电路设计要点 |
| SCLK |
SPI时钟 |
PA5 |
上拉电阻10kΩ |
| MOSI |
主出从入 |
PA7 |
串联33Ω电阻防反射 |
| MISO |
主入从出 |
PA6 |
加入施密特触发器 |
| CS |
片选信号 |
PA4 |
上拉至3.3V |
| RST |
复位信号 |
PA3 |
RC复位电路(10kΩ+100nF) |
| INT |
中断信号 |
PA0 |
外部中断配置 |
2. 电源设计
W5500供电方案:
- 3.3V LDO稳压(如AMS1117-3.3)
- 输入滤波:10μF电解电容 + 0.1μF陶瓷电容
- 电源隔离:数字/模拟地分割
二、SPI模拟驱动实现
1. GPIO初始化(HAL库)
#define W5500_SCK_PIN GPIO_PIN_5
#define W5500_MOSI_PIN GPIO_PIN_7
#define W5500_MISO_PIN GPIO_PIN_6
#define W5500_CS_PIN GPIO_PIN_4
#define W5500_RST_PIN GPIO_PIN_3
void W5500_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置SCK/MOSI/CS为推挽输出
GPIO_InitStruct.Pin = W5500_SCK_PIN | W5500_MOSI_PIN | W5500_CS_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置MISO为浮空输入
GPIO_InitStruct.Pin = W5500_MISO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始状态:CS高电平,SCK低电平
HAL_GPIO_WritePin(GPIOA, W5500_CS_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, W5500_SCK_PIN, GPIO_PIN_RESET);
}
2. SPI时序控制函数
// 发送1字节数据(MSB优先)
uint8_t W5500_WriteByte(uint8_t data) {
uint8_t rx_data = 0;
for(uint8_t i=0; i<8; i++) {
// 发送数据位
if(data & 0x80) HAL_GPIO_WritePin(GPIOA, W5500_MOSI_PIN, GPIO_PIN_SET);
else HAL_GPIO_WritePin(GPIOA, W5500_MOSI_PIN, GPIO_PIN_RESET);
// 生成SPI时钟(模式0:上升沿采样)
HAL_GPIO_WritePin(GPIOA, W5500_SCK_PIN, GPIO_PIN_SET);
HAL_Delay(1); // 50ns延时(根据系统时钟调整)
HAL_GPIO_WritePin(GPIOA, W5500_SCK_PIN, GPIO_PIN_RESET);
// 读取MISO数据
if(HAL_GPIO_ReadPin(GPIOA, W5500_MISO_PIN)) rx_data |= (1 << (7-i));
data <<= 1;
}
return rx_data;
}
// 读取1字节数据(带地址自动递增)
uint8_t W5500_ReadByte(uint16_t addr) {
// 发送地址高字节(控制位:读模式)
W5500_WriteByte(0x0F & (addr >> 8));
W5500_WriteByte(0xFF & (addr >> 0));
// 读取数据
return W5500_WriteByte(0xFF);
}
// 写入寄存器(带地址自动递增)
void W5500_WriteReg(uint16_t addr, uint8_t *buf, uint16_t len) {
// 发送地址高字节(控制位:写模式)
W5500_WriteByte(0x80 | (0x0F & (addr >> 8)));
W5500_WriteByte(0xFF & (addr >> 0));
// 写入数据
while(len--) {
W5500_WriteByte(*buf++);
}
}
三、W5500初始化流程
1. 网络参数配置
void W5500_Network_Init(void) {
uint8_t mac[6] = {0x00, 0x08, 0xDC, 0x11, 0x11, 0x11};
uint8_t ip[4] = {192, 168, 1, 100};
uint8_t subnet[4] = {255, 255, 255, 0};
uint8_t gateway[4] = {192, 168, 1, 1};
// 设置MAC地址
W5500_WriteReg(0x0001, mac, 6);
// 设置IP地址
W5500_WriteReg(0x0003, ip, 4);
W5500_WriteReg(0x0004, subnet, 4);
W5500_WriteReg(0x0005, gateway, 4);
// 启动网络协议栈
WIZCHIP_Init();
WIZCHIP_SetTimeout(50, 1000); // 超时设置
}
2. SPI模式配置
void W5500_SPI_Mode_Init(void) {
// 设置SPI模式0(CPOL=0, CPHA=0)
// 通过控制寄存器设置(需根据W5500手册调整)
W5500_WriteReg(0x001E, 0x00); // MR: SPI模式设置
}
参考代码 基于stm32f4平台的模拟SPI驱动W5500模块 www.youwenfan.com/contentcnm/71817.html
四、常见问题解决方案
| 问题现象 |
可能原因 |
解决方法 |
| SPI通信失败 |
片选信号未正确拉低 |
检查CS引脚电平及控制逻辑 |
| 无法读取芯片ID |
时钟频率过高 |
降低SPI时钟至1MHz以下 |
| 网络连接不稳定 |
电源滤波不良 |
增加0.1μF和10μF去耦电容 |
| 数据包丢失 |
中断未及时处理 |
启用EXTI中断并优化中断服务程序 |
五、调试工具配置
| 工具名称 |
型号 |
关键功能 |
| 逻辑分析仪 |
Saleae Logic 8 |
捕获SPI通信时序 |
| 网络分析仪 |
Keysight N9914A |
分析以太网信号质量 |
| 电流分析仪 |
Keysight CX3300 |
测量网络模块功耗 |
| 热成像仪 |
FLIR E5-XT |
检测芯片温度分布 |