极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20604|回复: 6

enc28j60+ethercard库的一使用上的改变和问题

[复制链接]
发表于 2012-9-27 14:35:52 | 显示全部楼层 |阅读模式
本帖最后由 坤遠遊森林 于 2012-9-28 13:16 编辑

之前用etherShield的库,跑通程序和硬件。

看了一下现在比较新的ethercard库,感觉调用函数的语句更精炼,阅读更方便,所以想使用这个库。
但是在运行Ethercard库的示例,上机无力。http://www.geek-workshop.com/thread-2044-1-1.html。具体为网络灯不亮,更像是中断/片选这类的问题。

所以翻阅比较了一下etherShield和ethercard里面的构建函数
发现:
etherShield里的enc28j60.h
  1. #define ENC28J60_CONTROL_CS     10
  2. #define SPI_MOSI                                11
  3. #define SPI_MISO                                12
  4. #define SPI_SCK                                        13
  5. ...
  6. ..
  7. ..

  8. void enc28j60Init(uint8_t* macaddr)
  9. {
  10.         // initialize I/O
  11.         // ss as output:
  12.         pinMode(ENC28J60_CONTROL_CS, OUTPUT);
  13.         CSPASSIVE; // ss=0
  14.         //       
  15.         pinMode(SPI_MOSI, OUTPUT);
  16.        
  17.         pinMode(SPI_SCK, OUTPUT);
  18.        
  19.         pinMode(SPI_MISO, INPUT);
  20.        
  21.        
  22.         digitalWrite(SPI_MOSI, LOW);
  23.        
  24.         digitalWrite(SPI_SCK, LOW);
  25.        
  26.         /*DDRB  |= 1<<PB3 | 1<<PB5; // mosi, sck output
  27.         cbi(DDRB,PINB4); // MISO is input
  28.         //
  29.         cbi(PORTB,PB3); // MOSI low
  30.         cbi(PORTB,PB5); // SCK low
  31.   */
  32.         //
  33.         // initialize SPI interface
  34.         // master mode and Fosc/2 clock:
  35.         SPCR = (1<<SPE)|(1<<MSTR);
  36.         SPSR |= (1<<SPI2X);
  37.         // perform system reset
  38.         enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);
  39.         delay(50);
  40.         // check CLKRDY bit to see if reset is complete
  41.         // The CLKRDY does not work. See Rev. B4 Silicon Errata point. Just wait.
  42.         //while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY));
  43.         // do bank 0 stuff
  44.         // initialize receive buffer
  45.         // 16-bit transfers, must write low byte first
  46.         // set receive buffer start address
  47.         NextPacketPtr = RXSTART_INIT;
  48.         // Rx start
  49.         enc28j60Write(ERXSTL, RXSTART_INIT&0xFF);
  50.         enc28j60Write(ERXSTH, RXSTART_INIT>>8);
  51.         // set receive pointer address
  52.         enc28j60Write(ERXRDPTL, RXSTART_INIT&0xFF);
  53.         enc28j60Write(ERXRDPTH, RXSTART_INIT>>8);
  54.         // RX end
  55.         enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);
  56.         enc28j60Write(ERXNDH, RXSTOP_INIT>>8);
  57.         // TX start
  58.         enc28j60Write(ETXSTL, TXSTART_INIT&0xFF);
  59.         enc28j60Write(ETXSTH, TXSTART_INIT>>8);
  60.         // TX end
  61.         enc28j60Write(ETXNDL, TXSTOP_INIT&0xFF);
  62.         enc28j60Write(ETXNDH, TXSTOP_INIT>>8);
  63.         // do bank 1 stuff, packet filter:
  64.         // For broadcast packets we allow only ARP packtets
  65.         // All other packets should be unicast only for our mac (MAADR)
  66.         //
  67.         // The pattern to match on is therefore
  68.         // Type     ETH.DST
  69.         // ARP      BROADCAST
  70.         // 06 08 -- ff ff ff ff ff ff -> ip checksum for theses bytes=f7f9
  71.         // in binary these poitions are:11 0000 0011 1111
  72.         // This is hex 303F->EPMM0=0x3f,EPMM1=0x30
  73.         enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);
  74.         enc28j60Write(EPMM0, 0x3f);
  75.         enc28j60Write(EPMM1, 0x30);
  76.         enc28j60Write(EPMCSL, 0xf9);
  77.         enc28j60Write(EPMCSH, 0xf7);
  78.         //
  79.         //
  80.         // do bank 2 stuff
  81.         // enable MAC receive
  82.         enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
  83.         // bring MAC out of reset
  84.         enc28j60Write(MACON2, 0x00);
  85.         // enable automatic padding to 60bytes and CRC operations
  86.         enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
  87.         // set inter-frame gap (non-back-to-back)
  88.         enc28j60Write(MAIPGL, 0x12);
  89.         enc28j60Write(MAIPGH, 0x0C);
  90.         // set inter-frame gap (back-to-back)
  91.         enc28j60Write(MABBIPG, 0x12);
  92.         // Set the maximum packet size which the controller will accept
  93.         // Do not send packets longer than MAX_FRAMELEN:
  94.         enc28j60Write(MAMXFLL, MAX_FRAMELEN&0xFF);       
  95.         enc28j60Write(MAMXFLH, MAX_FRAMELEN>>8);
  96.         // do bank 3 stuff
  97.         // write MAC address
  98.         // NOTE: MAC address in ENC28J60 is byte-backward
  99.         enc28j60Write(MAADR5, macaddr[0]);
  100.         enc28j60Write(MAADR4, macaddr[1]);
  101.         enc28j60Write(MAADR3, macaddr[2]);
  102.         enc28j60Write(MAADR2, macaddr[3]);
  103.         enc28j60Write(MAADR1, macaddr[4]);
  104.         enc28j60Write(MAADR0, macaddr[5]);
  105.         // no loopback of transmitted frames
  106.         enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);
  107.         // switch to bank 0
  108.         enc28j60SetBank(ECON1);
  109.         // enable interrutps
  110.         enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
  111.         // enable packet reception
  112.         enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
  113. }
