1. 程式人生 > >ENC28J60學習筆記——第1部分

ENC28J60學習筆記——第1部分

0.相關資料

相關資料中包括其他精彩博文和程式碼倉庫    【ENC28J60學習筆記——索引】 【第1部分】【第2部分】【第3部分】【第4部分

1前言

    嵌入式乙太網開發,可以分為兩個部分,一個是乙太網收發晶片的使用,一個是嵌入式乙太網協議棧的實現。乙太網收發晶片的使用要比串列埠收發晶片的使用複雜的多,市面上流通比較廣泛的乙太網收發晶片種類還不少,有SPI介面的ENC28J60,也有並口形式的RTL8019S,CS8900A等。嵌入式乙太網協議棧有著名的uIP協議棧,Lwip協議棧,還有其他嵌入式高手開發的協議棧。無論是硬體還是軟體,都無法分出高低,適合專案需求的才是最好的。

1.1 寫作理由

    再說明一下我寫作的理由。以前從淘寶上購買過ENC28J60,店家信誓旦旦地說能提供51AVR LPC STM32等多個平臺的程式碼,可以實現一個網頁控制LED。頭腦一熱買了回來,買回來才發現,店家提供的資料零零散散,不易弄懂。幾經週轉,發現原來這些ENC28J60的程式碼都出自一個地方——AVRNET,源自老外的一個開源專案。把最原始的程式碼拿來細細品味,乙太網協議就不那麼神祕了。在這裡說一下ENC28J60的使用,熟悉了ENC28J60的驅動可以分幾步走。第一步,通過ENC28J60移植uIP或者lwIP協議棧,實現TCP或是UDP通訊,第二,順著AVRNET專案走,實現一個簡單的web伺服器,執行靜態或者動態網頁。嵌入式乙太網和計算機乙太網開發不同,對於TCP通訊而言沒有socket套接字,對於網頁程式設計而言也沒有IIS或PHP,所示實現起來會相對麻煩,但是也非常有樂趣。

1.2 資料準備

    嵌入式乙太網開發是非常複雜的工作,在開始之前最好先大致瀏覽ENC28J60的使用手冊。除此之外,需要認真閱讀TCP IP相關知識,推薦一本圖書《嵌入式Internet TCP/IP基礎、實現和應用》。嵌入式開發是一個反覆借鑑的過程,該部分程式碼參考了AVRNET專案和奮鬥開發板的相關範例。AVRNET專案網址連結

雖然AVRNET專案所使用的MCU為ATmega32,但是認真閱讀原始碼之後也可以方便的移植到其他的MCU平臺,例如STM8、STM32和MSP430等。

2 暫存器和暫存器操作

    ENC28J60的暫存器很多,操作這些暫存器需要一個良好的程式碼組織工作。在AVRNET專案中,把ENC28J60的驅動分解成ENC28J60.h檔案和ENC28J60.c檔案

。H檔案中主要描述ENC28J60暫存器的基本定義,而C檔案主要實現了這些暫存器的操作。

2.1 暫存器定義

    首先分析一下ENC28J60.h這個標頭檔案。閱讀資料手冊之後,會發現ENC28J60暫存器數量較多,通過分析和整理,操作ENC28J60的暫存器需要注意以下3點。

【1】共有三種不同形式的暫存器——控制暫存器乙太網暫存器PHY暫存器,不同的暫存器以不同的字母開頭,以E、 MA和MI加以區分。操作這三種不同的暫存器需要不同的組合命令。

【2】 暫存器被分佈在4個不同的bank中,也就是說存在地址相同的暫存器,但是這些暫存器卻位於不同的分割槽中,在操作暫存器之前必須選中正確的bank

【3】 雖然存在4個bank,但是有5個暫存器在4個bank的位置相同

,它們是EIE、 EIR、ESTAT、ECON1、ECON2

AVRNET專案中,暫存器被定義成8位長度,而這8位長度包含了三個部分,地址bit7(最高位)用以區分PHY和MAC暫存器,PHY暫存器的操作最為特殊;地址bit6和bit5用以區分BANK,2位空間正好區分4個BANK;地址的最後5位才是暫存器的地址。通過這種方式就可以區分所有的暫存器了。列舉了幾行程式碼。由於標頭檔案很長,所以不全部列出。

