本帖最后由 等待…… 于 2013-4-12 16:03 编辑
初始化代码如下:
ENC28J60_CONTROL_DDR |= 1<<ENC28J60_CONTROL_CS;
CSPASSIVE;
DDRB |=(1<<PB5)|(1<<PB7);
DDRB &=~(1<<PB6);
PORTB|=(1<<PB5)|(1<<PB7);
SPCR = (1<<SPE)|(1<<MSTR);
SPSR |= (1<<SPI2X);///SPI等端口初始化
enc28j60WriteOp(ENC28J60_SOFT_RESET,0,ENC28J60_SOFT_RESET);
_delay_ms(50);///enc28j60系统复位
NextPacketPtr = RXSTART_INIT;///下一个数据包指针位置初始化
enc28j60Write(ERXSTL,RXSTART_INIT&0xff);
enc28j60Write(ERXSTH,RXSTART_INIT>>8);///接收起始地址
enc28j60Write(ERXRDPTL, RXSTART_INIT&0xFF);
enc28j60Write(ERXRDPTH, RXSTART_INIT>>8);///接收读指针起始地址
enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);
enc28j60Write(ERXNDH, RXSTOP_INIT>>8);///接收结束地址
enc28j60Write(ETXSTL, TXSTART_INIT&0xFF);
enc28j60Write(ETXSTH, TXSTART_INIT>>8);///发送起始地址
enc28j60Write(ETXNDL, TXSTOP_INIT&0xFF);
enc28j60Write(ETXNDH, TXSTOP_INIT>>8);///发送结束地址
enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);///接收过滤控制寄存器
//enc28j60Write(ERXFCON, 0xa8);///接收过滤控制寄存器
enc28j60Write(EPMM0, 0x3f);
enc28j60Write(EPMM1, 0x30);
enc28j60Write(EPMCSL, 0xf9);
enc28j60Write(EPMCSH, 0xf7);///格式匹配屏蔽和格式匹配校验
//PORTA=EPMCSL;
// do bank 2 stuff
// enable MAC receive
enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);///MAC初始化寄存器1
// bring MAC out of reset
enc28j60Write(MACON2, 0x00);///MAC子系统复位
// enable automatic padding to 60bytes and CRC operations
enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN|MACON3_FULDPX);///MAC自动填充和CRC校验以及发送使能
// set inter-frame gap (non-back-to-back)
//PORTA=enc28j60Read(MACON3);
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]);///设置MAC地址
// no loopback of transmitted frames
enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);///PHY初始化(要发送的数据仅通过双绞线接口发出)
// switch to bank 0
enc28j60SetBank(ECON1);///设置指针在BANK0区域
// enable interrutps
enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_PKTIE|EIE_TXIE);///全局中断,接收数据包待处理,发送中断允许
// enable packet reception
enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);///使能接收
另外MAC为:0x24,0x00,0x10,0x58,0x55,0x54, |