复制代码


和 ethercard里的<enc28j60.cpp>
  1. void ENC28J60::initSPI () {
  2. #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  3.     const byte SPI_SS   = 53;
  4.     const byte SPI_MOSI = 51;
  5.     const byte SPI_MISO = 50;
  6.     const byte SPI_SCK  = 52;
  7. #else
  8.     const byte SPI_SS   = 10;
  9.     const byte SPI_MOSI = 11;
  10.     const byte SPI_MISO = 12;
  11.     const byte SPI_SCK  = 13;
  12. #endif
  13.    
  14.     pinMode(SPI_SS, OUTPUT);
  15.     pinMode(SPI_MOSI, OUTPUT);
  16.     pinMode(SPI_SCK, OUTPUT);   
  17.     pinMode(SPI_MISO, INPUT);
  18.    
  19.     digitalWrite(SPI_MOSI, HIGH);
  20.     digitalWrite(SPI_MOSI, LOW);
  21.     digitalWrite(SPI_SCK, LOW);

  22.     SPCR = bit(SPE) | bit(MSTR); // 8 MHz @ 16
  23.     bitSet(SPSR, SPI2X);
  24. }
  25. ...
  26. ...
  27. ...
  28. byte ENC28J60::initialize (word size, const byte* macaddr, byte csPin) {
  29.     bufferSize = size;
  30.     if (bitRead(SPCR, SPE) == 0)
  31.       initSPI();
  32.     selectBit = csPin - 8;  
  33.     bitSet(DDRB, selectBit);
  34.     disableChip();
  35.    
  36.     writeOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);
  37.     delay(2); // errata B7/2
  38.     while (!readOp(ENC28J60_READ_CTRL_REG, ESTAT) & ESTAT_CLKRDY)
  39.         ;
  40.         
  41.     gNextPacketPtr = RXSTART_INIT;
  42.     writeReg(ERXST, RXSTART_INIT);
  43.     writeReg(ERXRDPT, RXSTART_INIT);
  44.     writeReg(ERXND, RXSTOP_INIT);
  45.     writeReg(ETXST, TXSTART_INIT);
  46.     writeReg(ETXND, TXSTOP_INIT);
  47.     enableBroadcast(); // change to add ERXFCON_BCEN recommended by epam
  48.     writeReg(EPMM0, 0x303f);
  49.     writeReg(EPMCS, 0xf7f9);
  50.     writeRegByte(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
  51.     writeRegByte(MACON2, 0x00);
  52.     writeOp(ENC28J60_BIT_FIELD_SET, MACON3,
  53.                         MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
  54.     writeReg(MAIPG, 0x0C12);
  55.     writeRegByte(MABBIPG, 0x12);
  56.     writeReg(MAMXFL, MAX_FRAMELEN);  
  57.     writeRegByte(MAADR5, macaddr[0]);
  58.     writeRegByte(MAADR4, macaddr[1]);
  59.     writeRegByte(MAADR3, macaddr[2]);
  60.     writeRegByte(MAADR2, macaddr[3]);
  61.     writeRegByte(MAADR1, macaddr[4]);
  62.     writeRegByte(MAADR0, macaddr[5]);
  63.     writePhy(PHCON2, PHCON2_HDLDIS);
  64.     SetBank(ECON1);
  65.     writeOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
  66.     writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);

  67.     byte rev = readRegByte(EREVID);
  68.     // microchip forgot to step the number on the silcon when they
  69.     // released the revision B7. 6 is now rev B7. We still have
  70.     // to see what they do when they release B8. At the moment
  71.     // there is no B8 out yet
  72.     if (rev > 5) ++rev;
  73.     return rev;
  74. }