// bank0 暫存器
#define ERDPTL            (0x00|0x00)
#define ERDPTH            (0x01|0x00)
#define EWRPTL            (0x02|0x00)
// bank1 暫存器
#define EHT0              (0x00|0x20)
#define EHT1              (0x01|0x20)
#define EHT2              (0x02|0x20)
// bank2 暫存器
#define MACON1           (0x00|0x40|0x80)
#define MACON2           (0x01|0x40|0x80)
#define MACON3           (0x02|0x40|0x80)
//bank3 暫存器
#define MAADR1           (0x00|0x60|0x80)
#define MAADR0           (0x01|0x60|0x80)
#define MAADR3           (0x02|0x60|0x80)

例如ERDPTH為位於BANK0的乙太網暫存器,第一個數字0x01代表BANKx中的具體地址,該地址為0x01,第二個數字0x00代表BANK編號,該BANK地址為0EHT1為位於BANK1中的控制暫存器,第一個0x01代表BANKx中的具體地址,該地址為0x01,第二個0x20代表BANK編號,此處BANK編號為1。請注意由於BANK編號被儲存在BIT6BIT5,所以此處為0x20而不是0x10MACON2為位於BANK2的乙太網暫存器,第一個數字0x01代表在該BANKx中的暫存器地址,第二個數字0x40代表BANK編號,此處BANK編號為2,而第三個數字0x80代表該暫存器為乙太網暫存器或是PHY暫存器,該暫存器的操作比較特殊。

為了方便暫存器操作,標頭檔案中還定義了暫存器地址操作的掩碼,簡單而言就是需要檢視哪些位,不需要檢視哪些位。

/* 暫存器地址掩碼 */
#defineADDR_MASK        0x1F
/* 儲存區域掩碼 */
#defineBANK_MASK        0x60
/* MAC和MII暫存器掩碼*/
#defineSPRD_MASK         0x80

另外還有比較特殊的5個控制暫存器,EIE,EIR,ESTAT,ECON2和ECON1

/* 關鍵暫存器 */
#defineEIE                     0x1B
#defineEIR                     0x1C
#defineESTAT                   0x1D
#defineECON2                  0x1E
#defineECON1                  0x1F

2.2 暫存器操作命令

暫存器操作命令也可稱為暫存器操作碼。為了實現暫存器的操作,ENC28J60定義了6+1個暫存器操作命令(操作碼)。操作相關暫存器至少有讀暫存器命令,寫暫存器命令;傳送或接收乙太網資料則必有寫緩衝區命令或讀緩衝區命令;為了加快操作,對於某些控制暫存器而言還可以有置位或者清零某位的命令;最後加上一個軟體復位命令,錦上添花。

/* 讀控制暫存器 */
#define ENC28J60_READ_CTRL_REG         0x00
/* 讀緩衝區 */
#define ENC28J60_READ_BUF_MEM          0x3A
/* 寫控制暫存器 */
#define ENC28J60_WRITE_CTRL_REG        0x40
/* 寫緩衝區 */
#define ENC28J60_WRITE_BUF_MEM         0x7A
/* 位域置位 */
#define ENC28J60_BIT_FIELD_SET         0x80
/* 位域清零 */
#define ENC28J60_BIT_FIELD_CLR         0xA0
/* 系統復位 */
#define ENC28J60_SOFT_RESET            0xFF

2.3 接收和傳送緩衝區分配

乙太網資料的接收和傳送離不開驅動晶片內部的RAM,也可稱之為硬體緩衝區。ENC28J60包括8K 的硬體緩衝區,該硬體緩衝區一部分被接收緩衝區使用,另一部分為傳送緩衝區使用。控制ENC28J60的最終目的為操作該硬體緩衝區。執行乙太網傳送命令時,向傳送緩衝區中填充資料,並觸發相關暫存器傳送乙太網資料;執行乙太網接收命令時,通過查詢相關暫存器或者外部中斷的方式獲得乙太網資料輸入事件,接著從接收緩衝區中讀取相關資料。

