找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5540|回復(fù): 2
收起左側(cè)

ENC28J60+UIP 組播和廣播無法接收問題

[復(fù)制鏈接]
ID:82083 發(fā)表于 2015-6-6 21:31 | 顯示全部樓層 |閱讀模式
采用UIP進行組播和廣播時遇到兩個問題,一是無法接收組播數(shù)據(jù);二是廣播數(shù)據(jù)大于18字節(jié)時無法接收
檢查組播數(shù)據(jù)接收時發(fā)現(xiàn)EPKTCNT寄存器顯示是有數(shù)據(jù)的,但是UIP_UDP_APPCALL里面uip_newdata()為零表示無數(shù)據(jù);因此猜測是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é)果是另一個宏定義
#ifndef UIP_CONF_BROADCAST
#define UIP_BROADCAST 0
#else
#define UIP_BROADCAST UIP_CONF_BROADCAST
#endif

于是增加一句#define UIP_CONF_BROADCAST 1,繼續(xù)運行,
結(jié)果發(fā)現(xiàn)還是沒有效果,于是回到剛才的程序,這才恍然大悟,原來是通過
uip_ipaddr_cmp(BUF->destipaddr, all_ones_addr)
來進行判定,其中all_ones_addr定義為全部都是F,也就是255.255.255.255,所以只要廣播數(shù)據(jù)才會進入udp_input,自己的數(shù)據(jù)包是192.168.1.255,所以被丟棄
找到問題之后就容易解決了,在下面增加一段程序
if(BUF->proto == UIP_PROTO_UDP &&
       ((BUF->destipaddr[1]&0xFF00)==0xFF00)) {
      goto udp_input;
    }
作用就是判定ip地址最后一位是否為255,如果是則進入udp_input,修改完成之后,發(fā)幾個數(shù)據(jù)試試,運行果然就正確了。
可是在正式使用時發(fā)現(xiàn)又不行了,繼續(xù)加斷點找,這次發(fā)現(xiàn)是ENC28J60沒有收到,EPKTCNT一直為0;經(jīng)過反復(fù)試驗,發(fā)現(xiàn)只要18字節(jié)以內(nèi)就能收的到,大于就收不到了。上網(wǎng)搜一下發(fā)現(xiàn)有大神說要配置ENC28J60,于是找到ERXFCON寄存器,其中最低兩位為1表示接收,于是在初始化時配置一下,設(shè)置為接收數(shù)據(jù)包:
temp=enc28j60Read(ERXFCON);
temp=temp|0x03;
enc28j60Write(ERXFCON,temp);
這次運行試試,果然成功了。

回復(fù)

使用道具 舉報

ID:642366 發(fā)表于 2019-11-15 06:57 | 顯示全部樓層
能否把源程序發(fā)給小弟參考一下,最近也在研究UDP 組播和廣播問題!
回復(fù)

使用道具 舉報

ID:642366 發(fā)表于 2019-11-15 06:58 | 顯示全部樓層
源程序 可否發(fā)來參考一下,近期也在研究這個,小弟郵箱 sunnyben1987@163.com
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表