搜索
bottom↓
回复: 8

ENC28J60在机器运行中IP PING不通,重启后机器正常且PING通?

[复制链接]

出0入10汤圆

发表于 2020-7-4 12:12:41 | 显示全部楼层 |阅读模式
ENC28J60在机器运行中IP PING不通,但在重启后机器后又运行正常,ENC28J60控制板的IP也是可以PING通了。请教下这是什么原因?
IP PING不通后的寄存器的读取数据和重启后IP PING通后的寄存器的读取数据,不一样,请问下是什么原因改变了寄存器的数据?请各位大神指教,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入89汤圆

发表于 2020-7-4 14:12:22 来自手机 | 显示全部楼层
放代码上来,给大家分析,其实可以用w5500

出0入10汤圆

 楼主| 发表于 2020-7-4 14:26:01 | 显示全部楼层
youkebing 发表于 2020-7-4 14:12
放代码上来,给大家分析,其实可以用w5500

出现问题后,我把寄存器的值读取了一下:
HFRevID: 0x06
Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
       0x00  0x80  0x13  0x00  0x00
MAC  : MACON1 MACON3 MACON4
       0x00   0x00   0x00
Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
       0x05fa 0x1fff 0x0000  0x05fa  0xa1    0x00    0x0600
Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
       0x0000 0x1a4d 0x0f     0x37     0x10

重启正常后寄存器的读取数:
enc28j60 registers:
HFRevID: 0x06
Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
       0x04  0x80  0x01  0x00  0xcb
MAC  : MACON1 MACON3 MACON4
       0x0d   0x33   0x40
Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
       0x0000 0x19fe 0x0000  0x19fe  0xa1    0x00    0x05ee
Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
       0x19ff 0x1fff 0x0f     0x3f     0x10

从芯片读出来的寄存器可以看出,芯片的寄存器被修改了,我想找到这个问题的根本原因?请大神指教,谢谢!

出0入0汤圆

发表于 2020-7-4 15:19:01 | 显示全部楼层
程序跑飞了吧?不好猜,建议贴代码

出0入0汤圆

发表于 2020-7-4 21:33:59 | 显示全部楼层
记得之前用的时候,连续通讯会出现无法收到数据的情况,看看勘误手册有没有
  1. /******************************************************************
  2. *Function   :  Enc28j60PacketReceive
  3. *Description:  Enc28j60接收以太包
  4. *Input      :  packet:接收数据指针  len:数据长度
  5. *Output     :  NULL
  6. *Return     :  NULL
  7. *Others     :  NULL
  8. ******************************************************************/
  9. u16_t Enc28j60PacketReceive(u8_t *packet,u16_t maxlen)
  10. {
  11.     u16_t rxstat;
  12.     u16_t len;
  13.     u16_t rs,re;
  14.     u8_t temp;

  15.     if( Enc28j60Read(EIR) & EIR_RXERIF )
  16.         {//判断接收缓冲有无溢出,清理标志.
  17.                 // 跳转回BANK0,写0清标记.                 
  18.                 Enc28j60Bank = 0;
  19.                 Enc28j60SetBank(ECON1);       
  20.                 Enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_RXEN);       
  21.                 Enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, EIR, EIR_RXERIF);       
  22.         Enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
  23.     }

  24.     // 1.检测是否接收到数据包.
  25.     if( !(Enc28j60Read(EIR) & EIR_PKTIF) )
  26.     {// 勘误:单检测 EIR_PKTIF 并不可靠 双重检测: EPKTCNT.
  27.         if (Enc28j60Read(EPKTCNT) == 0x00) return 0;
  28.     }
  29.          
  30.         // 设置接收缓存 读取指针 不使用temp中间变量来设置似乎有问题,IDE编译时强制转换不同?.
  31.         // Enc28j60Write(ERDPTL, (u8_t)(NextPacketPtr));.
  32.         // Enc28j60Write(ERDPTH, (u8_t)(NextPacketPtr>>8));
  33.         temp = (u8_t)(NextPacketPtr);
  34.         Enc28j60Write(ERDPTL,temp);
  35.         temp = (u8_t)(NextPacketPtr>>8);   
  36.         Enc28j60Write(ERDPTH,temp);
  37.        
  38.     // 2.读取下一包的起始指针  <低字节在前> .
  39.     temp  = Enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
  40.     NextPacketPtr = Enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
  41.     NextPacketPtr <<= 8;
  42.     NextPacketPtr |= temp;

  43.     // 3.读取以太包的长度 <status[15..0]低字节在前>.
  44.     // 注:Wireshark监控 一帧APR时,长度是42字节;.
  45.     //     ENC28J60在这里读取的长度是60字节,结果是正常的,42+14(空数据)+4CRC.
  46.         temp = Enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
  47.         len  = Enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
  48.         len <<= 8;
  49.         len &= 0xff00;
  50.         len |= temp;
  51.     len -= 4; //减去4字节CRC.
  52.          
  53.     // 4.读取以太包的状态<status[15..0]低字节在前>.
  54.         temp   = Enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
  55.         rxstat = Enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
  56.         rxstat <<= 8;
  57.         rxstat |= temp;

  58.     // 最小长度判断(we reduce the MAC-reported length by 4 to remove the CRC).
  59.         len = MIN(len,maxlen);
  60.        
  61.         // 5.检测接收是否OK,拷贝出以太网数据.
  62.         if ((rxstat & 0x80)==0)len=0;
  63.         else Enc28j60ReadBuffer(packet,len);
  64.        
  65.     // .6.前移读指针到下一帧前,释放已读取缓冲(5.读数据过程中,ERXRDPTL没有增加).
  66.     // .注意:必须先写数据到ERXRDPTL,再写数据到ERXRDPTH才能正确设置该寄存器 Datasheet45页.
  67.     // .     前移无需考虑边界.没有释放缓,缓冲溢出会导致无法接收数据.
  68.     //【ENC28J60勘误手册】 14.  Module:  Memory (Ethernet Buffer).
  69.     rs = Enc28j60Read(ERXSTH);
  70.         rs <<= 8;
  71.         rs |= Enc28j60Read(ERXSTL);
  72.        
  73.         re = Enc28j60Read(ERXNDH);
  74.         re <<= 8;
  75.         re |= Enc28j60Read(ERXNDL);
  76.         if (NextPacketPtr - 1 < rs || NextPacketPtr - 1 > re)
  77.         {//检测有无跨界.
  78.                 temp = (u8_t)re;           
  79.             Enc28j60Write(ERXRDPTL, temp);
  80.             temp = (u8_t)(re>>8);
  81.             Enc28j60Write(ERXRDPTH, temp);
  82.         }
  83.         else
  84.         {
  85.                 temp = (u8_t)(NextPacketPtr-1);           
  86.             Enc28j60Write(ERXRDPTL, temp);
  87.             temp = (u8_t)((NextPacketPtr-1)>>8);
  88.             Enc28j60Write(ERXRDPTH, temp);
  89.         }
  90.        

  91.     // 7. 数据包个数递减位EPKTCNT减1.
  92.     Enc28j60Bank = 0;
  93.     Enc28j60SetBank(ECON1);
  94.     Enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC);
  95.              
  96.     return len;
  97. }