(1) 把緩衝區劃分為兩個部分。把8K的硬體緩衝區劃分為兩個部分至少需要四個引數,接收緩衝區需要一個起始地址和一個結束地址加以描述,傳送緩衝區也需要一個起始地址和一個結束地址加以描述。最理想的方式,兩個緩衝區完全佔據了8K的硬體緩衝區,完美地利用這一空間。由於ENC28J60的暫存器長度為8位,而硬體緩衝區的大小為8K,所以前面提到的4個地址需要8個暫存器才可以完全描述,需要把單個地址分為高8位和低8位。在AVRNET專案中,接收緩衝區較大,而傳送緩衝區較小。在乙太網協議中,最大的報文長度為1518位元組,而最小報文長度為60位元組。傳送緩衝區等於或略大於1518位元組,剩餘的部分全部分配給接收緩衝區。接收緩衝區較大也是考慮到AVR的處理能力有限,若某個時間點收到多個乙太網報文,可以先把報文閒置與硬體緩衝區中,待MCU空閒時再從緩衝區中取出。

/* 接收緩衝區起始地址 */
#define RXSTART_INIT                0x00
/* 接收緩衝區停止地址 */
#define RXSTOP_INIT                 (0x1FFF - 0x0600 - 1)
/* 傳送緩衝區起始地址 傳送緩衝區大小約1500位元組*/
#define TXSTART_INIT                (0x1FFF - 0x0600)
/* 傳送緩衝區停止地址 */
#define TXSTOP_INIT                 0x1FFF

圖2.1 硬體緩衝區結構

(2) 對於傳送緩衝區而言,需要指定傳送緩衝區寫指標,使用寫緩衝區命令操作該部分緩衝區,寫指標的地址會不斷增長,若遇到結束地址會重新返回起始地址。對於接收緩衝區而言就稍微複雜一點,每次讀取之前必須明確該次操作時的讀指標位置,根據前文的程式碼,緩衝區讀指標的起始地址為0,在第一次讀操作發生之後需要立即計算下次讀操作的讀指標地址。ENC28J60讀緩衝區時,被讀取的內容並不全是乙太網負載,在乙太網負載之前還有下一個資料包的地址指標(佔兩個位元組),接收狀態向量(佔4個位元組),之後才是“真實”乙太網負載,該負載包括目標MAC地址,源MAC地址,資料包型別等等;最後為CRC校驗位元組。


圖2.2 接收資料包結構


相關推薦

ENC28J60學習筆記——1部分

0.相關資料相關資料中包括其他精彩博文和程式碼倉庫    【ENC28J60學習筆記——索引】 【第1部分】【第2部分】【第3部分】【第4部分】1前言    嵌入式乙太網開發,可以分為兩個部分,一個是乙太網收發晶片的使用,一個是嵌入式乙太網協議棧的實現。乙太網收發晶片的使用要

輕松學習 JavaScript—— 1 部分:了解 let 語句

enc bbb 你會 rip view 應用 cti gist 變量提升 使用let語句,允許你在JavaScript中創建塊範圍局部變量。let語句是在JavaScript的ECMAScript 6標準中引入的。 在你往下了解let語句之前,我建議你先查看基於Infrag

易學筆記-1部分 瞭解區塊鏈/4章 區塊鏈架構設定

第1部分 瞭解區塊鏈/第4章 區塊鏈架構設定/4.1 基本概念 基本概念 區塊鏈技術: 去中心化 加解密技術 P2P網路 資料儲存:資料公開透明、無法篡改、方便追溯 第1部分 瞭解區塊鏈/第

易學筆記-1部分 瞭解區塊鏈/3章 共識機制,可程式設計的利益轉移規則

第1部分 瞭解區塊鏈/第3章 共識機制,可程式設計的利益轉移規則 共識機制,可程式設計的利益轉移規則 問題 如何吸引使用者加入網路節點 如何讓多個節點共同維護一個數據庫 如何決定哪個節點進行寫入?何時寫入?如何保證其它節點不能更新

易學筆記-1部分 瞭解區塊鏈

第1部分 瞭解區塊鏈/第1章 加密貨幣就是貨幣/1.1 加密貨幣簡史 加密貨幣簡史 概念:加密貨幣是一種數字貨幣,數字貨幣類同於虛擬貨幣、電子貨幣,比如網銀、支付寶等上面顯示的金額 第1部分 瞭解區塊鏈/第1章 加密貨幣就是貨幣/1.2 什麼是加密貨