复制代码


以及ethercard里的<enc28j60.c>
  1.   static uint8_t initialize (const uint16_t size, const uint8_t* macaddr,
  2.                              uint8_t csPin =8);
  3. ...
  4. ...
  5. ...


  6.   static uint8_t doBIST(uint8_t csPin =8);
复制代码




可见能够用ethershield里的cs和ethercard里的cs针脚定义是不同的,一个是10口,一个是8口。EC里的10口为ss,并且在int针口是cspin - 8,我也修改为cspin - 6

所以按照这个推论我又重新装接了针脚,28j60能够上机跑示例webclint,但是却又发生了一个串口监视器乱码的问题。头很大。


希望老师们能帮忙解决一下~~{:soso_e109:}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-9-27 17:44:15 | 显示全部楼层
串口问题,听说是idebug你换别的波特率试试,我是用57600没问题,另外一个问题,你不要改库,改变你的接线,ss接D8就行了,如果你非要接10就用ether.begin(sizeof Ethernet::buffer, mymac,10)就ok了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-28 00:06:52 | 显示全部楼层
zcbzjx 发表于 2012-9-27 17:44
串口问题,听说是idebug你换别的波特率试试,我是用57600没问题,另外一个问题,你不要改库,改变你的接线, ...


感谢老师,果然是波特率问题,我设置到9600,就没有乱码了~实在是太感谢了。

老师,有一个请求,能不能给做一个ethercard库的函数调用的方法和说明,虽然看库文件能理解一部分,但是有些函数的用法确实不清楚。实在很头疼。
最近又纠结于想做一个通过网络控制的小车,但是对这个想法有种束手无策的感觉。
回复 支持 反对

使用道具 举报

发表于 2012-9-28 10:05:08 | 显示全部楼层
波特率的问题~!
我之前也发现过
回复 支持 反对

使用道具 举报

发表于 2012-9-28 10:06:51 | 显示全部楼层
我也有些函数现在看不懂
我的办法是编译好的函数自己慢点去修改
看会产生什么不一样的效果
最后来确定函数的作用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-28 13:01:24 | 显示全部楼层
zhangdeyue1 发表于 2012-9-28 10:06
我也有些函数现在看不懂
我的办法是编译好的函数自己慢点去修改
看会产生什么不一样的效果

我是在先研究示例,一点点改。

我觉得ethercard比以前的ethershield看起来简单多了。。还是有希望突破的


张老师昨天出了一个教程了~就是专门对付enc28j60的ethercard库,在那个原英文链接的网站,收获还不少
回复 支持 反对

使用道具 举报

发表于 2013-4-8 00:58:20 | 显示全部楼层
请问楼上提到的这个教程在什么地方啊?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 13:39 , Processed in 0.056212 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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