張慶輝,馬延立
(河南工業大學 信息科學與工程學院,鄭州 450001)
隨著以太網技術的普及和發展,基于以太網的應用接口設備也迅速普及到醫療設備、工廠電力系統等領域。嵌入式以太網系統不但可以通過Internet將通信距離無限擴大,使得大量數據的快速傳輸成為可能,還可以實現測控系統間的數據交換,為智能化、模塊化的嵌入式設備的實現提供了一種新途徑。然而,嵌入式以太網接口設計的核心器件是網絡控制芯片,其性能優劣直接影響網絡通信的效率。
本文采用基于32位Cortex-M3內核的STM32F103VET6微處理器和高性能的以太網控制芯片ENC28J60實現高性能、高可靠性的嵌入式以太網通信接口設計,其系統各功能模塊容易擴展和升級。
STM32F103VET6是32位Cortex-M3內核的新型處理器。它具有更多片內RAM和外設,其出色的性能和豐富的資源幾乎不需要擴展外圍電路就能滿足一般的設計要求,硬件設計大為簡化,且執行速度和內存容量完全滿足主控模塊的多任務實時應用。
ENC28J60是Microchip公司推出的28引腳獨立以太網控制芯片,可為嵌入式應用提供低引腳數、低成本且高效易用的遠程通信解決方案。ENC28J60采用業界標準的SPI串行接口,只需4條連線即可與主控單片機連接。ENC28J60以太網控制器的主要功能包括:
① 符合IEEE 802.3標準。內置10Mbps以太網物理層器件(PHY)及媒介接入控制器(MAC),可按業界標準的以太網協議可靠地收發信息包數據。
② 可編程過濾功能。特殊的過濾器包括可編程模式匹配過濾器,可自動評價、接收或拒收Magic Packe的單播、多播或廣播信息包,以減輕主控單片機的處理負荷。
③ 最高速度可達10MB/s的SPI接口。
④ 可編程8KB雙端口SRAM緩沖器,以高效的方式進行信息包的存儲、檢索和修改,以減輕主控單片機的內存負荷。該緩沖器提供了靈活可靠的數據管理機制[1]。
ENC28J60可以通過SPI接口方便地和微處理器連接而構成嵌入式以太網通信接口,對于沒有SPI接口的微處理器也可以通過I/O口模擬SPI的方法實現。STM32F103VET6內部含有3個SPI接口,可以很方便地實現與ENC28J60的連接。STM32F103VET6SPI引腳連接圖如圖1所示。

圖1 STM32F103VET6SPI引腳連接圖
ENC28J60具有上電復位功能,一旦VDD上升到某個門限值后,就會在片內產生上電復位脈沖,當VDD上升到足夠器件工作電壓時,器件會以初始化狀態啟動,在器件正常工作期間,RESET引腳的內部弱上拉將會使引腳保持邏輯高電平,在系統上電復位后不應立即發送數據或訪問到MAC、MII或PHY寄存器,至少應延遲10ms。通過查詢ENC28J60狀態寄存器ESTAT中的CLKRDY位來確定系統是否準備好是不可靠的,最好將復位引腳連接到單片機的引腳,通過軟件延時來使系統可靠復位[2]。
ENC28J60內部集成了2.5V穩壓器,要使之工作穩定,需要在VCAP引腳與地之間外接一個10μF電容;由于ENC28J60內部穩壓器無法驅動外部負載,所以電源引腳必須與同一個3.3V電源相連,并且在每個電源引腳與地之間都應連接一個0.1μF的磁片電容,而且電容應盡可能靠近引腳。
硬件電路連接如圖2所示。根據ENC28J60的工作頻率要求,需在OSC1和OSC2引腳間連接25MHz晶振及接地電容。ENC28J60的內部模擬電路需要在RBIAS引腳與地之間外接一個1kΩ的電阻。以太網變壓器在實現以太網接口操作時是不可缺少的,在差分發送引腳(TPOUT+/TPOUT-)上,需要外接一個帶有中心抽頭的1∶1脈沖變壓器[3]。變壓器應具有2kV以上的電壓隔離性能,以防止靜電干擾。本設計采用的是集成以太網隔離變壓器RJ45插座HR911105A。
STM32(即STM32F10系列芯片,包括了本文所用的芯片)標準外設庫也稱固件函數庫或固件庫,是一個固件函數包,它由程序、數據結構和宏組成,包括了微處理器所有外設的性能特征。該函數庫還包括每一個外設的驅動描述和應用實例,為開發者訪問底層硬件提供了一個中間API,通過使用固件函數庫,無需深入掌握底層硬件細節,就可以輕松應用每一個外設。因此,使用固件函數庫可以大大減少用戶的程序編寫時間,進而降低開發成本。該固件庫中的每個外設驅動都由一組函數組成,這組函數覆蓋了該外設的所有功能,并且每個器件的開發都有一個通用API驅動,API對該驅動程序的結構、函數和參數名稱都進行了標準化[4]。
在實際開發過程中,根據應用程序的需要,可以采取2種方法使用標準外設庫:
① 使用外設驅動:這時應用程序開發基于外設驅動的 API。用戶只需要配置文件“stm32f10x_conf.h”,并使用相應的文件“stm32f10x_ppp.h/.c”即可。
② 不使用外設驅動:這時應用程序開發基于外設的寄存器結構和位定義文件。
使用標準外設庫進行開發可以極大地減少軟件開發的工作量,也是目前嵌入式系統開發的一個趨勢。