機器學習筆記 1課:機器學習中的資料

資料在機器學習中起著重要的作用。 在談論資料時,理解和使用正確的術語非常重要。 你如何看待資料?想想電子表格吧,有列、行和單元格。 從統計視角而言,機器學習的任務是在假設函式( f )的上下文中構建資料。這些假設函式由機器學習演算法通過學習建立。給定一些輸入變數( Input ),該函式回答

java程式設計思想學習筆記——1章 物件導論

1.1 抽象過程 面向物件思想的實質:程式可以通過新增新型別的物件使自身適用於某個特定問題。 面向物件思想的五個基本特徵: 1)萬物皆物件 2)程式是物件的集合 3)每個物件都有自己的由其他物件所構成的儲存 4)每個物件都有其型別 5)某一特定型別的所有物件都可以接收同樣的訊息 物件具有行為、

programming-languages學習筆記--2部分

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-famil

爬蟲學習筆記1

人說最好的學習是教學,我深以為然。為了理清學習這本書《Python3爬蟲網路爬蟲開發實戰》的一些概念,開始寫本系列。這個系列的博文將 提煉書中重點核心理念 記錄我在學習這本書時遇到的非技術性問題及其解決方案 給出我個人的觀點和建議 有些內容我暫時不會寫到——

programming-languages學習筆記--3部分

programming-languages學習筆記–第3部分 pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b2e; color

C primer plus 學習筆記 1

第1章    初識C語言 這章主要介紹了一些C語言的歷史,還有編寫程式的過程。 主要內容: C的歷史和特性 編寫程式的步驟 編譯器和連結器的一些知識 C標準 1.1    C語言的起源 1972,貝爾實驗室 1.2    選擇C語言的理由 高效性,可移植性,可直接訪問

Android學習筆記1章之掌握日誌工具

備註:參考《第一行程式碼》 一、Android中的日誌工具類是Log(android.util.Log),這個類共提供了5種方法來供我們列印日誌。 1.Log.v()。用於列印那些最為瑣碎的、意義最小的日誌資訊。對用的級別是verbose,是Android日誌裡

RTthread學習筆記————1章 嵌入式作業系統

什麼是作業系統  作業系統是指管理和控制計算機硬體與軟體資源的計算機程式,是直接執行在計算機上的最基 本的系統軟體,任何其他軟體都必須在作業系統的支援下才能執行,按應用領域來劃分,可分為桌 面作業系統、伺服器作業系統、移動作業系統、和嵌入式作業系統幾類。  嵌

金字塔原理學習筆記1篇-表達的邏輯(二)

金字塔內部的結構 文章中的思想應組成單一思想統領下的金字塔結構,如下圖所示: 圖1 這樣的文章總是自金字塔的頂端開始,自上而下地沿著各個分支將作者的思想逐一呈現。 但大多數人在準備坐下來開始寫

programming-languages學習筆記--5部分

programming-languages學習筆記–第5部分 pre.src {background-color: #292b2e; color: #b2b2b2;} programming-languages學習筆記–第5部分 目錄

programming-languages學習筆記--6部分

programming-languages學習筆記–第6部分 pre.src {background-color: #292b2e; color: #b2b2b2;} programming-languages學習筆記–第6部分 目錄

programming-languages學習筆記--7部分

programming-languages學習筆記–第7部分 pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b2e; color: #b2b2b2;}

programming-languages學習筆記--8部分

programming-languages學習筆記–第8部分 pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b2e; color: #b2b2b2;}

MySQL 5.1參考手冊學習筆記 1章:一般資訊

1.2. 本手冊採用的慣例 ·這類風格的文字用於SQL語句,資料庫、表和列名稱,C和Perl程式碼,以及環境變數。例如: 要想重新載入授權表,請使用FLUSH PRIVILEGES語句。 這類風格的文字用於指明鍵入的數如資訊

吳恩達機器學習筆記部分未完成且暫時不打算完成

Linear regression and logistic regression,when u apply them ,sometimes cause the overfitting.Another term for this is that thisalgorithm h