ENC28J60设置问题
enc28j60寄存器的设置是用的那个aduino开源程序模版的上面的enc28j60源文件,也用的里面的初始化函数,经过一系列的调试现在可以接收ARP请求数据包和应答ARP请求。但是从pc机上发送ICMP和TCP请求enc28j60都不能接收到这个包,是不是我什么寄存器设置错误了,求大神指导啊!!!! 您好歹得把代码贴上啊 :)楼上说的有道理 本帖最后由 等待…… 于 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);
enc28j60Write(MAADR4, macaddr);
enc28j60Write(MAADR3, macaddr);
enc28j60Write(MAADR2, macaddr);
enc28j60Write(MAADR1, macaddr);
enc28j60Write(MAADR0, macaddr);///设置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, gaoshine 发表于 2013-4-11 22:00 static/image/common/back.gif
您好歹得把代码贴上啊
代码贴上了谢谢 自己顶上去吧自己知道错误在哪里了 是在数据包筛选设置里面有问题我设置为所有数据包接收就可以接收到。所以求怎么设置?????:'( 我再多问一句,您用的是那个库啊 ICMP 协议已经封装好了 直接就可应用 您ping一下就知道了,用不着看这么底层得代码,随便建议一下,本论坛已经有个非常好的ENC28j60的系列文章,我记着原文应该在意大利的一个网站,您搜一下就可以,讲的不能再细了,我觉得。 gaoshine 发表于 2013-4-12 20:56 static/image/common/back.gif
我再多问一句,您用的是那个库啊 ICMP 协议已经封装好了 直接就可应用 您ping一下就知道了,用不着看这么底 ...
其实吗 我也知道不过第一我不是用aduino,第二我把那个库移植过来也有问题,所以决定自己写,然后就出现这种我觉得是那库本身的问题。所以只有慢慢研究,目前阶段只有接收所有数据包然后手动过滤包了。
页:
[1]