本帖最后由 坤遠遊森林 于 2012-9-28 13:16 编辑
之前用etherShield的库,跑通程序和硬件。
看了一下现在比较新的ethercard库,感觉调用函数的语句更精炼,阅读更方便,所以想使用这个库。
但是在运行Ethercard库的示例,上机无力。http://www.geek-workshop.com/thread-2044-1-1.html。具体为网络灯不亮,更像是中断/片选这类的问题。
所以翻阅比较了一下etherShield和ethercard里面的构建函数
发现:
etherShield里的enc28j60.h
- #define ENC28J60_CONTROL_CS 10
- #define SPI_MOSI 11
- #define SPI_MISO 12
- #define SPI_SCK 13
- ...
- ..
- ..
- void enc28j60Init(uint8_t* macaddr)
- {
- // initialize I/O
- // ss as output:
- pinMode(ENC28J60_CONTROL_CS, OUTPUT);
- CSPASSIVE; // ss=0
- //
- pinMode(SPI_MOSI, OUTPUT);
-
- pinMode(SPI_SCK, OUTPUT);
-
- pinMode(SPI_MISO, INPUT);
-
-
- digitalWrite(SPI_MOSI, LOW);
-
- digitalWrite(SPI_SCK, LOW);
-
- /*DDRB |= 1<<PB3 | 1<<PB5; // mosi, sck output
- cbi(DDRB,PINB4); // MISO is input
- //
- cbi(PORTB,PB3); // MOSI low
- cbi(PORTB,PB5); // SCK low
- */
- //
- // initialize SPI interface
- // master mode and Fosc/2 clock:
- SPCR = (1<<SPE)|(1<<MSTR);
- SPSR |= (1<<SPI2X);
- // perform system reset
- enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);
- delay(50);
- // check CLKRDY bit to see if reset is complete
- // The CLKRDY does not work. See Rev. B4 Silicon Errata point. Just wait.
- //while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY));
- // do bank 0 stuff
- // initialize receive buffer
- // 16-bit transfers, must write low byte first
- // set receive buffer start address
- NextPacketPtr = RXSTART_INIT;
- // Rx start
- enc28j60Write(ERXSTL, RXSTART_INIT&0xFF);
- enc28j60Write(ERXSTH, RXSTART_INIT>>8);
- // set receive pointer address
- enc28j60Write(ERXRDPTL, RXSTART_INIT&0xFF);
- enc28j60Write(ERXRDPTH, RXSTART_INIT>>8);
- // RX end
- enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);
- enc28j60Write(ERXNDH, RXSTOP_INIT>>8);
- // TX start
- enc28j60Write(ETXSTL, TXSTART_INIT&0xFF);
- enc28j60Write(ETXSTH, TXSTART_INIT>>8);
- // TX end
- enc28j60Write(ETXNDL, TXSTOP_INIT&0xFF);
- enc28j60Write(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
- enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);
- enc28j60Write(EPMM0, 0x3f);
- enc28j60Write(EPMM1, 0x30);
- enc28j60Write(EPMCSL, 0xf9);
- enc28j60Write(EPMCSH, 0xf7);
- //
- //
- // do bank 2 stuff
- // enable MAC receive
- enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
- // bring MAC out of reset
- enc28j60Write(MACON2, 0x00);
- // enable automatic padding to 60bytes and CRC operations
- enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
- // set inter-frame gap (non-back-to-back)
- enc28j60Write(MAIPGL, 0x12);
- enc28j60Write(MAIPGH, 0x0C);
- // set inter-frame gap (back-to-back)
- enc28j60Write(MABBIPG, 0x12);
- // Set the maximum packet size which the controller will accept
- // Do not send packets longer than MAX_FRAMELEN:
- enc28j60Write(MAMXFLL, MAX_FRAMELEN&0xFF);
- enc28j60Write(MAMXFLH, MAX_FRAMELEN>>8);
- // do bank 3 stuff
- // write MAC address
- // NOTE: MAC address in ENC28J60 is byte-backward
- enc28j60Write(MAADR5, macaddr[0]);
- enc28j60Write(MAADR4, macaddr[1]);
- enc28j60Write(MAADR3, macaddr[2]);
- enc28j60Write(MAADR2, macaddr[3]);
- enc28j60Write(MAADR1, macaddr[4]);
- enc28j60Write(MAADR0, macaddr[5]);
- // no loopback of transmitted frames
- enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);
- // switch to bank 0
- enc28j60SetBank(ECON1);
- // enable interrutps
- enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
- // enable packet reception
- enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
- }
复制代码
和 ethercard里的<enc28j60.cpp>
- void ENC28J60::initSPI () {
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- const byte SPI_SS = 53;
- const byte SPI_MOSI = 51;
- const byte SPI_MISO = 50;
- const byte SPI_SCK = 52;
- #else
- const byte SPI_SS = 10;
- const byte SPI_MOSI = 11;
- const byte SPI_MISO = 12;
- const byte SPI_SCK = 13;
- #endif
-
- pinMode(SPI_SS, OUTPUT);
- pinMode(SPI_MOSI, OUTPUT);
- pinMode(SPI_SCK, OUTPUT);
- pinMode(SPI_MISO, INPUT);
-
- digitalWrite(SPI_MOSI, HIGH);
- digitalWrite(SPI_MOSI, LOW);
- digitalWrite(SPI_SCK, LOW);
- SPCR = bit(SPE) | bit(MSTR); // 8 MHz @ 16
- bitSet(SPSR, SPI2X);
- }
- ...
- ...
- ...
- byte ENC28J60::initialize (word size, const byte* macaddr, byte csPin) {
- bufferSize = size;
- if (bitRead(SPCR, SPE) == 0)
- initSPI();
- selectBit = csPin - 8;
- bitSet(DDRB, selectBit);
- disableChip();
-
- writeOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);
- delay(2); // errata B7/2
- while (!readOp(ENC28J60_READ_CTRL_REG, ESTAT) & ESTAT_CLKRDY)
- ;
-
- gNextPacketPtr = RXSTART_INIT;
- writeReg(ERXST, RXSTART_INIT);
- writeReg(ERXRDPT, RXSTART_INIT);
- writeReg(ERXND, RXSTOP_INIT);
- writeReg(ETXST, TXSTART_INIT);
- writeReg(ETXND, TXSTOP_INIT);
- enableBroadcast(); // change to add ERXFCON_BCEN recommended by epam
- writeReg(EPMM0, 0x303f);
- writeReg(EPMCS, 0xf7f9);
- writeRegByte(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
- writeRegByte(MACON2, 0x00);
- writeOp(ENC28J60_BIT_FIELD_SET, MACON3,
- MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
- writeReg(MAIPG, 0x0C12);
- writeRegByte(MABBIPG, 0x12);
- writeReg(MAMXFL, MAX_FRAMELEN);
- writeRegByte(MAADR5, macaddr[0]);
- writeRegByte(MAADR4, macaddr[1]);
- writeRegByte(MAADR3, macaddr[2]);
- writeRegByte(MAADR2, macaddr[3]);
- writeRegByte(MAADR1, macaddr[4]);
- writeRegByte(MAADR0, macaddr[5]);
- writePhy(PHCON2, PHCON2_HDLDIS);
- SetBank(ECON1);
- writeOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
- writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
- byte rev = readRegByte(EREVID);
- // microchip forgot to step the number on the silcon when they
- // released the revision B7. 6 is now rev B7. We still have
- // to see what they do when they release B8. At the moment
- // there is no B8 out yet
- if (rev > 5) ++rev;
- return rev;
- }
复制代码
以及ethercard里的<enc28j60.c>
- static uint8_t initialize (const uint16_t size, const uint8_t* macaddr,
- uint8_t csPin =8);
- ...
- ...
- ...
- 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:}
|