OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 375|回复: 2

求助用103与ENC28J60做通讯测试。

[复制链接]

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2026-2-9
在线时间
29 小时
发表于 2026-7-22 20:17:31 | 显示全部楼层 |阅读模式
1金钱

        if(ENC28J60_Init())return 2;                //初始化ENC28J60
       
       
        mac[5]=ENC28J60_Read(MAADR5);
        mac[4]=ENC28J60_Read(MAADR4);
        mac[3]=ENC28J60_Read(MAADR3);       
        mac[2]=ENC28J60_Read(MAADR2);       
        mac[1]=ENC28J60_Read(MAADR1);       
        mac[0]=ENC28J60_Read(MAADR0);       
初始化成功后随即读MAAD5-0的内容与写入相差太大。还一个很规律的就是读出的MAC[4]的值与MAADR5写入值一样,别的值是0

也太奇怪了。是个什么情况。是我的操作有问题吗?读取操作要设置什么???????

回复

使用道具 举报

0

主题

107

帖子

0

精华

高级会员

Rank: 4

积分
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地址读写测试。
回复

使用道具 举报

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2026-2-9
在线时间
29 小时
 楼主| 发表于 2026-7-23 17:56:26 | 显示全部楼层
664929323 发表于 2026-7-23 14:10
针对使用STM32F103与ENC28J60进行通讯测试时出现的MAC地址读取异常问题,结合你的代码现象(仅MAC[4]与写入 ...

别的寄存器读写正常
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-8-5 00:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表