高级会员

- 积分
- 545
- 金钱
- 545
- 注册时间
- 2026-1-29
- 在线时间
- 37 小时
|
发表于 2026-7-23 14:10:18
|
显示全部楼层
针对使用STM32F103与ENC28J60进行通讯测试时出现的MAC地址读取异常问题,结合你的代码现象(仅MAC[4]与写入值一致,其余为0),以下是分析及解决方案:
一、问题根源分析
Bank未正确切换:ENC28J60的MAC地址寄存器(MAADR0~MAADR5)位于Bank 3,需通过ECON1寄存器的BANK位切换至对应区域才能访问。若未正确切换Bank,读写操作会指向默认Bank 0或其他区域的寄存器,导致数据错乱。
SPI通信干扰:SPI时钟频率过高(超过20MHz)、时序不匹配或硬件连接不稳定(如CS引脚未拉高、线路干扰)可能导致数据传输错误。
初始化流程缺失:未完成接收缓冲区配置、MAC控制寄存器初始化等关键步骤,影响寄存器读写逻辑。
二、解决步骤
1. 确保正确切换Bank
在读写MAADRx寄存器前,需通过ECON1.BANK位切换至Bank 3:
// 切换到Bank 3(MAC地址寄存器所在区域)
ENC28J60_WriteReg(ECON1, 0x03); // ECON1.BANK = 0b11 (Bank 3)
2. 验证SPI通信稳定性
降低SPI速率:将SPI时钟分频调整为更低值(如SPI_BaudRatePrescaler_32),确保不超过20MHz。
添加延时:在每次SPI读写操作后插入短暂延时(如delay_us(10)),避免时序冲突。
检查硬件连接:确认CS、RST、INT引脚接线正确,且无虚焊或短路。
3. 完整初始化流程修正
参考以下标准化初始化代码,补充缺失环节:
uint8_t ENC28J60_Init(uint8_t* macaddr) {
// ... 复位和振荡器稳定等待 ...
// 配置接收缓冲区(关键步骤)
ENC28J60_WriteReg(ERXSTL, RXSTART_INIT & 0xFF);
ENC28J60_WriteReg(ERXSTH, RXSTART_INIT >> 8);
ENC28J60_WriteReg(ERXNDL, RXSTOP_INIT & 0xFF);
ENC28J60_WriteReg(ERXNDH, RXSTOP_INIT >> 8);
ENC28J60_WriteReg(ERXRDPTL, RXSTART_INIT & 0xFF);
ENC28J60_WriteReg(ERXRDPTH, RXSTART_INIT >> 8);
// 切换到Bank 3并设置MAC地址
ENC28J60_WriteReg(ECON1, 0x03); // Bank 3
ENC28J60_WriteReg(MAADR5, macaddr[0]);
ENC28J60_WriteReg(MAADR4, macaddr[1]);
ENC28J60_WriteReg(MAADR3, macaddr[2]);
ENC28J60_WriteReg(MAADR2, macaddr[3]);
ENC28J60_WriteReg(MAADR1, macaddr[4]);
ENC28J60_WriteReg(MAADR0, macaddr[5]);
// 启用接收过滤器和中断
ENC28J60_WriteReg(ERXFCON, ERXFCON_UCEN | ERXFCON_CRCEN | ERXFCON_BCEN);
ENC28J60_WriteReg(EIE, EIE_INTIE | EIE_PKTIE);
// 启用接收功能
ENC28J60_WriteReg(ECON1, ECON1_RXEN);
}
4. 调试建议
寄存器回读验证:在初始化后立即读取EREVID寄存器(地址0x12),确认芯片型号匹配(正常值为0x05或0x06)。
逻辑分析仪抓包:抓取SPI波形,验证命令字节(0x40/0x00)和数据字节是否符合预期。
简化测试场景:暂时关闭中断和非必要功能,仅保留MAC地址读写测试。 |
|