ARM9嵌入式系統(tǒng)的設計基礎教程-第7至13章-課件_第1頁
ARM9嵌入式系統(tǒng)的設計基礎教程-第7至13章-課件_第2頁
ARM9嵌入式系統(tǒng)的設計基礎教程-第7至13章-課件_第3頁
ARM9嵌入式系統(tǒng)的設計基礎教程-第7至13章-課件_第4頁
ARM9嵌入式系統(tǒng)的設計基礎教程-第7至13章-課件_第5頁
已閱讀5頁,還剩881頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章嵌入式系統(tǒng)網(wǎng)絡接口

第7章嵌入式系統(tǒng)網(wǎng)絡接口

17.1以太網(wǎng)接口

嵌入式系統(tǒng)通常使用的以太網(wǎng)協(xié)議是IEEE802.3標準。從硬件的角度看,802.3模型層間結構如圖7.1.1所示,以太網(wǎng)接口電路主要由媒質接入控制MAC控制器和物理層接口(PhysicalLayer,PHY)兩大部分構成。7.1以太網(wǎng)接口

嵌入式系統(tǒng)通常使用的以太網(wǎng)協(xié)議是IEE2圖7.1.1802.3模型層間結構圖7.1.1802.3模型層間結構31.傳輸編碼在802.3版本的標準中,沒有采用直接的二進制編碼(即用0V表示“0”,用5V表示“1”),而是采用曼徹斯特編碼(ManchesterEncoding)或者差分曼徹斯特編碼(DifferentialManchesterEncoding),不同編碼形式如圖7.1.2所示。1.傳輸編碼4圖7.1.2不同編碼形式圖7.1.2不同編碼形式5其中:曼徹斯特編碼的規(guī)律是:每位中間有一個電平跳變,從高到低的跳變表示為“0”,從低到高的跳變表示為“1”。差分曼徹斯特編碼的規(guī)律是:每位的中間也有一個電平跳變,但不用這個跳變來表示數(shù)據(jù),而是利用每個碼元開始時有無跳變來表示“0”或“1”,有跳變表示“0”,無跳變表示“1”。曼徹斯特編碼和差分曼徹斯特編碼相比,前者編碼簡單,后者能提供更好的噪聲抑制性能。在802.3系統(tǒng)中,采用曼徹斯特編碼,其高電平為+0.85V,低電平信號為-0.85V,這樣指令信號電壓仍然是0V。其中:曼徹斯特編碼的規(guī)律是:每位中間有一個電平跳變,從高到低62.802.3Mac層的幀802.3Mac層的以太網(wǎng)的物理傳輸幀如表7.1.1所示。表7.1.1802.3幀的格式2.802.3Mac層的幀7●PR:同步位,用于收發(fā)雙方的時鐘同步,同時也指明了傳輸?shù)乃俾?,?6位的的二進制數(shù)101010101010…,最后2位是10。

●SD:分隔位,表示下面跟著的是真正的數(shù)據(jù)而不是同步時鐘,為8位的10101011。

●DA:目的地址,以太網(wǎng)的地址為48位(6個字節(jié))二進制地址,表明該幀傳輸給哪個網(wǎng)卡。如果為FFFFFFFFFFFF,則是廣播地址。廣播地址的數(shù)據(jù)可以被任何網(wǎng)卡接收到。

