DM9000調試過程總結(mac地址過濾)

目的 :完成網口收發調試

過程 : 
    
1、網口初始化,根據芯片數據手冊配置

2、網口發數,先向DM9000中的TX FIFO存入數據,然後出發發送寄存器完成發送;

3、網口接收 。

1) 中斷方式 :DM9000的中斷可以通過主動查詢DM9000中斷寄存器的方式,以及通過DM9000INT引腳來中斷DSP系統,在去查詢中斷類型的方式。
                             
                   使用DM9000 INT方式出發DSP中斷的好處有:可以避免cpu不斷的查詢DM9000中斷寄存器;優化收數掉幀的情況

2)MAC地址過濾 :    配合DM9000中RCR(接受控制寄存器)寄存器以及DM9000物理地址和
廣播地址寄存器共同實現對非匹配MAC地址包的過濾功能
        
                                  

          
        
   配置說明 :
           假設配置的本地MAC地址爲 28 5b 6d 5c 58 73 。注意mac地址的首位需要爲偶數

           將RCR寄存器的值配置爲0X33 : 即打開DM9000的混雜模式,此時DM9000能夠接受到所有的網絡包,包括以
           廣播幀    :  FF FF FF FF FF FF XX XX XX XX XX XX..  
           其他MAC地址包 : 28 5b 6d 5c 58 74 XX XX XX XX XX XX...
           多播幀  :33 33 01 00 02 00 XX XX XX XX XX XX...
           當前匹配mac地址包 :28 5b 6d 5c 58 73 XX XX XX XX XX XX...

  將RCR寄存器的值配置爲0X31 : 即關閉DM9000的混雜模式,此時DM9000能夠接受到廣播包、多播包、匹配本地MAC地址包
  廣播幀    :  FF FF FF FF FF FF XX XX XX XX XX XX..  
  多播幀  :33 33 01 00 02 00 XX XX XX XX XX XX...
當前匹配mac地址包 :28 5b 6d 5c 58 73 XX XX XX XX XX XX...

將RCR寄存器的值配置爲0X39 : 即關閉DM9000的多包模式,貌似無效,還是能夠接受到廣播包、多播包、匹配本地MAC地址包

如果需要進一步過濾掉廣播包和多播包,需要藉助廣播寄存地址;從網上資料查詢得到,此處的廣播寄存器地址就等效於一個校驗位,能對通過的MAC地址計算並校驗,符合校驗值得則通過MAC產生中斷,不符合的則被過濾掉(自己未驗證過);本次設置該廣播寄存地址全部爲零;經測試發現,能夠將其他的多播包和廣播包去除,只接收匹配本地MAC地址的數據

        3) DSP移植 : 
                            
                            DM9000接受到的數據是進過MAC組幀過後的值,具體格式如下所示 : 
                            
                            
    第一個byte爲接受包有效標誌位 ; status爲狀態位;數據長度;後面其實還有兩位校驗位
                            
   假設上位機PC端發送一組數據長度爲1040的數據 格式爲 :FF FF FF FF FF FF 28 5b 6d 5c 58 73 保留爲(4byte)   數據爲(1024byte) 總共長度爲  1040 byte

   網口接受到的包格式爲 : 
                            
   01  XX 14 04    FF FF FF FF FF FF 28 5b 6d 5c 58 73 保留爲(4byte)   數據爲(1024byte) CRC(4byte);

   接受包中的數據長度爲0X414 即1044個;多出的4byte就是後面跟隨的CRC

   在移植過程中出現了一個關於讀數的問題 : 
                            
1、程序移植到FLASH後發現接受到的數據出現錯誤。
                            
                            
原因 : DM9000內部設置從RX FIFO中將數據讀取出來採用的是指針自動遞增的模式;如果在有數據到來沒有按照接受包的幀長度(1044)全部將數據讀取出來,那麼RX SRAM的自動指針是不會自動跳轉回到初始位置;導致在進入中斷時數據將會讀取錯誤;

                            

                            
上圖代碼段想從接受到的數據中直接將信號提取出來;
                           
 rx_state = inw();
                            
phy_addr[0] = inw(); .....
                            
由於這些定義的變量只是爲了將佔據數據包中相應部分去除,使得讀取RX FIFO 指針依次移動至有效數據位置上。然後獲取有效數據位;                        
由於DSP程序代碼打開了最高級別的優化,使得這些未使用的代碼段直接被優化掉,使得RX FIFO指針在操作時沒有移位到數據位上。
                            
通過對變量添加volatile 關鍵字也不是全部都有效;所以將代碼做了如下修改
                            


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章