標(biāo)題:
ENC28J60+UIP 組播和廣播無法接收問題
[打印本頁(yè)]
作者:
qinqin
時(shí)間:
2015-6-6 21:31
標(biāo)題:
ENC28J60+UIP 組播和廣播無法接收問題
采用UIP進(jìn)行組播和廣播時(shí)遇到兩個(gè)問題,一是無法接收組播數(shù)據(jù);二是廣播數(shù)據(jù)大于18字節(jié)時(shí)無法接收
檢查組播數(shù)據(jù)接收時(shí)發(fā)現(xiàn)EPKTCNT寄存器顯示是有數(shù)據(jù)的,但是UIP_UDP_APPCALL里面uip_newdata()為零表示無數(shù)據(jù);因此猜測(cè)是uip把數(shù)據(jù)包丟棄了;
順藤摸瓜,發(fā)現(xiàn):
#if UIP_BROADCAST
DEBUG_PRINTF("UDP IP checksum 0xx\n", uip_ipchksum());
if(BUF->proto == UIP_PROTO_UDP &&
uip_ipaddr_cmp(BUF->destipaddr, all_ones_addr)
) {
goto udp_input;
}
#endif
原來有宏定義,于是找到UIP_BROADCAST的定義,結(jié)果是另一個(gè)宏定義
#ifndef UIP_CONF_BROADCAST
#define UIP_BROADCAST 0
#else
#define UIP_BROADCAST UIP_CONF_BROADCAST
#endif
于是增加一句#define UIP_CONF_BROADCAST 1,繼續(xù)運(yùn)行,
結(jié)果發(fā)現(xiàn)還是沒有效果,于是回到剛才的程序,這才恍然大悟,原來是通過
uip_ipaddr_cmp(BUF->destipaddr, all_ones_addr)
來進(jìn)行判定,其中all_ones_addr定義為全部都是F,也就是255.255.255.255,所以只要廣播數(shù)據(jù)才會(huì)進(jìn)入udp_input,自己的數(shù)據(jù)包是192.168.1.255,所以被丟棄
找到問題之后就容易解決了,在下面增加一段程序
if(BUF->proto == UIP_PROTO_UDP &&
((BUF->destipaddr[1]&0xFF00)==0xFF00)) {
goto udp_input;
}
作用就是判定ip地址最后一位是否為255,如果是則進(jìn)入udp_input,修改完成之后,發(fā)幾個(gè)數(shù)據(jù)試試,運(yùn)行果然就正確了。
可是在正式使用時(shí)發(fā)現(xiàn)又不行了,繼續(xù)加斷點(diǎn)找,這次發(fā)現(xiàn)是ENC28J60沒有收到,EPKTCNT一直為0;經(jīng)過反復(fù)試驗(yàn),發(fā)現(xiàn)只要18字節(jié)以內(nèi)就能收的到,大于就收不到了。上網(wǎng)搜一下發(fā)現(xiàn)有大神說要配置ENC28J60,于是找到ERXFCON寄存器,其中最低兩位為1表示接收,于是在初始化時(shí)配置一下,設(shè)置為接收數(shù)據(jù)包:
temp=enc28j60Read(ERXFCON);
temp=temp|0x03;
enc28j60Write(ERXFCON,temp);
這次運(yùn)行試試,果然成功了。
作者:
sunnyben
時(shí)間:
2019-11-15 06:57
能否把源程序發(fā)給小弟參考一下,最近也在研究UDP 組播和廣播問題!
作者:
sunnyben
時(shí)間:
2019-11-15 06:58
源程序 可否發(fā)來參考一下,近期也在研究這個(gè),小弟郵箱
sunnyben1987@163.com
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1