复制代码

出100入101汤圆

发表于 2020-7-5 07:55:08 来自手机 | 显示全部楼层
j60的bug不少

出0入10汤圆

 楼主| 发表于 2020-7-5 09:24:24 | 显示全部楼层
duanll 发表于 2020-7-4 15:19
程序跑飞了吧?不好猜,建议贴代码

您好!出现问题后,我把寄存器的值读取了一下:
HFRevID: 0x06
Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
       0x00  0x80  0x13  0x00  0x00
MAC  : MACON1 MACON3 MACON4
       0x00   0x00   0x00
Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
       0x05fa 0x1fff 0x0000  0x05fa  0xa1    0x00    0x0600
Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
       0x0000 0x1a4d 0x0f     0x37     0x10

重启正常后寄存器的读取数:
enc28j60 registers:
HFRevID: 0x06
Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
       0x04  0x80  0x01  0x00  0xcb
MAC  : MACON1 MACON3 MACON4
       0x0d   0x33   0x40
Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
       0x0000 0x19fe 0x0000  0x19fe  0xa1    0x00    0x05ee
Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
       0x19ff 0x1fff 0x0f     0x3f     0x10

从芯片读出来的寄存器可以看出,芯片的寄存器被修改了,我想找到这个问题的根本原因?请大神指教,谢谢!

出0入10汤圆

 楼主| 发表于 2020-7-5 09:25:27 | 显示全部楼层
linjunxiong 发表于 2020-7-4 21:33
记得之前用的时候,连续通讯会出现无法收到数据的情况,看看勘误手册有没有
...

您好!出现问题后,我把寄存器的值读取了一下:
HFRevID: 0x06
Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
       0x00  0x80  0x13  0x00  0x00
MAC  : MACON1 MACON3 MACON4
       0x00   0x00   0x00
Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
       0x05fa 0x1fff 0x0000  0x05fa  0xa1    0x00    0x0600
Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
       0x0000 0x1a4d 0x0f     0x37     0x10

重启正常后寄存器的读取数:
enc28j60 registers:
HFRevID: 0x06
Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
       0x04  0x80  0x01  0x00  0xcb
MAC  : MACON1 MACON3 MACON4
       0x0d   0x33   0x40
Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
       0x0000 0x19fe 0x0000  0x19fe  0xa1    0x00    0x05ee
Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
       0x19ff 0x1fff 0x0f     0x3f     0x10

从芯片读出来的寄存器可以看出,芯片的寄存器被修改了,我想找到这个问题的根本原因?请大神指教,谢谢!

出0入0汤圆

发表于 2020-7-7 16:47:04 | 显示全部楼层
prk1688 发表于 2020-7-5 09:25
您好!出现问题后,我把寄存器的值读取了一下:
HFRevID: 0x06
Cntrl: ECON1 ECON2 ESTAT  EIR  EIE

14年的东西,细节现在没法想起来了,建议找下E文版的勘误手册看看,也可以试下w5500,相对没那么多奇奇怪怪的现象。
话说这2个东西到现在还没停产?14年的时候已经是比较老的物料了,小心调试好物料不好采购
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 16:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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