STM32 三 ENC28J60乙太網 三

2021-08-26 02:46:37 字數 2076 閱讀 9860

4.enc28j60寫操作

通過enc28j60傳送乙太網資料報,操作enc28j60硬體緩衝區的傳送部分即可。每次傳送時總是從傳送緩衝區的起始位址開始填充資料,資料填充的結束位址和資料報長度有關。設定傳送緩衝區大小之後可向傳送緩衝區填充資料,即呼叫enc28j60_write_buf_mem操作命令,接著置位econ1中的 econ1_txrts位啟動傳送,並使用等待法不斷查詢是否傳送完畢。基本的思路還是和spi或uart傳送資料相似,即填充資料,啟動傳送,查詢傳送完成。寫操作的輸入引數為資料報的長度len和資料報指標packet,該引數正好和uip的網路層操作函式相對應。 

void enc28j60packetsend(unsigned int len, unsigned char* packet)

}

5 enc28j60讀操作

讀操作要比寫操作複雜一些。寫操作時每次總是從硬體傳送緩衝區的起始位址開始操作,而讀操作時需要不斷修改接收緩衝區的讀指標位址,該引數需要通過nextpacketptr完成,該變數為uint16_t型別的全域性變數。讀操作時,先通過暫存器檢視是否存在乙太網資料報,讀epktcnt暫存器便可返回乙太網資料報的個數;若存在乙太網資料報則設定讀指標的位址,執行讀緩衝區操作,enc28j60的乙太網接收資料報中前兩個位元組為下乙個乙太網資料報的起始位址,立即儲存該引數至nextpacketptr全域性變數;乙太網資料報中的後兩個位元組為該資料報的長度,該長度指從目標mac位址開始的資料報的長度,進行處理時還需要捨棄最後的4位元組crc校驗結果;通過讀緩衝區操作碼把長度為len的乙太網接收資料報儲存至ram中的某個位置,例如rxtx_buf全域性陣列。最後根據nextpacketptr移動讀指標以便下次操作,並通過操作econ2的econ2_pktdec位遞減了乙太網資料報個數。

unsigned int enc28j60packetreceive(unsigned int maxlen, unsigned char* packet)  

/* 設定接收緩衝器讀指標 */

enc28j60write(erdptl, (nextpacketptr));

enc28j60write(erdpth, (nextpacketptr)>>8);

/* 接收資料報結構示例 資料手冊43頁 */

/* 讀下乙個包的指標 */

nextpacketptr = enc28j60readop(enc28j60_read_buf_mem, 0);

nextpacketptr |= enc28j60readop(enc28j60_read_buf_mem, 0)<<8;

/* 讀包的長度 */

len = enc28j60readop(enc28j60_read_buf_mem, 0);

len |= enc28j60readop(enc28j60_read_buf_mem, 0)<<8;

/* 去除crc校驗部分 */

len-= 4;

/* 讀取接收狀態 */

rxstat = enc28j60readop(enc28j60_read_buf_mem, 0);

rxstat |= enc28j60readop(enc28j60_read_buf_mem, 0) << 8;

/* 限制檢索的長度 */

if (len > maxlen-1)

/* 檢查crc和符號錯誤 */

/* erxfcon.crcen是預設設定。通常我們不需要檢查 */

if ((rxstat & 0x80)==0)

else

/* 移動接收緩衝區 讀指標*/

enc28j60write(erxrdptl, (nextpacketptr));

enc28j60write(erxrdpth, (nextpacketptr)>>8);

/* 資料報遞減 */

enc28j60writeop(enc28j60_bit_field_set, econ2, econ2_pktdec);

/* 返回長度 */

return(len);

}

**:

STM32 三 ENC28J60乙太網 二

3 暫存器操作實現 enc28j60的暫存器操作分為2 2 2部分,分別為寫暫存器和讀暫存器部分,讀緩衝區和寫緩衝區部分,寫phy暫存器和讀phy暫存器部分。3.1 讀寫暫存器 讀或寫暫存器的函式如下 unsigned char enc28j60read unsigned char address ...

基於Enc28j60的LwIP(1 4 1)移植

移植過程比較容易,網上一堆教程,本文主要將low level output和low level input針對enc28j60做一些優化,減少資料拷貝。網上比較多的應該是如下 static err t low level output struct netif netif,struct pbuf p...

ENC28J60學習筆記 第4部分

0.相關資料 相關資料中包括其他精彩博文和 倉庫 嵌入式 tcp ip 資料彙總 enc28j60學習筆記 索引 第1部分 第2部分 第3部分 第4部分 stm32net學習筆記 索引 uip學習筆記 lwip學習筆記 stm32 enc28j60移植與入門 6 enc28j60初始化操作 enc2...