STM32 三 ENC28J60乙太網 二

2021-08-26 02:46:37 字數 2243 閱讀 8808

3 暫存器操作實現

enc28j60的暫存器操作分為2+2+2部分,分別為寫暫存器和讀暫存器部分,讀緩衝區和寫緩衝區部分,寫phy暫存器和讀phy暫存器部分。

3.1 讀寫暫存器

讀或寫暫存器的函式如下:

unsigned char enc28j60read(unsigned char address)

void enc28j60write(unsigned char address, unsigned char data)

讀寫暫存器的分為兩步,第一步為選定暫存器的bank編號,第二步使用寫命令或讀命令,操作指定位址的暫存器。在enc28j60中,由econ1中的低兩位(bit1-bit1)儲存bank編號,econ1是比較特殊的控制暫存器, 4個bank均具有該暫存器且該暫存器的位址相同。enc28j60bank為全域性變數,用於儲存當前的bank編號,如果兩次操作控制暫存器在同乙個bank時,該變數保持不變,若兩次操作的控制暫存器位於不同的bank,那麼bank的值會變為新的bank編號。

void enc28j60setbank(unsigned char address)} 

unsigned char enc28j60readop(unsigned char op, unsigned char address)

/* cs拉高 禁止enc28j60 */

enc28j60_csh();

/* 返回資料 */

return dat;

}

讀控制暫存器實際上就是嚴格遵守資料手冊的操作要求。由於讀mac和mii暫存器時,第乙個接收到的位元組為無效位元組,第二個位元組才為有效位元組。程式通過暫存器位址的最高位來判斷是否為mac或mii暫存器。寫暫存器函式較為簡單,第一次位元組包括操作碼和暫存器位址,第二個位元組為資料。在這兩個函式中引數op為enc28j60的指令,或稱之為操作碼,該指令佔據spi首位元組的前3位,引數address為暫存器位址,引數data為暫存器的具體值。

enc28j60_csl()和enc28j60_csh()為操作cs埠的操作巨集,而spi_sendbyte()可通過spi傳送乙個位元組。修改這些函式即可在其他平台上操作enc28j60。不過請特別注意,在使用其他開發板時由於spi匯流排上可能掛載多個裝置,單獨使用enc28j60時需要把其他裝置的cs埠拉高,或安裝乙個上拉電阻。

unsigned char enc28j60readop(unsigned char op, unsigned char address)

/* cs拉高 禁止enc28j60 */

enc28j60_csh();

/* 返回資料 */

return dat;

}void enc28j60writeop(unsigned char op, unsigned char address, unsigned char data)

3.2 讀寫緩衝區

讀寫緩衝區的操作也易於理解的。需要說明的是,兩個函式具有相同的輸入引數,引數len代表被運算元據的長度,pdata為被運算元據的指標。和暫存器讀寫函式相似,傳送或接收資料之前需要傳送特定的操作碼。

void enc28j60readbuffer(unsigned int len, unsigned char* pdata)

/* 禁止enc28j60 */

enc28j60_csh();

}void enc28j60writebuffer(unsigned int len, unsigned char* pdata)

/* 禁止enc28j60 */

enc28j60_csh();

}

3.3 讀寫phy暫存器

phy暫存器和被enc28j60控制的led指示燈有關,控制該暫存器可以控制led驅動方式和發生相應事件時led顯示方式。一般情況下,乙個led指示燈用於指示網路狀態(常亮可理解為網路接通),另乙個led指示燈顯示接收活動,有資料輸入時產生乙個點亮脈衝。phy是比較特殊的暫存器,先要想乙個控制暫存器寫入phy暫存器的位址,再向兩個控制暫存器依次寫入phy暫存器的具體資料的高8位和低8位,最後等待phy暫存器操作完成。

void enc28j60phywrite(unsigned char address, unsigned int data)

** 

STM32 三 ENC28J60乙太網 三

4.enc28j60寫操作 通過enc28j60傳送乙太網資料報,操作enc28j60硬體緩衝區的傳送部分即可。每次傳送時總是從傳送緩衝區的起始位址開始填充資料,資料填充的結束位址和資料報長度有關。設定傳送緩衝區大小之後可向傳送緩衝區填充資料,即呼叫enc28j60 write buf mem操作命...

基於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...