天线|RF射频
直播中

杨波

7年用户 155经验值
私信 关注
[问答]

为什么32网络通信过程中第一个时钟无法稳定?

最近正在看32以太网通信的问题,用的开发板上的ENC28J60模块。然后把商家的例程烧进去后发现ENC28J60_Init里的第一个时钟稳定就卡住了。请问大家知道是什么问题么?
贴上
u8 ENC28J60_Init(u8* macaddr)
{               
        u16 retry=0;                  
        ENC28J60_Reset();
        ENC28J60_Write_Op(ENC28J60_SOFT_RESET,0,ENC28J60_SOFT_RESET);//软件复位
        while(!(ENC28J60_Read(ESTAT)&ESTAT_CLKRDY))//等待始终稳定
        {
                retry++;
                delay_ms(1);
        };
        if(retry>=500)return 1;//ENC28J60初始化失败                          //截止到这里就出问题了,下面可不看
        // do bank 0 stuff
        // initialize receive buffer
        // 16-bit transfers,must write low byte first
        // set receive buffer start address           éèÖýóêÕ»o3åÇøμØÖ·  8K×Ö½úèYá¿
        NextPacketPtr=RXSTART_INIT;
        // Rx start
        //½óêÕ»o3åÆ÷óéò»¸öó2¼t1üàíμÄÑ-»·FIFO »o3åÆ÷113é¡£
        //¼Ä′æÆ÷¶ÔERXSTH:ERXSTL oíERXNDH:ERXNDL ×÷
        //ÎaÖ¸Õ룬¶¨òå»o3åÆ÷μÄèYá¿oíÆäÔú′æ′¢Æ÷ÖDμÄλÖá£
        //ERXSToíERXNDÖ¸ÏòμÄ×Ö½ú¾ù°üo¬ÔúFIFO»o3åÆ÷Äú¡£
        //μ±′óòÔì«íø½ó¿ú½óêÕêy¾Y×Ö½úê±£¬ÕaD©×Ö½ú±»Ë3DòD′èë
        //½óêÕ»o3åÆ÷¡£ μ«êÇμ±D′èëóéERXND Ö¸ÏòμÄ′æ′¢μ¥Ôa
        //oó£¬ó2¼t»á×Ô¶ˉ½«½óêÕμÄÏÂò»×Ö½úD′èëóéERXST Ö¸Ïò
        //μÄ′æ′¢μ¥Ôa¡£ òò′˽óêÕó2¼t½«2»»áD′èëFIFO òÔíaμÄμ¥
        //Ôa¡£
        //éèÖýóêÕÆeê¼×Ö½ú
        ENC28J60_Write(ERXSTL,RXSTART_INIT&0xFF);        
        ENC28J60_Write(ERXSTH,RXSTART_INIT>>8);         
        //ERXWRPTH:ERXWRPTL ¼Ä′æÆ÷¶¨òåó2¼tÏòFIFO ÖD
        //μÄÄĸöλÖÃD′èëÆä½óêÕμ½μÄ×Ö½ú¡£ Ö¸ÕëêÇÖ»¶áμÄ£¬Ôú3é
        //1|½óêÕμ½ò»¸öêy¾Y°üoó£¬ó2¼t»á×Ô¶ˉ¸üDÂÖ¸Õë¡£ Ö¸Õë¿é
        //óÃóúÅD¶ÏFIFO Äúê£óà¿Õ¼äμÄ′óD¡  8K-1500¡£
        //éèÖýóêÕ¶áÖ¸Õë×Ö½ú
        ENC28J60_Write(ERXRDPTL,RXSTART_INIT&0xFF);
        ENC28J60_Write(ERXRDPTH,RXSTART_INIT>>8);
        //éèÖýóêÕ½áêø×Ö½ú
        ENC28J60_Write(ERXNDL,RXSTOP_INIT&0xFF);
        ENC28J60_Write(ERXNDH,RXSTOP_INIT>>8);
        //éèÖ÷¢ËíÆeê¼×Ö½ú
        ENC28J60_Write(ETXSTL,TXSTART_INIT&0xFF);
        ENC28J60_Write(ETXSTH,TXSTART_INIT>>8);
        //éèÖ÷¢Ëí½áêø×Ö½ú
        ENC28J60_Write(ETXNDL,TXSTOP_INIT&0xFF);
        ENC28J60_Write(ETXNDH,TXSTOP_INIT>>8);
        // do bank 1 stuff,packet filter:
        // For broadcast packets we allow only ARP packtets
        // All other packets should be unicast only for our mac (MAADR)
        //
        // The pattern to match on is therefore
        // Type     ETH.DST
        // ARP      BROADCAST
        // 06 08 -- ff ff ff ff ff ff -> ip checksum for theses bytes=f7f9
        // in binary these poitions are:11 0000 0011 1111
        // This is hex 303F->EPMM0=0x3f,EPMM1=0x30
        //½óêÕ1yÂËÆ÷
        //UCEN£oμ¥2¥1yÂËÆ÷ê1Äüλ
        //μ±ANDOR = 1 ê±£o
        //1 = Ä¿±êμØÖ·óë±¾μØMAC μØÖ·2»Æ¥ÅäμÄêy¾Y°ü½«±»¶aÆú
        //0 = ½ûÖ11yÂËÆ÷
        //μ±ANDOR = 0 ê±£o
        //1 = Ä¿±êμØÖ·óë±¾μØMAC μØÖ·Æ¥ÅäμÄêy¾Y°ü»á±»½óêü
        //0 = ½ûÖ11yÂËÆ÷
        //CRCEN£ooó1yÂËÆ÷CRC D£Ñéê1Äüλ
        //1 = ËùóDCRC ÎTD§μÄêy¾Y°ü¶¼½«±»¶aÆú
        //0 = 2»¿¼ÂÇCRC êÇ·ñóDD§
        //PMEN£o¸ñê½Æ¥Åä1yÂËÆ÷ê1Äüλ
        //μ±ANDOR = 1 ê±£o
        //1 = êy¾Y°ü±ØDë·ûoϸñê½Æ¥Åäìõ¼t£¬·ñÔò½«±»¶aÆú
        //0 = ½ûÖ11yÂËÆ÷
        //μ±ANDOR = 0 ê±£o
        //1 = ·ûoϸñê½Æ¥Åäìõ¼tμÄêy¾Y°ü½«±»½óêü
        //0 = ½ûÖ11yÂËÆ÷
        ENC28J60_Write(ERXFCON,ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);
        ENC28J60_Write(EPMM0,0x3f);
        ENC28J60_Write(EPMM1,0x30);
        ENC28J60_Write(EPMCSL,0xf9);
        ENC28J60_Write(EPMCSH,0xf7);
        // do bank 2 stuff
        // enable MAC receive
        //bit 0 MARXEN£oMAC ½óêÕê1Äüλ
        //1 = ÔêDíMAC ½óêÕêy¾Y°ü
        //0 = ½ûÖ1êy¾Y°ü½óêÕ
        //bit 3 TXPAUS£oÔYí£¿ØÖÆÖ¡·¢Ëíê1Äüλ
        //1 = ÔêDíMAC ·¢ËíÔYí£¿ØÖÆÖ¡£¨óÃóúè«Ë«1¤Ä£ê½ÏÂμÄá÷á¿¿ØÖÆ£©
        //0 = ½ûÖ1ÔYí£Ö¡·¢Ëí
        //bit 2 RXPAUS£oÔYí£¿ØÖÆÖ¡½óêÕê1Äüλ
        //1 = μ±½óêÕμ½ÔYí£¿ØÖÆÖ¡ê±£¬½ûÖ1·¢Ëí£¨Õy3£2ù×÷£©
        //0 = oöÂÔ½óêÕμ½μÄÔYí£¿ØÖÆÖ¡
        ENC28J60_Write(MACON1,MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
        // bring MAC out of reset
        //½«MACON2 ÖDμÄMARST λÇåá㣬ê1MAC íË3ö¸′λ×′쬡£
        ENC28J60_Write(MACON2,0x00);
        // enable automatic padding to 60bytes and CRC operations
        //bit 7-5 PADCFG2ACDFG0£o×Ô¶ˉìî3äoíCRC ÅäÖÃλ
        //111 = óÃ0 ìî3äËùóD¶ìÖ¡Öá64 ×Ö½ú3¤£¬2¢×·¼óò»¸öóDD§μÄCRC
        //110 = 2»×Ô¶ˉìî3ä¶ìÖ¡
        //101 = MAC ×Ô¶ˉ¼ì2a¾ßóD8100h ààDí×Ö¶ÎμÄVLAN D-òéÖ¡£¬2¢×Ô¶ˉìî3äμ½64 ×Ö½ú3¤¡£èç1û2»
        //êÇVLAN Ö¡£¬Ôòìî3äÖá60 ×Ö½ú3¤¡£ìî3äoó»1òa×·¼óò»¸öóDD§μÄCRC
        //100 = 2»×Ô¶ˉìî3ä¶ìÖ¡
        //011 = óÃ0 ìî3äËùóD¶ìÖ¡Öá64 ×Ö½ú3¤£¬2¢×·¼óò»¸öóDD§μÄCRC
        //010 = 2»×Ô¶ˉìî3ä¶ìÖ¡
        //001 = óÃ0 ìî3äËùóD¶ìÖ¡Öá60 ×Ö½ú3¤£¬2¢×·¼óò»¸öóDD§μÄCRC
        //000 = 2»×Ô¶ˉìî3ä¶ìÖ¡
        //bit 4 TXCRCEN£o·¢ËíCRC ê1Äüλ
        //1 = 2»1üPADCFGèçoΣ¬MAC¶¼»áÔú·¢ËíÖ¡μÄÄ©Î2×·¼óò»¸öóDD§μÄCRC¡£ èç1ûADCFG1涨òa
        //×·¼óóDD§μÄCRC£¬Ôò±ØD뽫TXCRCEN ÖÃ1¡£
        //0 = MAC2»»á×·¼óCRC¡£ ¼ì2é×îoó4 ¸ö×Ö½ú£¬èç1û2»êÇóDD§μÄCRC Ôò±¨¸æ¸ø·¢Ëí×′ì¬Ïòá¿¡£
        //bit 0 FULDPX£oMAC è«Ë«1¤ê1Äüλ
        //1 = MAC1¤×÷Ôúè«Ë«1¤Ä£ê½Ï¡£ PHCON1.PDPXMD λ±ØDëÖÃ1¡£
        //0 = MAC1¤×÷Ôú°ëË«1¤Ä£ê½Ï¡£ PHCON1.PDPXMD λ±ØDëÇåáã¡£
        ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,MACON3,MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN|MACON3_FULDPX);
        // set inter-frame gap (non-back-to-back)
        //ÅäÖ÷DZ3¶Ô±3°ü¼ä¼ä¸ô¼Ä′æÆ÷μÄμí×Ö½ú
        //MAIPGL¡£ ′ó¶àêyó|óÃê1óÃ12h ±à3ì¸Ã¼Ä′æÆ÷¡£
        //èç1ûê1óðëË«1¤Ä£ê½£¬ó|±à3ì·Ç±3¶Ô±3°ü¼ä¼ä¸ô
        //¼Ä′æÆ÷μĸß×Ö½úMAIPGH¡£ ′ó¶àêyó|óÃê1óÃ0Ch
        //±à3ì¸Ã¼Ä′æÆ÷¡£
        ENC28J60_Write(MAIPGL,0x12);
        ENC28J60_Write(MAIPGH,0x0C);
        // set inter-frame gap (back-to-back)
        //ÅäÖñ3¶Ô±3°ü¼ä¼ä¸ô¼Ä′æÆ÷MABBIPG¡£μ±ê1óÃ
        //è«Ë«1¤Ä£ê½ê±£¬′ó¶àêyó|óÃê1óÃ15h ±à3ì¸Ã¼Ä′æ
        //Æ÷£¬¶øê1óðëË«1¤Ä£ê½ê±Ôòê1óÃ12h ½øDD±à3ì¡£
        ENC28J60_Write(MABBIPG,0x15);
        // Set the maximum packet size which the controller will accept
        // Do not send packets longer than MAX_FRAMELEN:
        // ×î′óÖ¡3¤¶è  1500
        ENC28J60_Write(MAMXFLL,MAX_FRAMELEN&0xFF);        
        ENC28J60_Write(MAMXFLH,MAX_FRAMELEN>>8);
        // do bank 3 stuff
        // write MAC address
        // NOTE: MAC address in ENC28J60 is byte-backward
        //éèÖÃMACμØÖ·
        ENC28J60_Write(MAADR5,macaddr[0]);        
        ENC28J60_Write(MAADR4,macaddr[1]);
        ENC28J60_Write(MAADR3,macaddr[2]);
        ENC28J60_Write(MAADR2,macaddr[3]);
        ENC28J60_Write(MAADR1,macaddr[4]);
        ENC28J60_Write(MAADR0,macaddr[5]);
        //ÅäÖÃHYÎaè«Ë«1¤  LEDBÎaà-μçá÷
        ENC28J60_PHY_Write(PHCON1,PHCON1_PDPXMD);         
        // no loopback of transmitted frames         ½ûÖ1»·»Ø
        //HDLDIS£oPHY °ëË«1¤»·»Ø½ûÖ1λ
        //μ±PHCON1.PDPXMD = 1 »òPHCON1.PLOOPBK = 1 ê±£o
        //′Ëλ¿é±»oöÂÔ¡£
        //μ±PHCON1.PDPXMD = 0 ÇòPHCON1.PLOOPBK = 0 ê±£o
        //1 = òa·¢ËíμÄêy¾Y½öí¨1yË«½êÏß½ó¿ú·¢3ö
        //0 = òa·¢ËíμÄêy¾Y»á»·»Øμ½MAC 2¢í¨1yË«½êÏß½ó¿ú·¢3ö
        ENC28J60_PHY_Write(PHCON2,PHCON2_HDLDIS);
        // switch to bank 0
        //ECON1 ¼Ä′æÆ÷
        //¼Ä′æÆ÷3-1 Ëùê¾ÎaECON1 ¼Ä′æÆ÷£¬ËüóÃóú¿ØÖÆ
        //ENC28J60 μÄÖ÷òa1|Äü¡£ ECON1 ÖD°üo¬½óêÕê1Äü¡¢·¢
        //ËíÇëÇó¡¢DMA ¿ØÖÆoí′æ′¢ÇøÑ¡Ôñλ¡£           
        ENC28J60_Set_Bank(ECON1);
        // enable interrutps
        //EIE£o òÔì«íøÖD¶ÏÔêDí¼Ä′æÆ÷
        //bit 7 INTIE£o 諾ÖINT ÖD¶ÏÔêDíλ
        //1 = ÔêDíÖD¶Ïê¼tÇy¶ˉINT òy½Å
        //0 = ½ûÖ1ËùóDINT òy½ÅμÄ»î¶ˉ£¨òy½Åê¼ÖÕ±»Çy¶ˉÎa¸ßμçƽ£©
        //bit 6 PKTIE£o ½óêÕêy¾Y°ü′y′|àíÖD¶ÏÔêDíλ
        //1 = ÔêDí½óêÕêy¾Y°ü′y′|àíÖD¶Ï
        //0 = ½ûÖ1½óêÕêy¾Y°ü′y′|àíÖD¶Ï
        ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,EIE,EIE_INTIE|EIE_PKTIE);
        // enable packet reception
        //bit 2 RXEN£o½óêÕê1Äüλ
        //1 = í¨1yμ±Ç°1yÂËÆ÷μÄêy¾Y°ü½«±»D′èë½óêÕ»o3åÆ÷
        //0 = oöÂÔËùóD½óêÕμÄêy¾Y°ü
        ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,ECON1,ECON1_RXEN);
        if(ENC28J60_Read(MAADR5)== macaddr[0])return 0;//3õê¼»ˉ3é1|
        else return 2;           
}

回帖(1)

李景天

2019-10-24 08:32:20
        while(!(ENC28J60_Read(ESTAT)&ESTAT_CLKRDY))//等待时钟稳定
        {
                retry++;
                delay_ms(1);
        };
程序还是能运行的,就是这里一直加
举报

更多回帖

发帖
×
20
完善资料,
赚取积分