●SA:源地址,48位,表明該幀的數(shù)據(jù)是哪個網(wǎng)卡發(fā)的,即發(fā)送端的網(wǎng)卡地址,同樣是6個字節(jié)?!馮YPE:類型字段,表明該幀的數(shù)據(jù)是什么類型的數(shù)據(jù),不同協(xié)議的類型字段不同。如:0800H表示數(shù)據(jù)為IP包,0806H表示數(shù)據(jù)為ARP包,814CH是SNMP包,8137H為IPX/SPX包。小于0600H的值是用于IEEE802的,表示數(shù)據(jù)包的長度?!馪R:同步位,用于收發(fā)雙方的時鐘同步,同時也指明了傳輸8●DATA:數(shù)據(jù)段,該段數(shù)據(jù)不能超過1500B。因為以太網(wǎng)規(guī)定整個傳輸包的最大長度不能超過1514E(14B為DA,SA,TYPE)?!馪AD:填充位。由于以太網(wǎng)幀傳輸?shù)臄?shù)據(jù)包最小不能小于60B,除去(DA、SA、TYPE的14B),還必須傳輸46B的數(shù)據(jù),當數(shù)據(jù)段的數(shù)據(jù)不足46B時,后面通常是補0(也可以補其他值)?!馞CS:32位數(shù)據(jù)校驗位。32位的CRC校驗,該校驗由網(wǎng)卡自動計算,自動生成,自動校驗,自動在數(shù)據(jù)段后面填入。不需要軟件管理。●通常,PR、SD、PAD、FCS這幾個數(shù)據(jù)段都是網(wǎng)卡(包括物理層和Mac層的處理)自動產(chǎn)生的,剩下的DA、SA、TYPE、DATA這4個段的內容是由上層的軟件控制的?!馜ATA:數(shù)據(jù)段,該段數(shù)據(jù)不能超過1500B。因為以太93.以太網(wǎng)數(shù)據(jù)傳輸?shù)奶攸c●所有數(shù)據(jù)位的傳輸由低位開始,傳輸?shù)奈涣魇怯寐鼜厮固鼐幋a?!褚蕴W(wǎng)是基于沖突檢測的總線復用方法,沖突退避算法是由硬件自動執(zhí)行的?!褚蕴W(wǎng)傳輸?shù)臄?shù)據(jù)段的長度,DA+SA+TYPE+DATA+PAD最小為60B,最大為1514B?!裢ǔ5囊蕴W(wǎng)卡可以接收3種地址的數(shù)據(jù),一個是廣播地址,一個是多播地址(或者叫組播地址,在嵌入式系統(tǒng)中很少用到),一個是它自己的地址。但有時,用于網(wǎng)絡分析和監(jiān)控,網(wǎng)卡也可以設置為接收任何數(shù)據(jù)包?!袢魏蝺蓚€網(wǎng)卡的物理地址都是不一樣的,是世界上唯一的,網(wǎng)卡地址由專門機構分配。不同廠家使用不同地址段,同一廠家的任何兩個網(wǎng)卡的地址也是唯一的。根據(jù)網(wǎng)卡的地址段(網(wǎng)卡地址的前3個字節(jié))可以知道網(wǎng)卡的生產(chǎn)廠家。3.以太網(wǎng)數(shù)據(jù)傳輸?shù)奶攸c107.1.2嵌入式以太網(wǎng)接口的實現(xiàn)方法在嵌入式系統(tǒng)中增加以太網(wǎng)接口,通常有如下兩種方法實現(xiàn):(1)嵌入式處理器+網(wǎng)卡芯片這種方法只要把以太網(wǎng)芯片連接到嵌入式處理器的總線上即可。此方法通用性強,對嵌入式處理器沒有特殊要求,不受處理器的限制,但是,嵌入式處理器和網(wǎng)絡數(shù)據(jù)交換通過外部總線(通常是并行總線)交換數(shù)據(jù),速度慢,可靠性不高,電路板走線復雜。目前常見的以太網(wǎng)接口芯片,如CS8900、RTL8019/8029/8039、DM9008及DWL650無線網(wǎng)卡等。(2)帶有以太網(wǎng)接口的嵌入式處理器帶有以太網(wǎng)接口的嵌入式處理器通常是面向網(wǎng)絡應用而設計的,要求嵌入式處理器有通用的網(wǎng)絡接口(比如:MII接口),處理器和網(wǎng)絡數(shù)據(jù)交換通過內部總線,速度快。7.1.2嵌入式以太網(wǎng)接口的實現(xiàn)方法117.1.3在嵌入式系統(tǒng)中主要處理的以太網(wǎng)協(xié)議TCP/IP是一個分層的協(xié)議,包含有用于層、傳輸層、網(wǎng)絡層、數(shù)據(jù)鏈路層、物理層等。每一層實現(xiàn)一個明確的功能,對應一個或者幾個傳輸協(xié)議。每層相對于它的下層都作為一個獨立的數(shù)據(jù)包來實現(xiàn)。典型的分層和每層上的協(xié)議如表7.1.2所示。表7.1.2TCP/IP協(xié)議的典型分層和協(xié)議7.1.3在嵌入式系統(tǒng)中主要處理的以太網(wǎng)協(xié)議121.ARP(AddressResolationProtocol,地址解析協(xié)議)網(wǎng)絡層用32位的地址來標識不同的主機(即IP地址),而鏈路層使用48位的物理(MAC)地址來標識不同的以太網(wǎng)或令牌環(huán)網(wǎng)接口。只知道目的主機的IP地址并不能發(fā)送數(shù)據(jù)幀給它,必須知道目的主機網(wǎng)絡接口的物理地址才能發(fā)送數(shù)據(jù)幀。ARP的功能就是實現(xiàn)從IP地址到對應物理地址的轉換。源主機發(fā)送一份包含目的主機IP地址的ARP請求數(shù)據(jù)幀給網(wǎng)上的每個主機,稱作ARP廣播,目的主機的ARP收到這份廣播報文后,識別出這是發(fā)送端在詢問它的IP地址,于是發(fā)送一個包含目的主機IP地址及對應的物理地址的ARP回答給源主機。為了加快ARP協(xié)議解析的數(shù)據(jù),每臺主機上都有一個ARPcache存放最近的IP地址到硬件地址之間的映射記錄。其中每一項的生存時間(一般為20分鐘),這樣當在ARP的生存時間之內連續(xù)進行ARP解析的時候,不需要反復發(fā)送ARP請求了。1.ARP(AddressResolationProto132.ICMP(InternetControlMessagesProtocol,網(wǎng)絡控制報文協(xié)議)ICMP是IP層的附屬協(xié)議,IP層用它來與其他主機或路由器交換錯誤報文和其他重要控制信息。ICMP報文是在IP數(shù)據(jù)包內部被傳輸?shù)摹T贚inux或者Windows中,兩個常用的網(wǎng)絡診斷工具ping和traceroute(Windows下是Tracert),其實就是ICMP協(xié)議。2.ICMP(InternetControlMessag143.IP(InternetProtocol,網(wǎng)際協(xié)議)IP工作在網(wǎng)絡層,是TCP/IP協(xié)議族中最為核心的協(xié)議。所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)包格式傳輸(IP封裝在IP數(shù)據(jù)包中)。IP數(shù)據(jù)包最長可達65535字節(jié),其中報頭占32位。還包含各32位的源IP地址和32位的目的IP地址。TTL(time-to-live,生存時間字段)指定了IP數(shù)據(jù)包的生存時間(數(shù)據(jù)包可以經(jīng)過的最多路由器數(shù))。TTL的初始值由源主機設置,一旦經(jīng)過一個處理它的路由器,它的值就減去1。當該字段的值為0時,數(shù)據(jù)包就被丟棄,并發(fā)送ICMP報文通知源主機重發(fā)。IP提供不可靠、無連接的數(shù)據(jù)包傳送服務,高效、靈活。不可靠(unreliable)的意思是它不能保證IP數(shù)據(jù)包能成功地到達目的地。如果發(fā)生某種錯誤,IP有一個簡單的錯誤處理算法:丟棄該數(shù)據(jù)包,然后發(fā)送ICMP消息報給信源端。任何要求的可靠性必須由上層來提供(如TCP)。3.IP(InternetProtocol,網(wǎng)際協(xié)議)15無連接(connectionless)的意思是IP并不維護任何關于后續(xù)數(shù)據(jù)包的狀態(tài)信息。每個數(shù)據(jù)包的處理是相互獨立的。IP數(shù)據(jù)包可以不按發(fā)送順序接收。如果一信源向相同的信宿發(fā)送兩個連續(xù)的數(shù)據(jù)包(先是A,然后是B),每個數(shù)據(jù)包都是獨立地進行路由選擇,可能選擇不同的路線,因此B可能在A到達之前先到達。IP的路由選擇:源主機IP接收本地TCP、UDP、ICMP、GMP的數(shù)據(jù),生成IP數(shù)據(jù)包,如果目的主機與源主機在同一個共享網(wǎng)絡上,那么IP數(shù)據(jù)包就直接送到目的主機上。否則就把數(shù)據(jù)包發(fā)往一默認的路由器上,由路由器來轉發(fā)該數(shù)據(jù)包。最終經(jīng)過數(shù)次轉發(fā)到達目的主機。IP路由選擇是逐跳(hop-by-hop)進行的。所有的IP路由選擇只為數(shù)據(jù)包傳輸提供下一站路由器的IP地址。無連接(connectionless)的意思是IP并不維護164.TCP(TransferControlProtocol,傳輸控制協(xié)議)TCP協(xié)議是一個面向連接的可靠的傳輸層協(xié)議。TCP為兩臺主機提供高可靠性的端到端數(shù)據(jù)通信。它所做的工作包括:①發(fā)送方把應用程序交給它的數(shù)據(jù)分成合適的小塊,并添加附加信息(TCP頭),包括順序號,源、目的端口,控制、糾錯信息等字段,稱為TCP數(shù)據(jù)包。并將TCP數(shù)據(jù)包交給下面的網(wǎng)絡層處理。②接受方確認接收到的TCP數(shù)據(jù)包,重組并將數(shù)據(jù)送往高層。4.TCP(TransferControlProtoco175.UDP(UserDatagramProtocol,用戶數(shù)據(jù)包協(xié)議)UDP協(xié)議是一種無連接不可靠的傳輸層協(xié)議。它只是把應用程序傳來的數(shù)據(jù)加上UDP頭(包括端口號,段長等字段),作為UDP數(shù)據(jù)包發(fā)送出去,但是并不保證它們能到達目的地??煽啃杂蓱脤觼硖峁?。因為協(xié)議開銷少,和TCP協(xié)議相比,UDP更適用于應用在低端的嵌入式領域中。很多場合如網(wǎng)絡管理SNMP,域名解析DNS,簡單文件傳輸協(xié)議TFTP,大都使用UDP協(xié)議。5.UDP(UserDatagramProtocol,用186.端口TCP和UDP采用16位的端口號來識別上層的TCP用戶,即上層應用協(xié)議,如FTP和TELNET等。常見的TCP/IP服務都用眾所周知的1~255之間的端口號。例如FTP服務的TCP端口號都是21,Telnet服務的TCP端口號都是23。TFTP(簡單文件傳輸協(xié)議)服務的UDP端口號都是69。256~1023之間的端口號通常都是提供一些特定的UNIX服務。TCP/IP臨時端口分配1024~5000之間的端口號。6.端口197.1.4網(wǎng)絡編程接口BSD套接字(BSDSockets)使用的最廣泛的網(wǎng)絡程序編程方法,主要用于應用程序的編寫,用于網(wǎng)絡上主機與主機之間的相互通信。很多操作系統(tǒng)都支持BSD套接字編程。例如,UNIX、Linux、VxWorks、Windows的Winsock基本上是來自BSDSockets。套接字(Sockets)分為StreamSockets和DataSockets。StreamSockets是可靠性的雙向數(shù)據(jù)傳輸,對應使用TCP協(xié)議傳輸數(shù)據(jù);DataSockets是不可靠連接,對應使用UDP協(xié)議傳輸數(shù)。7.1.4網(wǎng)絡編程接口20下面給出一個使用套接字接口的UDP通信的流程。UDP服務器端和一個UDP客戶端通信的程序過程:(1)創(chuàng)建一個Socket:sFd=socket(AF_INET,SOCK_DGRAM,0)(2)把Socket和本機的IP,UDP口綁定:bind(sFd,(structsockaddr*)&serverAddr,sockAddrSize)(3)循環(huán)等待,接收(recvfrom)或者發(fā)送(sendfrom)信息。(4)關閉Socket,通信終止:close(sFd)下面給出一個使用套接字接口的UDP通信的流程。217.1.5以太網(wǎng)的物理層接口及編程大多數(shù)ARM都內嵌一個以太網(wǎng)控制器,支持媒體獨立接口(MediaIndependentInterfaceMII)和帶緩沖DMA接口(BufferedDMAInterface,BDI),可在半雙工或全雙工模式下提供10M/100Mbps的以太網(wǎng)接入。在半雙工模式下,控制器支持CSMA/CD協(xié)議;在全雙工模式下,支持IEEE802.3MAC控制層協(xié)議。ARM內部雖然包含了以太網(wǎng)MAC控制,但并未提供物理層接口,因此,需外接一片物理層芯片以提供以太網(wǎng)的接入通道。常用的單口10M/100Mbps高速以太網(wǎng)物理層接口器件均提供MII接口和傳統(tǒng)7線制網(wǎng)絡接口,可方便地與ARM接口。以太網(wǎng)物理層接口器件主要功能一般包括:物理編碼子層、物理媒體附件、雙絞線物理媒體子層、10BASE-TX編碼/解碼器和雙絞線媒體訪問單元等。如CS8900、RTL8019/8029/8039等。7.1.5以太網(wǎng)的物理層接口及編程22CS8900A是CirrusLogic公司生產(chǎn)的16位以太網(wǎng)控制器,芯片內嵌片內RAM10BASE-T收發(fā)濾波器,直接ISA總線接口。該芯片的物理層接口、數(shù)據(jù)傳輸模式和工作模式等都能根據(jù)需要而動態(tài)調整,通過內部寄存器的設置來適應不同的應用環(huán)境。CS8900A采用3V供電電壓,最大工作電流55mA,具有全雙工通信方式,可編程發(fā)送功能,數(shù)據(jù)碰撞自動重發(fā),自動打包及生成CRC校驗碼,可編程接收功能,自動切換于DMA和片內RAM,提前產(chǎn)生中斷便于數(shù)據(jù)幀預處理,數(shù)據(jù)流可降低CPU消耗,自動阻斷錯誤包,可跳線控制EEPROM功能,啟動編程支持無盤系統(tǒng),邊沿掃描和回環(huán)測試,待機和睡眠模式,支持廣泛的軟件驅動,工業(yè)級溫度范圍,LED指示連接狀態(tài)和網(wǎng)絡活動情況等特點。采用TQFP-100封裝。CS8900A內部結構方框圖如圖7.1.3所示。CS8900A是CirrusLogic公司生產(chǎn)的16位以太23圖7.1.3CS8900A內部結構方框圖圖7.1.3CS8900A內部結構方框圖241.CS8900A工作原理CS8900A有兩種工作模式:和I/O模式。當配置成MEMORYMODE模式操作時,CS8900A的內部寄存器和幀緩沖區(qū)映射到主機內存中連續(xù)的4KB的塊中,主機可以通過這個塊直接訪問CS8900A的內部寄存器和幀緩沖區(qū)。MEMORY模式需要硬件上多根地址線和網(wǎng)卡相連。而在I/OMODE模式,對任何寄存器操作均要通過I/O端口0寫入或讀出。I/OMODE模式在硬件上實現(xiàn)比較方便,而且這也是芯片的默認模式。在I/O模式下,PacketPage存儲器被映射到CPU的8個16位的I/O端口上。在芯片被加電后,I/O基地址的默認值被置為300H。1.CS8900A工作原理25使用CS8900A作為以太網(wǎng)的物理層接口,在收到由主機發(fā)來的數(shù)據(jù)報后(從目的地址域到數(shù)據(jù)域),偵聽網(wǎng)絡線路。如果線路忙,它就等到線路空閑為止,否則,立即發(fā)送該數(shù)據(jù)幀。在發(fā)送過程中,首先它添加以太網(wǎng)幀頭(包括前導字段和幀開始標志),然后生成CRC校驗碼,最后將此數(shù)據(jù)幀發(fā)送到以太網(wǎng)上。在接收過程中,它將從以太網(wǎng)收到的數(shù)據(jù)幀在經(jīng)過解碼、去幀頭和地址檢驗等步驟后緩存在片內。在CRC校驗通過后,它會根據(jù)初始化配置情況,通知主機CS8900A收到了數(shù)據(jù)幀,最后,用某種傳輸模式(FO模式、Memory模式、DMA模式)傳到主機的存儲區(qū)中。使用CS8900A作為以太網(wǎng)的物理層接口,在收到由主機發(fā)來的262.CS8900A引腳端和功能CS8900A的ISA總線接口引腳端和功能如表7.1.3所示,EEPROM和引導編程接口引腳端和功能如表7.1.4所示,IOBASE-T接口引腳端和功能如表7.1.5所示,附加單元接口AUD引腳端和功能如表7.1.6所示,通用引腳端和功能如表7.1.7所示。2.CS8900A引腳端和功能27引腳類型功能SA[0:19]I地址總線SD[0:15]I/O雙向數(shù)據(jù)總線,三態(tài)輸出RESETI復位輸入端,高電平有效(至少保持400ns)AENI地址使能,高電平有效MEMRI存儲器讀信號,低電平有效MEMWI存儲器寫信號,低電平有效MEMCS16O存儲器16位選擇信號,OC(集電極開路)輸出REFRESHI刷新信號,低電平有效。當REFRESH為低電平時,MEMR,MEMW,IOR,IOW,DMACK0,DMACKl和DMACK2都被忽略引腳類型功能SA[0:19]I地址總線SD[0:15]I/O28表7.1.3ISA總線接口引腳端和功能IORII/O讀信號,低電平有效IOWII/O寫信號,低電平有效IOCS16I16位I/O片選信號,低電平有效IOCHRDYOI/O通道就緒信號,OC(集電極開路)輸出SBHEI系統(tǒng)總線高位使能信號,低電平有效INTRQ[0:2]O中斷請求信號,三態(tài)輸出DMARQ[0:2]ODMA請求信號,三態(tài)輸出DMACK[0:2]IDMA應答信號,低電平有效CHIPSELI片選信號,低電平有效表7.1.3ISA總線接口引腳端和功能IORII/O讀信29表7.1.4EEPROM和引導編程接口引腳端和功能引腳類型功能EESKIEEPROM時鐘輸入信號EECSIEEPROM片選輸入信號,低電平有效EEDataINIEEPROM數(shù)據(jù)輸入,內部上拉ELCSI外部邏輯片選信號,內部上拉EEDataOUTOEEPROM數(shù)據(jù)輸出CSOUTO外部引導編程選擇信號輸出,低電平有效表7.1.4EEPROM和引導編程接口引腳端和功能引腳類30表7.1.5IOBASE-T接口引腳端引腳類型功能TXD+/TXDO數(shù)據(jù)發(fā)送,差分對管輸出RXD+/RXDI數(shù)據(jù)接收,差分對管輸入表7.1.5IOBASE-T接口引腳端引腳類型功能TXD31表7.1.6附加單元接口引腳端和功能引腳類型功能DO+/DOOAUI數(shù)據(jù)輸出,差分對管輸出DI+/DIIAUI數(shù)據(jù)輸入,差分對管輸入CI+/CIIAUI振動輸入,差分對管輸入表7.1.6附加單元接口引腳端和功能引腳類型功能DO+/32表7.1.7通用引腳端和功能引腳類型功能XTAL[1:2]I/O晶體振蕩器輸入/輸出SLEEPI硬件睡眠控制輸入信號,低電平有效,內部上拉LINKLED/HCOO線路正常輸出信號或主控制器輸出0信號,低電平有效,OC(集電極開路)輸出BSTAUTS/HC1O總線狀態(tài)輸出信號或主控制器輸出1信號,低電平有效,OC(集電極開路)輸出LANLEDO網(wǎng)絡狀態(tài)指示輸出信號,OC(集電極開路)輸出TESTI測試輸入使能信號,低電平有效,內部上拉RESI基準電阻輸入端DVDD[1:4]I數(shù)字電路電源DVSS[1:4]I數(shù)字電路地AVDD[1:4]I模擬電路電源AVSS[1:4]I模擬電路地表7.1.7通用引腳端和功能引腳類型功能XTAL[1:333.電路連接

采用CS8900A與S3C2410A連接構成的以太網(wǎng)接口電路如圖7.1.4所示。3.電路連接

采用CS8900A與S3C2410A連接構成344.CS8900A的以太網(wǎng)接口驅動程序[于明](1)初始化函數(shù)初始化函數(shù)完成設備的初始化功能,由數(shù)據(jù)結構device中的init函數(shù)指針來調用。加載網(wǎng)絡驅動模塊后,就會調用初始化過程。首先通過檢測物理設備的硬件特征來檢測網(wǎng)絡物理設備是否存在,之后配置設備所需要的資源。比如,中斷。這些配置完成之后就要構造設備的數(shù)據(jù)結構device,用檢測到的數(shù)據(jù)初始化device中的相關變量,最后向Linux內核中注冊該設備并申請內存空間。函數(shù)定義為:4.CS8900A的以太網(wǎng)接口驅動程序[于明]35staticint__initinit_cs8900a_s3c2410(void){structnet_local*lp;intret=0;dev_cs89x0.irq=irq;dev_cs89x0.base_addr=io;dev_cs89x0.init=cs89x0_probe;dev_cs89x0.priv=kmalloc(sizeof(structnet_local),GFP_KERNEL);if(dev_cs89x0.priv==0){printk(KERN_ERR"cs89x0.c:Outofmemory.\n");return-ENOMEM;}memset(dev_cs89x0.priv,0,sizeof(structnet_local));

staticint__initinit_cs8900a36lp=(structnet_local*)dev_cs89x0.priv;request_region(dev_cs89x0.base_addr,NETCARD_IO_EXTENT,"cs8900a");spin_lock_init(&lp->lock);/*boy,they'dbettergettheseright*/if(!strcmp(media,"rj45"))lp->adapter_cnf=A_CNF_MEDIA_10B_T|A_CNF_10B_T;elseif(!strcmp(media,"aui"))lp->adapter_cnf=A_CNF_MEDIA_AUI|A_CNF_AUI;elseif(!strcmp(media,"bnc"))lp->adapter_cnf=A_CNF_MEDIA_10B_2|A_CNF_10B_2;elselp->adapter_cnf=A_CNF_MEDIA_10B_T|A_CNF_10B_T;lp=(structnet_local*)dev_c37if(duplex==1)lp->auto_neg_cnf=AUTO_NEG_ENABLE;if(io==0){printk(KERN_ERR"cs89x0.c:Moduleautoprobingnotallowed.\n");printk(KERN_ERR"cs89x0.c:Appendio=0xNNN\n");ret=-EPERM;gotoout;}if(register_netdev(&dev_cs89x0)!=0){printk(KERN_ERR"cs89x0.c:Nocardfoundat0x%x\n",io);ret=-ENXIO;gotoout;}if(duplex==1)38out:if(ret)kfree(dev_cs89x0.priv);returnret;}在這個網(wǎng)絡設備驅動程序中,設備的數(shù)據(jù)結構device就是dev_cs89x0。探測網(wǎng)絡物理設備是否存在,利用cs89x0_probe函數(shù)實現(xiàn),通過調用register_netdrv(structnet_device*dev)函數(shù)進行注冊。與init函數(shù)相對應的cleanup函數(shù)在模塊卸載時運行,主要完成資源的釋放工作,如取消設備注冊、釋放內存、釋放端口等。函數(shù)定義為:out:39staticvoid__exitcleanup_cs8900a_s3c2410(void){if(dev_cs89x0.priv!=NULL){/*Freeuptheprivatestructure,orleakmemory:-)*/unregister_netdev(&dev_cs89x0);outw(PP_ChipID,dev_cs89x0.base_addr+ADD_PORT);kfree(dev_cs89x0.priv);dev_cs89x0.priv=NULL; /*getsre-allocatedbycs89x0_probe1*//*Ifwedon'tdothis,wecan'tre-insmoditlater.*/release_region(dev_cs89x0.base_addr,NETCARD_IO_EXTENT);}}staticvoid__exitcleanup_cs840(2)打開函數(shù)打開函數(shù)在網(wǎng)絡設備驅動程序中是在網(wǎng)絡設備被激活時調用,即設備狀態(tài)由down至up。函數(shù)定義為:staticintnet_open(structnet_device*dev){structnet_local*lp=(structnet_local*)dev->priv;intret;writereg(dev,PP_BusCTL,readreg(dev,PP_BusCTL)&~ENABLE_IRQ);

ret=request_irq(dev->irq,&net_interrupt,SA_SHIRQ,"cs89x0",dev);if(ret){printk("%s:request_irq(%d)failed\n",dev->name,dev->irq);gotobad_out;}(2)打開函數(shù)41if(lp->chip_type==CS8900)writereg(dev,PP_CS8900_ISAINT,0);elsewritereg(dev,PP_CS8920_ISAINT,0);writereg(dev,PP_BusCTL,MEMORY_ON);lp->linectl=0;writereg(dev,PP_LineCTL,readreg(dev,PP_LineCTL)|SERIAL_RX_ON|SERIAL_TX_ON);lp->rx_mode=0;writereg(dev,PP_RxCTL,DEF_RX_ACCEPT);lp->curr_rx_cfg=RX_OK_ENBL|RX_CRC_ERROR_ENBL;if(lp->isa_config&STREAM_TRANSFER)if(lp->chip_type==CS8900)42lp->curr_rx_cfg|=RX_STREAM_ENBL;writereg(dev,PP_RxCFG,lp->curr_rx_cfg);writereg(dev,PP_TxCFG,TX_LOST_CRS_ENBL|TX_SQE_ERROR_ENBL|TX_OK_ENBL|TX_LATE_COL_ENBL|TX_JBR_ENBL|TX_ANY_COL_ENBL|TX_16_COL_ENBL);writereg(dev,PP_BufCFG,READY_FOR_TX_ENBL|RX_MISS_COUNT_OVRFLOW_ENBL|TX_COL_COUNT_OVRFLOW_ENBL|TX_UNDERRUN_ENBL);lp->curr_rx_cfg|=RX_STREAM_E43writereg(dev,PP_BusCTL,readreg(dev,PP_BusCTL)|ENABLE_IRQ);enable_irq(dev->irq);netif_start_queue(dev);DPRINTK(1,"cs89x0:net_open()succeeded\n");return0;bad_out:returnret;}writereg(dev,PP_BusCTL,readr44打開函數(shù)中對寄存器操作使用了兩個函數(shù):readreg和writereg。readreg函數(shù)用來讀取寄存器內容,writereg函數(shù)用來寫寄存器。函數(shù)定義為:inlineintreadreg(structnet_device*dev,intportno){outw(portno,dev->base_addr+ADD_PORT);returninw(dev->base_addr+DATA_PORT);}inlinevoidwritereg(structnet_device*dev,intportno,intvalue){outw(portno,dev->base_addr+ADD_PORT);outw(value,dev->base_addr+DATA_PORT);}打開函數(shù)中對寄存器操作使用了兩個函數(shù):readreg和wri45(3)關閉函數(shù)關閉函數(shù)釋放資源減少系統(tǒng)負擔,設備狀態(tài)有up轉為down時被調用。函數(shù)定義為:staticintnet_close(structnet_device*dev){netif_stop_queue(dev);writereg(dev,PP_RxCFG,0);writereg(dev,PP_TxCFG,0);writereg(dev,PP_BufCFG,0);writereg(dev,PP_BusCTL,0);free_irq(dev->irq,dev);/*Updatethestatisticshere.*/return0;}(3)關閉函數(shù)46(4)發(fā)送函數(shù)首先,在網(wǎng)絡設備驅動加載時,通過device域中的init函數(shù)指針調用網(wǎng)絡設備的初始化函數(shù)對設備進行初始化,如果操作成功,就可以通過device域中的open函數(shù)指針調用網(wǎng)絡設備的打開函數(shù)打開設備,再通過device域中的包頭函數(shù)指針hard_header來建立硬件包頭信息。最后,通過協(xié)議接口層函數(shù)dev_queue_xmit調用device域中的hard_start_xmit函數(shù)指針來完成數(shù)據(jù)包的發(fā)送。如果發(fā)送成功,hard_start_xmit釋放sk_buff,返回0。如果設備暫時無法處理,比如,硬件忙,則返回l。此時如果dev->tbusy置為非0,則系統(tǒng)認為硬件忙,要等到dev->tbusy置0以后才會再次發(fā)送。tbusy的置0任務一般由中斷完成。硬件在發(fā)送結束會產(chǎn)生中斷,這時可以把tbusy置0,然后用mark_bh()調用通知系統(tǒng)可以再次發(fā)送。在CS8900A驅動程序中,網(wǎng)絡設備的傳輸函數(shù)dev->hard_start__xmit定義為net_send_packet:(4)發(fā)送函數(shù)47staticintnet_send_packet(structsk_buff*skb,structnet_device*dev){structnet_local*lp=(structnet_local*)dev->priv;writereg(dev,PP_BusCTL,0x0);writereg(dev,PP_BusCTL,readreg(dev,PP_BusCTL)|ENABLE_IRQ);DPRINTK(3,"%s:sent%dbytepacketoftype%x\n",dev->name,skb->len,(skb->data[ETH_ALEN+ETH_ALEN]<<8)|(skb->data[ETH_ALEN+ETH_ALEN+1]));spin_lock_irq(&lp->lock);netif_stop_queue(dev);/*initiateatransmitsequence*/staticintnet_send_packet(str48writeword(dev,TX_CMD_PORT,lp->send_cmd);writeword(dev,TX_LEN_PORT,skb->len);/*Testtoseeifthechiphasallocatedmemoryforthepacket*/if((readreg(dev,PP_BusST)&READY_FOR_TX_NOW)==0){spin_unlock_irq(&lp->lock);DPRINTK(1,"cs89x0:Txbuffernotfree!\n");return1;}/*Writethecontentsofthepacket*/writeblock(dev,skb->data,skb->len);spin_unlock_irq(&lp->lock);dev->trans_start=jiffies;dev_kfree_skb(skb);return0;}writeword(dev,TX_CMD_PORT,l49(5)中斷處理和接收函數(shù)網(wǎng)絡設備接收數(shù)據(jù)通過中斷實現(xiàn),當數(shù)據(jù)收到后,產(chǎn)生中斷,在中斷處理程序中驅動程序申請一塊sk_buff(skb),從硬件讀出數(shù)據(jù)放置到申請好的緩沖區(qū)里。接下來,填充sk_buff中的一些信息。處理完后,如果是獲得數(shù)據(jù)包,則執(zhí)行數(shù)據(jù)接收子程序,該函數(shù)被中斷服務程序調用。函數(shù)定義:staticvoidnet_rx(structnet_device*dev){structnet_local*lp=(structnet_local*)dev->priv;structsk_buff*skb;intstatus,length;intioaddr=dev->base_addr;status=inw(ioaddr+RX_FRAME_PORT);(5)中斷處理和接收函數(shù)50if((status&RX_OK)==0){count_rx_errors(status,lp);return;}length=inw(ioaddr+RX_FRAME_PORT);/*Mallocupnewbuffer.*/skb=dev_alloc_skb(length+2);if(skb==NULL){lp->stats.rx_dropped++;return;}if((status&RX_OK)==0)51skb_reserve(skb,2),/*longwordalignL3header*/skb->len=length;skb->dev=dev;readblock(dev,skb->data,skb->len);DPRINTK(3,"%s:received%dbytepacketoftype%x\n",dev->name,length,(skb->data[ETH_ALEN+ETH_ALEN]<<8|skb->data[ETH_ALEN+ETH_ALEN+1]);

skb->protocol=eth_type_trans(skb,dev);netif_rx(skb);dev->last_rx=jiffies;lp->stats.rx_packets++;lp->stats.rx_bytes+=length;}skb_reserve(skb,2),/*longwo52在net_rx()函數(shù)中調用netif_rx()把數(shù)據(jù)傳送到協(xié)議層。netif_rx()函數(shù)把數(shù)據(jù)放入處理隊列,然后返回,真正的處理是在中斷返回以后,這樣可以減少中斷時間。調用netif_rx()后,驅動程序不能再存取數(shù)據(jù)緩沖區(qū)if_rx()函數(shù)在net/core/dev.c中定義為:intnetif_rx(structsk_buff*skb){intthis_cpu=smp_processor_id();structsoftnet_data*queue;unsignedlongflags;if(skb->stamp_sec==0) do_gettimeofday(&skb->stamp);queue=&softnet_data[this_cpu];local_irq_save(flags);在net_rx()函數(shù)中調用netif_rx()把數(shù)據(jù)傳送到53netdev_rx_stat[this_cpu].total++;if(queue->input_pkt_queue.qlen<=netdev_max_backlog){if(queue->input_pkt_queue.qlen){if(queue->throttle) gotodrop;enqueue: dev_hold(skb->dev);__skb_queue_tail(&queue->input_pkt_queue,skb);cpu_raise_softirq(this_cpu,NET_RX_SOFTIRQ);local_irq_restore(flags);#ifndefOFFLINE_SAMPLEget_sample_stats(this_cpu);#endifreturnsoftnet_data[this_cpu]g_level;}netdev_rx_stat[this_cpu].total54if(queue->throttle){queue->throttle=0;#ifdefCONFIG_NET_HW_FLOWCONTROLif(atomic_dec_and_test(&netdev_dropping)) netdev_wakeup();#endif}gotoenqueue;}if(queue->throttle==0){queue->throttle=1;netdev_rx_stat[this_cpu].throttled++;#ifdefCONFIG_NET_HW_FLOWCONTROLif(queue->throttle)55atomic_inc(&netdev_dropping);#endif}drop: netdev_rx_stat[this_cpu].dropped++;local_irq_restore(flags);kfree_skb(skb);returnNET_RX_DROP;}中斷函數(shù)net_interrupt在打開函數(shù)中申請,中斷發(fā)生后,首先驅動中斷管腳為高電平,然后主機讀取CS8900A中的中斷申請序列ISQ值,以確定事件類型,根據(jù)事件類型做出響應。函數(shù)定義為:atomic_inc(&netdev_dropping);56staticvoidnet_interrupt(intirq,void*dev_id,structpt_regs*regs){

structnet_device*dev=dev_id;structnet_local*lp;intioaddr,status;ioaddr=dev->base_addr;lp=(structnet_local*)dev->priv;

while((status=readword(dev,ISQ_PORT))){DPRINTK(4,"%s:event=%04x\n",dev->name,status);switch(status&ISQ_EVENT_MASK){caseISQ_RECEIVER_EVENT:/*Gotapacket(s).*/staticvoidnet_interrupt(int57net_rx(dev);break;caseISQ_TRANSMITTER_EVENT:lp->stats.tx_packets++;netif_wake_queue(dev); /*Informupperlayers.*/if((status&( TX_OK|TX_LOST_CRS|TX_SQE_ERROR|TX_LATE_COL|TX_16_COL))!=TX_OK){if((status&TX_OK)==0)lp->stats.tx_errors++;if(status&TX_LOST_CRS)lp->stats.tx_carrier_errors++;if(status&TX_SQE_ERROR)lp->stats.tx_heartbeat_errors++;if(status&TX_LATE_COL)lp->stats.tx_window_errors++;if(status&TX_16_COL)lp->stats.tx_aborted_errors++;}break;net_rx(dev);58caseISQ_BUFFER_EVENT:if(status&READY_FOR_TX){netif_wake_queue(dev); /*Informupperlayers.*/}if(status&TX_UNDERRUN){DPRINTK(1,"%s:transmitunderrun\n",dev->name);lp->send_underrun++;if(lp->send_underrun==3) lp->send_cmd=TX_AFTER_381;elseif(lp->send_underrun==6) lp->send_cmd=TX_AFTER_ALL;netif_wake_queue(dev); /*Informupperlayers.*/}break;caseISQ_BUFFER_EVENT:59caseISQ_RX_MISS_EVENT:lp->stats.rx_missed_errors+=(status>>6);break;caseISQ_TX_COL_EVENT:lp->stats.collisions+=(status>>6);break;}}}caseISQ_RX_MISS_EVENT:60

7.2CAN總線接口7.2.1CAN總線概述CAN(ControllerAreaNetwork,控制器局域網(wǎng))是德國Bosch公司于1983年為汽車應用而開發(fā)的,它是一種現(xiàn)場總線(FieldBus),能有效支持分布式控制和實時控制的串行通信網(wǎng)絡。1993年11月,ISO正式頒布了控制器局域網(wǎng)CAN國際標準(IS011898)。一個理想的由CAN總線構成的單一網(wǎng)絡中可以掛接任意多個節(jié)點,實際應用中節(jié)點數(shù)目受網(wǎng)絡硬件的電氣特性所限制。例如:當使用PhilipsP82C250作為CAN收發(fā)器時,同一網(wǎng)絡中允許掛接110個節(jié)點。CAN可提供1Mb/s的數(shù)據(jù)傳輸速率。CAN總線是一種多主方式的串行通信總線?;驹O計規(guī)范要求有高的位速率,高抗電磁干擾性,并可以檢測出產(chǎn)生的任何錯誤。當信號傳輸距離達到10Km時CAN總線仍可提供高達50Kb/s的數(shù)據(jù)傳輸速率。CAN總線具有很高的實時性能,已經(jīng)在汽車工業(yè)、航空工業(yè)、工業(yè)控制、安全防護等領域中得到了廣泛應用。

7.2CAN總線接口7.2.1CAN總線概述61CAN總線的通信介質可采用雙絞線、同軸電纜和光導纖維,最常用的是雙絞線。通信距離與波特率有關,最大通信距離可達10km,最大通信波特率可達1Mbps。CAN總線仲裁采用11位標識和非破壞性位仲裁總線結構機制,可以確定數(shù)據(jù)塊的優(yōu)先級,保證在網(wǎng)絡節(jié)點沖突時最高優(yōu)先級節(jié)點不需要沖突等待。CAN總線采用了多主競爭式總線結構,具有多主站運行和分散仲裁的串行總線以及廣播通信的特點。CAN總線上任意節(jié)點可在任意時刻主動向網(wǎng)絡上其他節(jié)點發(fā)送信息而不分主次,因此可在各節(jié)點之間實現(xiàn)自由通信。CAN總線信號使用差分電壓傳送,兩條信號線被稱為CAN_H和CAN_L,靜態(tài)時均是2.5V左右,此時狀態(tài)表示為邏輯1,也可以叫做“隱性”。采用CAN_H比CAN_L高表示邏輯0,稱為“顯性”,通常電壓值為CAN_H=3.5V和CAN_L=1.5V。當“顯性”位和“隱性”位同時發(fā)送的時候,最后總線數(shù)值將為“顯性”。CAN總線的一個位時間可以分成四個部分:同步段,傳播時間段,相位緩沖段1和相位緩沖段2。每段的時間份額的數(shù)目都是可以通過CAN總線控制器編程控制,而時間份額的大小tq由系統(tǒng)時鐘tsys和波特率預分頻值BRP決定:tq=BRP/tsys。圖7.2.1說明了CAN總線的一個位時間的各個組成部分。CAN總線的通信介質可采用雙絞線、同軸電纜和光導纖維,最常用62圖7.2.1CAN總線的一個位時間圖7.2.1CAN總線的一個位時間63●同步段:用于同步總線上的各個節(jié)點,在此段內期望有一個跳變沿出現(xiàn)(其長度固定)。如果跳變沿出現(xiàn)在同步段之外,那么沿與同步段之間的長度叫做沿相位誤差。采樣點位于相位緩沖段1的末尾和相位緩沖段2開始處?!駛鞑r間段:用于補償總線上信號傳播時間和電子控制設備內部的延遲時間。因此,要實現(xiàn)與位流發(fā)送節(jié)點的同步,接收節(jié)點必須移相。CAN總線非破壞性仲裁規(guī)定,發(fā)送位流的總線節(jié)點必須能夠收到同步于位流的CAN總線節(jié)點發(fā)送的顯性位?!裣辔痪彌_段1:重同步時可以暫時延長?!裣辔痪彌_段2:重同步時可以暫時縮短。●同步跳轉寬度:長度小于相位緩沖段。同步段,傳播時間段,相位緩沖段1和相位緩沖段2的設定和CAN總線的同步、仲裁等信息有關。其主要思想是要求各個節(jié)點在一定誤差范圍內保持同步。必須考慮各個節(jié)點時鐘(振蕩器)的誤差和總線的長度帶來的延遲(通常每米延遲為5.5ns)。正確設置CAN總線各個時間段,是保證CAN總線良好工作的關鍵?!裢蕉危河糜谕娇偩€上的各個節(jié)點,在此段內期望有一個跳647.2.2在嵌入式處理器上擴展CAN總線接口一些面向工業(yè)控制的嵌入式處理器本身就集成了一個或者多個CAN總線控制器。例如:韓國現(xiàn)代公司的hms30c7202(ARM720T內核)帶有兩個CAN總線控制器;Phillips公司的LPC2194和LPC2294(ARM7TDMI內核)帶有4個CAN總線控制器。CAN總線控制器主要是完成時序邏輯轉換等工作,要在電氣特性上滿足CAN總線標準,還需要一個CAN總線的物理層芯片,用它來實現(xiàn)TTL電平到CAN總線電平特性的轉換,即CAN收發(fā)器。實際上,多數(shù)嵌入式處理器都不帶CAN總線控制器。通常的解決方案是在嵌入式處理器的外部總線上擴展CAN總線接口芯片,例如:Phillips公司的SJA1000CAN總線接口芯片,Microchip公司的MCP251x系列(MCP2510和MCP2515)CAN總線接口芯片,這兩種芯片都支持CAN2.0B標準。SJA1000的總線采用的是地址線和數(shù)據(jù)線復用的方式,多數(shù)嵌入式處理器采用SJA1000擴展CAN總線較為復雜。7.2.2在嵌入式處理器上擴展CAN總線接口65MCP2510是由Microchip公司生產(chǎn)的CAN協(xié)議控制器,完全支持CAN總線V2.OA/B技術規(guī)范。0~8字節(jié)的有效數(shù)據(jù)長度,支持遠程幀;最大1Mb/s的可編程波特率;兩個支持過濾器Filter,Mask)的接收緩沖區(qū),三個發(fā)送緩沖區(qū);支持回環(huán)(LoopBack)模式,便于測試;SPI高速串行總線,最大5MHz;3V到5.5V供電。MCP2510主要由CAN協(xié)議引擎,用來為器件及其運行進行配置的控制邏輯,SRAM寄存器和SPI協(xié)議模塊3部分組成。MCP2510支持CANT2、CAN2.0A、主動和被動CAN2.0B等版本的協(xié)議,能夠發(fā)送和接收標準和擴展報文,還同時具備驗收過濾以及報文管理功能。MCP2510包含三個發(fā)送緩沖器和兩個接收緩沖器,減少了處理器(CPU)的管理負擔。CPU的通信是通過行業(yè)標準串行外設接口(SPI)來實現(xiàn)的,其數(shù)據(jù)傳輸速率高達5Mbps。CPU通過SPI接口與器件進行通信。通過使用標準SPI讀/寫命令對寄存器進行所有讀/寫操作。器件上有一個多用途中斷引腳以及各接收緩沖器專用的中斷引腳,可用于指示有效報文是否被接收和載入各接收緩沖器。是否使用專用中斷引腳由用戶決定,若不使用,也可用通用中斷引腳和狀態(tài)寄存器(通過SPI接口訪問)確定有效報文是否已被接收。MCP2510是由Microchip公司生產(chǎn)的CAN協(xié)議控制661.CAN協(xié)議引擎CAN協(xié)議引擎的功能是處理所有總線上的報文發(fā)送和接收。報文發(fā)送時,首先將報文裝載到正確的報文緩沖器和控制寄存器中。利用控制寄存器位、通過SPI接口或使用發(fā)送使能引腳均可啟動發(fā)送操作。通過讀取相應的寄存器可以檢查通信狀態(tài)和錯誤。任何在CAN總線上偵測到的報文都會進行錯誤檢測,然后與用戶定義的濾波器進行匹配,以確定是否將其轉移到兩個接收緩沖器之一中。CAN協(xié)議引擎的核心是有限狀態(tài)機(FSM)。該狀態(tài)機逐位檢查報文,當各個報文幀發(fā)生數(shù)據(jù)字段的發(fā)送和接收時,狀態(tài)機改變狀態(tài)。FSM確保了報文接收、總線仲裁、報文發(fā)送以及錯誤信號發(fā)生等操作過程依據(jù)CAN總線協(xié)議進行??偩€上報文的自動重發(fā)送也由FSM處理。1.CAN協(xié)議引擎672.CAN報文幀MCP2510支持CAN2.0B技術規(guī)范中所定義的標準數(shù)據(jù)幀、擴展數(shù)據(jù)幀以及遠程幀(標準和擴展),詳細的描述請登錄microchip,查閱MCP2510數(shù)據(jù)手冊。3.寄存器映射表MCP2510寄存器映射表如表7.2.1所示。通過使用行(低4位)列(高4位)值可對映射表中的寄存器地址進行確定。寄存器的地址排列優(yōu)化了寄存器數(shù)據(jù)的順序讀/寫。一些特定控制和狀態(tài)寄存器允許使用SPI位修改命令進行單獨位的設定??梢允褂梦恍薷拿顚Ρ?.2.1中的陰影部分的寄存器進行位修改操作。2.CAN報文幀684.SPI接口MCP2510可以與許多微控制器的串行外設接口(SPI)直接相連,支持0,0和1,1運行模式。外部數(shù)據(jù)和命令通過SI引腳傳送到器件中,而數(shù)據(jù)在SCK時鐘信號的上升沿傳送進去。MCP2510在SCK下降沿通過SO引腳發(fā)送。MCP2510SPI指令如表7.2.3所示。有關0,0和1,1運行模式詳細的輸入輸出時序請登錄microchip,查閱MCP2510數(shù)據(jù)手冊。4.SPI接口69CANSPI接口函數(shù)為:unsignedcharCAN_SPI_CMD(unsignedcharcmd,unsignedlongaddr,unsignedcharargl,unsignedchararg2)其中cmd表示指令名稱,addr為寄存器地址,argl和arg2為可選的參數(shù)?!馽md為SPI_CMD_READ時,將讀取addr地址的寄存器值;argl和arg2沒有使用?!馽md為SPI_CMD_WRITE時,將往addr地址的寄存器寫argl值,arg2沒有使用。●cmd為SPI_CMD_RTS時,將發(fā)送RTS請求,argl和arg2沒有使用。●cmd為SPI_CMD_READSTA時,將讀取MCP2510的狀態(tài),并返回該狀態(tài)。CANSPI接口函數(shù)為:70●cmd為SPI_CMD_BITMOD時,將對addr地址的寄存器進行位修改。位修改命令提供了一種對特定控制和狀態(tài)寄存器中單獨的位進行設定和清除的方法。argl為屏蔽字節(jié),arg2為數(shù)據(jù)字節(jié)。屏蔽字節(jié)決定寄存器中的哪一位將被修改。屏蔽字節(jié)中的“1”表示允許對寄存器相應的位進行修改,0則禁止修改。數(shù)據(jù)字節(jié)確定寄存器位修改后的最終結果。如圖7.2.3所示,如果屏蔽字節(jié)相應位設置為1,數(shù)據(jù)字節(jié)中的1表示將對寄存器對應位置1,而0則將對該位清零?!馽md為SPI_CMD_RESET時,將發(fā)送復位指令,復位指令為單字節(jié)指令,可以重新初始化MCP2510的內部寄存器,并設置配置模式。它一般在期間上電初始化過程中進行?!馽md為SPI_CMD_BITMOD時,將對addr地71圖7.2.3MCP2510位修改指令

圖7.2.3MCP2510位修改指令725.報文發(fā)送CAN報文發(fā)送函數(shù)為:voidMCP2510_TX(intTxBuf,intIdType,unsignedintid,intDataLen,Char*data)MCP2510采用三個發(fā)送緩沖器。通過TxBuf參數(shù)指定發(fā)送到哪個緩沖器(TXBUF0、TXBUF1或TXBUF2。IdType決定發(fā)送報文幀的類型,STAN-DID表示標準數(shù)據(jù)幀,EXTID表示擴展數(shù)據(jù)幀。Id為幀ID,DataLen為待發(fā)送數(shù)據(jù)長度,必須小于等于8,data為待發(fā)送數(shù)據(jù)內容。6.報文接收CAN報文接收函數(shù)為:voidMCP2510_RX(intRxBuf,int*IdType,unsignedint*id,int*DataLen,char*data)MCP2510具有兩個全文接收緩沖器。通過RxBuf參數(shù)指定從哪個緩沖器接收<RX-BUFO或RXBUFl。接收后的報文幀的類型、幀ID,數(shù)據(jù)長度以及數(shù)據(jù)內容分別保存在Id-Type、id、DataLen和data中。5.報文發(fā)送737.2.3S3C2410A與MCP2510的CAN通信接口電路1.MCP2510CAN通信接口電路大多數(shù)嵌入式處理器都有SPI總線控制器,MCP2510可以3V到5.5V供電,能夠直接和3.3VI/O口的嵌入式處理器連接,電路結構形式如圖7.2.4所示。7.2.3S3C2410A與MCP2510的CAN通信接74圖7.2.4MCP251x組成的嵌入式CAN節(jié)點圖7.2.4MCP251x組成的嵌入式CAN節(jié)點75S3C2410A包含兩個SPI接口,例如可以使用S3C2410A中的SPI0與MCP2510接口,連接電路如圖7.2.5所示。在這個電路中,MCP2510使用3.3V電壓供電,它可以直接和S3C2410A通過SPI總線連接。相關的資源如下:●使用一個擴展的I/O口(EXI02)作為片選信號,低電平有效。●用S3C2410A的外部中斷6(EXINT6)作為中斷管腳,低電平有效?!?6MHz晶體作為輸入時鐘,MCP2510內部有振蕩電路,用晶體可以直接起振?!袷褂肨JA1050作為CAN總線收發(fā)器。CAN總線收發(fā)器TJA1050必須使用5V供電。但MCP2510和TJA1050連接的兩個信號都是單向的信號。對于MCP2510,TXCAN是輸出信號,RXCAN是輸入信號。●TJA1050為5V供電時,輸入高電平Vih的范圍是2~5.3V。而3.3V供電的MCP2510輸出TXCAN信號高電平Voh最小值為2.6V,可以滿足要求。S3C2410A包含兩個SPI接口,例如可以使用S3C24176圖7.2.5MCP2510組成的CAN總線接口圖7.2.5MCP2510組成的CAN總線接口772.S3C2410ASPI接口編程SPI接口函數(shù)有:①SPI初始化函數(shù)。BOOLSPI_Init(VOID)②發(fā)送數(shù)據(jù)。BOOLSPI_SendByte(BYTEbData,BYTE*pData)③讀取數(shù)據(jù)。BOOLSPI_ReadByte(BYTE*pData)更多的內容請參考SPI接口編程。表7.2.4對SPI接口相關的部分寄存器進行了簡要說明。2.S3C2410ASPI接口編程78表7.2.4SPI控制寄存器表7.2.4SPI控制寄存器79第7章思考題與習題分析曼徹斯特編碼和差分曼徹斯特編碼的同異。簡述802.3Mac層的以太網(wǎng)的物理傳輸幀。在嵌入式系統(tǒng)中增加以太網(wǎng)接口通常采用哪些方法實現(xiàn)?TCP/IP協(xié)議包含有哪些層?各自的功能?。簡述BSD套接字網(wǎng)絡程序編程方法。登錄cirrus/cn,查閱CS8900的有關資料,分析其內部結構、引腳端功能、應用電路和編程方法。登錄realtek.tw,查閱RTL8019/8029/8039的有關資料,分析其內部結構、引腳端功能、應用電路和編程方法。簡述CAN總線的結構與特點。怎樣在嵌入式處理器上擴展CAN總線接口?登錄semiconductors.philips,查閱SJA1000CAN的有關資料,分析其內部結構、引腳端功能、應用電路和編程方法。登錄microchip,查閱MCP251x的有關資料,分析其內部結構、引腳端功能、應用電路和編程方法。

第7章思考題與習題80第8章嵌入式系統(tǒng)軟件及操作系統(tǒng)基礎第8章嵌入式系統(tǒng)軟件及操作系統(tǒng)基礎818.1嵌入式軟件基礎8.1.1嵌入式軟件的特點應用在嵌入式計算機系統(tǒng)當中的各種軟件統(tǒng)稱為嵌入式軟件,作為嵌入式系統(tǒng)的一個組成部分,目前嵌入式軟件的種類和規(guī)模都得到了極大的發(fā)展,形成了一個完整、獨立的體系。除了具有通用軟件的一般特性,同時還具有一些與嵌入式系統(tǒng)密切相關的特點,如:(l)規(guī)模較小在一般情況下,嵌入式系統(tǒng)的資源多是比較有限的,要求嵌入式軟件必須盡可能地精簡,多數(shù)的嵌入式軟件都在幾MB以內。8.1嵌入式軟件基礎8.1.1嵌入式軟件的特點82(2)開發(fā)難度大嵌入式系統(tǒng)由于硬件資源的有限,使得嵌入式軟件在時間和空間上都受到嚴格的限制,需要開發(fā)人員對編程語言、編譯器和操作系統(tǒng)有深刻的了解,才有可能開發(fā)出運行速度快、存儲空間少、維護成本低的軟件。嵌入式軟件一般都要涉及到底層軟件的開發(fā),應用軟件的開發(fā)也是直接基于操作系統(tǒng)的,這就要求開發(fā)人員具有扎實的軟、硬件基礎,能靈活運用不同的開發(fā)手段和工具,具有較豐富的開發(fā)經(jīng)驗。嵌入式軟件的運行環(huán)境和開發(fā)環(huán)境比PC機復雜,嵌入式軟件是在目標系統(tǒng)上運行的,而嵌入式軟件的開發(fā)工作則是在另外的開發(fā)系統(tǒng)中進行,當應用軟件調試無誤后,再把它放到目標系統(tǒng)上去。(2)開發(fā)難度大83(3)高實時性和可靠性要求具有實時處理的能力是許多嵌入式系統(tǒng)的基本要求,實時性要求軟件對外部事件做出反應的時間必須要快,在某些情況下還要求是確定的、可重復實現(xiàn)的,不管系統(tǒng)當時的內部狀態(tài)如何,都是可以預測的。同時,對于事件的處理一定要在限定的時間期限之前完成,否則就有可能引起系統(tǒng)的崩潰。在航天控制、核電站、工業(yè)機器人等實時系統(tǒng)對嵌入式軟件的可靠性要求是非常高的,一旦軟件出了問題,其后果是非常嚴重的。(4)軟件固化存儲為了提高系統(tǒng)的啟動速度、執(zhí)行速度和可靠性,嵌入式系統(tǒng)中的軟件一般都固化在存儲器芯片或微處理器中。(3)高實時性和可靠性要求848.1.2嵌入式軟件的分類1.系統(tǒng)軟件系統(tǒng)軟件控制和管理嵌入式系統(tǒng)資源,為嵌入式應用提供支持的各種軟件,如設備驅動程序、嵌入式操作系統(tǒng)、嵌入式中間件等。2.應用軟件應用軟件是嵌入式系統(tǒng)中的上層軟件,它定義了嵌入式設備的主要功能和用途,并負責與用戶進行交互。應用軟件是嵌入式系統(tǒng)功能的體現(xiàn),如飛行控制軟件、手機軟件、MP3播放軟件、電子地圖軟件等,一般面向于特定的應用領域,。3.支撐軟件支撐軟件指輔助軟件開發(fā)的工具軟件,如系統(tǒng)分析設計工具、在線仿真工具、交叉編譯器、源程序模擬器和配置管理工具等。在嵌入式系統(tǒng)當中,系統(tǒng)軟件和應用軟件運行在目標平臺的(即嵌入式設備上),而對于各種軟件開發(fā)工具來說,它們大部分都運行在開發(fā)平臺(PC機)上,運行Windows或Linux操作系統(tǒng)。8.1.2嵌入式軟件的分類1.系統(tǒng)軟件858.1.3嵌入式軟件的體系結構1.無操作系統(tǒng)的嵌入式軟件早期在嵌入式系統(tǒng)的應用范圍主要集中在控制領域,硬件的配置比較低,嵌入式軟件的設計主要是以應用為核心,應用軟件直接建立在硬件上,沒有專門的操作系統(tǒng),軟件的規(guī)模也很小。無操作系統(tǒng)的嵌入式軟件主要采用循環(huán)輪轉和中斷(前后臺)兩種實現(xiàn)方式。(1)循環(huán)輪轉方式循環(huán)輪轉方式的基本設計思想是:把系統(tǒng)的功能分解為若干個不同的任務,放置在一個永不結束的循環(huán)語句當中,按照時間順序逐一執(zhí)行。當程序執(zhí)行完一輪后,又回到程序的開頭重新執(zhí)行,循環(huán)不斷。8.1.3嵌入式軟件的體系結構1.無操作系統(tǒng)的嵌入式軟件86循環(huán)輪轉方式的程序簡單、直觀、開銷小、可預測。軟件的開發(fā)可以按照自頂向下、逐步求精的方式,將系統(tǒng)要完成的功能逐級劃分成若干個小的功能模塊進行編程,最后組合在一起。循環(huán)輪轉方式的軟件系統(tǒng)只有一條執(zhí)行流程和一個地址空間,不需要任務之間的調度和切換,其程序的代碼都是固定的,函數(shù)之間的調用關系也是明確的,整個系統(tǒng)的執(zhí)行過程是可預測的。循環(huán)輪轉方式的缺點是程序必須按順序執(zhí)行,無法處理異步事件,缺乏并行處理的能力。缺乏硬件上的時間控制機制,無法實現(xiàn)定時功能。循環(huán)輪轉方式的程序簡單、直觀、開銷小、可預測。軟件的開發(fā)可以87(2)中斷方式中斷方式又稱為前后臺系統(tǒng)形式,系統(tǒng)在循環(huán)輪轉方式的基礎上增加了中斷處理功能。ISR(InterruptServiceRoutine,中斷服務程序)負責處理異步事件,即前臺程序(foreground),也稱為事件處理級程序。而后臺程序(background)是一個系統(tǒng)管理調度程序,一般采用的是一個無限的循環(huán)形式,負責掌管整個嵌入式系統(tǒng)軟、硬件資源的分配、管理以及任務的調度。后臺程序也稱為任務級程序。一般情形下,后臺程序會檢查每個任務是否具備運行條件,通過一定的調度算法來完成相應的操作。而一些對實時性有要求的操作通常由中斷服務程序來完成,大多數(shù)的中斷服務程序只做一些最基本的操作,如標記中斷事件的發(fā)生等,其余的事情會延遲到后臺程序去完成。(2)中斷方式882.有操作系統(tǒng)的嵌入式軟件從20世紀80年代開始,操作系統(tǒng)出現(xiàn)在嵌入式系統(tǒng)上。如今,嵌入式操作系統(tǒng)在嵌入式系統(tǒng)中廣泛應用,尤

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論