圖2 硬件電路連接圖
ENC28J60控制寄存器中最基本和重要的5個寄存器是:EIE、EIR、ESTAT、ECON2和ECON1。
EIE:以太網中斷使能控制寄存器,分為總中斷使能和各部分使能控制。
EIR:以太網中斷標志寄存器,在接收和發送數據包時根據不同的標志位進入不同的執行程序。
ESTAT:以太網狀態寄存器,反映以太網當前的數據碰撞、忙信息、錯誤信息、時鐘狀態等信息。
ECON2:以太網輔助控制寄存器,設置數據指針、芯片節能等。
ECON1:以太網主控制寄存器,這個是芯片最常用的寄存器,主要用來設置不同層的寄存器空間[5]。
在使用ENC28J60發送和接收數據包時,必須對器件進行初始化設置。根據不同的應用,一些配置選項可能需要更改。ENC28J60的初始化主要是對其接收和發送緩沖器、接收過濾器、晶振啟動時間、MAC寄存器、PHY寄存器進行設置。初始化ENC28J60之前,先關閉單片機的中斷輸入,對引腳給定一個持續的低電平復位信號,然后對相應的寄存器進行設置。設置完成所有需要的寄存器后,判斷以太網狀態中的時鐘啟動標志位是否置位,然后開中斷。對于以太網傳輸部分來說,主要有兩個作用:一是對要發送的數據按照以太網數據幀格式進行封裝并發送;二是對接收的以太網數據幀進行解包,供應用程序使用[6]。
通過向STM32F103VET6的SPI緩沖器寫入相應格式的命令代碼,可實現與ENC28J60的數據通信。需要指出的是,對PHY寄存器不能通過SPI口直接讀寫,而是通過特殊的MII寄存器來完成讀寫操作。
ENC28J60與STM32F103VET6的連接是通過SPI實現的,STM32F103VET6可通過SPI接口發送命令,訪問ENC28J60的相關寄存器來完成相應的操作。下面給出SPI讀/寫數據,以及ENC28J60接收/發送數據包的部分源代碼:

ENC28J60內的MAC在發送時會自動生成前導符和幀起始定界符。此外,MAC可根據配置生成填充和CRC字段。但主控制器必須生成所有其他幀字段,并將它們寫入緩沖存儲器,以待發送。ENC28J60發送數據包主要源代碼如下:

ENC28J60收到一個完整的以太網數據包后,會向CPU發出中斷請求,CPU響應ENC28J60的中斷申請后,系統將進入中斷服務程序并開始接收數據。ENC28J60接收數據包主要源代碼如下:

由ENC28J60構成的嵌入式以太網接口電路25 連接簡單,功能強大,與目前大多數需要并行數據和地址總線的以太網相比,不需要外擴地址和數據總線,并且完全符合未來工業以太網的發展趨勢。此外,本設計應用在智能儀表中,可使現場設備方便地接入以太網,以便更好地實現管控一體化;克服了市場上已有以太網控制器封裝引腳多的缺點,簡化了設計,減小了占板空間。該接口電路實現方便,可以廣泛應用于控制領域。
[1] 祁樹勝.SPI接口以太網控制器ENC28J60及其應用[J].微計算機信息,2006,8(2):266-268.
[2] 王廷堯.以太網技術與應用[M].北京:人民郵電出版社,2005.
[3] 陳磊,馮冬芹,金建祥,等.以太網在工業應用中的實時特性研究[J].浙江大學學報:工學版,2004,38(6):29-31.
[4] 李寧.基于 MDK的STM32處理器開發應用[M].北京:北京航空航天大學出版社,2008.
[5] 張瑞瑞,馬晨普.一種精簡可靠的低成本嵌入式以太網接口設計[J].電子產品世界,2006(12):66-68.
[6] 張偉業,黃云龍,陳國定.基于ENC28J60以太網通信接口的設計與實現[J].機電工程,2008,25(1):28-30.