版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章嵌入式系統(tǒng)網(wǎng)絡(luò)接口第一頁,共81頁。7.1以太網(wǎng)接口
嵌入式系統(tǒng)通常使用的以太網(wǎng)協(xié)議是IEEE802.3標(biāo)準(zhǔn)。從硬件的角度看,802.3模型層間結(jié)構(gòu)如圖7.1.1所示,以太網(wǎng)接口電路主要由媒質(zhì)接入控制MAC控制器和物理層接口(PhysicalLayer,PHY)兩大部分構(gòu)成。第二頁,共81頁。圖7.1.1802.3模型層間結(jié)構(gòu)第三頁,共81頁。1.傳輸編碼在802.3版本的標(biāo)準(zhǔn)中,沒有采用直接的二進(jìn)制編碼(即用0V表示“0”,用5V表示“1”),而是采用曼徹斯特編碼(ManchesterEncoding)或者差分曼徹斯特編碼(DifferentialManchesterEncoding),不同編碼形式如圖7.1.2所示。第四頁,共81頁。圖7.1.2不同編碼形式第五頁,共81頁。其中:曼徹斯特編碼的規(guī)律是:每位中間有一個電平跳變,從高到低的跳變表示為“0”,從低到高的跳變表示為“1”。差分曼徹斯特編碼的規(guī)律是:每位的中間也有一個電平跳變,但不用這個跳變來表示數(shù)據(jù),而是利用每個碼元開始時有無跳變來表示“0”或“1”,有跳變表示“0”,無跳變表示“1”。曼徹斯特編碼和差分曼徹斯特編碼相比,前者編碼簡單,后者能提供更好的噪聲抑制性能。在802.3系統(tǒng)中,采用曼徹斯特編碼,其高電平為+0.85V,低電平信號為-0.85V,這樣指令信號電壓仍然是0V。第六頁,共81頁。2.802.3Mac層的幀802.3Mac層的以太網(wǎng)的物理傳輸幀如表7.1.1所示。表7.1.1802.3幀的格式第七頁,共81頁。●PR:同步位,用于收發(fā)雙方的時鐘同步,同時也指明了傳輸?shù)乃俾?,?6位的的二進(jìn)制數(shù)1…,最后2位是10。
●SD:分隔位,表示下面跟著的是真正的數(shù)據(jù)而不是同步時鐘,為8位的10101011。
●DA:目的地址,以太網(wǎng)的地址為48位(6個字節(jié))二進(jìn)制地址,表明該幀傳輸給哪個網(wǎng)卡。如果為FFFFFFFFFFFF,則是廣播地址。廣播地址的數(shù)據(jù)可以被任何網(wǎng)卡接收到。
●SA:源地址,48位,表明該幀的數(shù)據(jù)是哪個網(wǎng)卡發(fā)的,即發(fā)送端的網(wǎng)卡地址,同樣是6個字節(jié)。●TYPE:類型字段,表明該幀的數(shù)據(jù)是什么類型的數(shù)據(jù),不同協(xié)議的類型字段不同。如:0800H表示數(shù)據(jù)為IP包,0806H表示數(shù)據(jù)為ARP包,814CH是SNMP包,8137H為IPX/SPX包。小于0600H的值是用于IEEE802的,表示數(shù)據(jù)包的長度。第八頁,共81頁。●DATA:數(shù)據(jù)段,該段數(shù)據(jù)不能超過1500B。因?yàn)橐蕴W(wǎng)規(guī)定整個傳輸包的最大長度不能超過1514E(14B為DA,SA,TYPE)?!馪AD:填充位。由于以太網(wǎng)幀傳輸?shù)臄?shù)據(jù)包最小不能小于60B,除去(DA、SA、TYPE的14B),還必須傳輸46B的數(shù)據(jù),當(dāng)數(shù)據(jù)段的數(shù)據(jù)不足46B時,后面通常是補(bǔ)0(也可以補(bǔ)其他值)。●FCS:32位數(shù)據(jù)校驗(yàn)位。32位的CRC校驗(yàn),該校驗(yàn)由網(wǎng)卡自動計(jì)算,自動生成,自動校驗(yàn),自動在數(shù)據(jù)段后面填入。不需要軟件管理?!裢ǔ?,PR、SD、PAD、FCS這幾個數(shù)據(jù)段都是網(wǎng)卡(包括物理層和Mac層的處理)自動產(chǎn)生的,剩下的DA、SA、TYPE、DATA這4個段的內(nèi)容是由上層的軟件控制的。第九頁,共81頁。3.以太網(wǎng)數(shù)據(jù)傳輸?shù)奶攸c(diǎn)●所有數(shù)據(jù)位的傳輸由低位開始,傳輸?shù)奈涣魇怯寐鼜厮固鼐幋a?!褚蕴W(wǎng)是基于沖突檢測的總線復(fù)用方法,沖突退避算法是由硬件自動執(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)絡(luò)分析和監(jiān)控,網(wǎng)卡也可以設(shè)置為接收任何數(shù)據(jù)包?!袢魏蝺蓚€網(wǎng)卡的物理地址都是不一樣的,是世界上唯一的,網(wǎng)卡地址由專門機(jī)構(gòu)分配。不同廠家使用不同地址段,同一廠家的任何兩個網(wǎng)卡的地址也是唯一的。根據(jù)網(wǎng)卡的地址段(網(wǎng)卡地址的前3個字節(jié))可以知道網(wǎng)卡的生產(chǎn)廠家。第十頁,共81頁。7.1.2嵌入式以太網(wǎng)接口的實(shí)現(xiàn)方法在嵌入式系統(tǒng)中增加以太網(wǎng)接口,通常有如下兩種方法實(shí)現(xiàn):(1)嵌入式處理器+網(wǎng)卡芯片這種方法只要把以太網(wǎng)芯片連接到嵌入式處理器的總線上即可。此方法通用性強(qiáng),對嵌入式處理器沒有特殊要求,不受處理器的限制,但是,嵌入式處理器和網(wǎng)絡(luò)數(shù)據(jù)交換通過外部總線(通常是并行總線)交換數(shù)據(jù),速度慢,可靠性不高,電路板走線復(fù)雜。目前常見的以太網(wǎng)接口芯片,如CS8900、RTL8019/8029/8039、DM9008及DWL650無線網(wǎng)卡等。(2)帶有以太網(wǎng)接口的嵌入式處理器帶有以太網(wǎng)接口的嵌入式處理器通常是面向網(wǎng)絡(luò)應(yīng)用而設(shè)計(jì)的,要求嵌入式處理器有通用的網(wǎng)絡(luò)接口(比如:MII接口),處理器和網(wǎng)絡(luò)數(shù)據(jù)交換通過內(nèi)部總線,速度快。第十一頁,共81頁。7.1.3在嵌入式系統(tǒng)中主要處理的以太網(wǎng)協(xié)議TCP/IP是一個分層的協(xié)議,包含有用于層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層等。每一層實(shí)現(xiàn)一個明確的功能,對應(yīng)一個或者幾個傳輸協(xié)議。每層相對于它的下層都作為一個獨(dú)立的數(shù)據(jù)包來實(shí)現(xiàn)。典型的分層和每層上的協(xié)議如表7.1.2所示。表7.1.2TCP/IP協(xié)議的典型分層和協(xié)議第十二頁,共81頁。1.ARP(AddressResolationProtocol,地址解析協(xié)議)網(wǎng)絡(luò)層用32位的地址來標(biāo)識不同的主機(jī)(即IP地址),而鏈路層使用48位的物理(MAC)地址來標(biāo)識不同的以太網(wǎng)或令牌環(huán)網(wǎng)接口。只知道目的主機(jī)的IP地址并不能發(fā)送數(shù)據(jù)幀給它,必須知道目的主機(jī)網(wǎng)絡(luò)接口的物理地址才能發(fā)送數(shù)據(jù)幀。ARP的功能就是實(shí)現(xiàn)從IP地址到對應(yīng)物理地址的轉(zhuǎn)換。源主機(jī)發(fā)送一份包含目的主機(jī)IP地址的ARP請求數(shù)據(jù)幀給網(wǎng)上的每個主機(jī),稱作ARP廣播,目的主機(jī)的ARP收到這份廣播報(bào)文后,識別出這是發(fā)送端在詢問它的IP地址,于是發(fā)送一個包含目的主機(jī)IP地址及對應(yīng)的物理地址的ARP回答給源主機(jī)。為了加快ARP協(xié)議解析的數(shù)據(jù),每臺主機(jī)上都有一個ARPcache存放最近的IP地址到硬件地址之間的映射記錄。其中每一項(xiàng)的生存時間(一般為20分鐘),這樣當(dāng)在ARP的生存時間之內(nèi)連續(xù)進(jìn)行ARP解析的時候,不需要反復(fù)發(fā)送ARP請求了。第十三頁,共81頁。2.ICMP(InternetControlMessagesProtocol,網(wǎng)絡(luò)控制報(bào)文協(xié)議)ICMP是IP層的附屬協(xié)議,IP層用它來與其他主機(jī)或路由器交換錯誤報(bào)文和其他重要控制信息。ICMP報(bào)文是在IP數(shù)據(jù)包內(nèi)部被傳輸?shù)?。在Linux或者Windows中,兩個常用的網(wǎng)絡(luò)診斷工具ping和traceroute(Windows下是Tracert),其實(shí)就是ICMP協(xié)議。第十四頁,共81頁。3.IP(InternetProtocol,網(wǎng)際協(xié)議)IP工作在網(wǎng)絡(luò)層,是TCP/IP協(xié)議族中最為核心的協(xié)議。所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)包格式傳輸(IP封裝在IP數(shù)據(jù)包中)。IP數(shù)據(jù)包最長可達(dá)65535字節(jié),其中報(bào)頭占32位。還包含各32位的源IP地址和32位的目的IP地址。TTL(time-to-live,生存時間字段)指定了IP數(shù)據(jù)包的生存時間(數(shù)據(jù)包可以經(jīng)過的最多路由器數(shù))。TTL的初始值由源主機(jī)設(shè)置,一旦經(jīng)過一個處理它的路由器,它的值就減去1。當(dāng)該字段的值為0時,數(shù)據(jù)包就被丟棄,并發(fā)送ICMP報(bào)文通知源主機(jī)重發(fā)。IP提供不可靠、無連接的數(shù)據(jù)包傳送服務(wù),高效、靈活。不可靠(unreliable)的意思是它不能保證IP數(shù)據(jù)包能成功地到達(dá)目的地。如果發(fā)生某種錯誤,IP有一個簡單的錯誤處理算法:丟棄該數(shù)據(jù)包,然后發(fā)送ICMP消息報(bào)給信源端。任何要求的可靠性必須由上層來提供(如TCP)。第十五頁,共81頁。無連接(connectionless)的意思是IP并不維護(hù)任何關(guān)于后續(xù)數(shù)據(jù)包的狀態(tài)信息。每個數(shù)據(jù)包的處理是相互獨(dú)立的。IP數(shù)據(jù)包可以不按發(fā)送順序接收。如果一信源向相同的信宿發(fā)送兩個連續(xù)的數(shù)據(jù)包(先是A,然后是B),每個數(shù)據(jù)包都是獨(dú)立地進(jìn)行路由選擇,可能選擇不同的路線,因此B可能在A到達(dá)之前先到達(dá)。IP的路由選擇:源主機(jī)IP接收本地TCP、UDP、ICMP、GMP的數(shù)據(jù),生成IP數(shù)據(jù)包,如果目的主機(jī)與源主機(jī)在同一個共享網(wǎng)絡(luò)上,那么IP數(shù)據(jù)包就直接送到目的主機(jī)上。否則就把數(shù)據(jù)包發(fā)往一默認(rèn)的路由器上,由路由器來轉(zhuǎn)發(fā)該數(shù)據(jù)包。最終經(jīng)過數(shù)次轉(zhuǎn)發(fā)到達(dá)目的主機(jī)。IP路由選擇是逐跳(hop-by-hop)進(jìn)行的。所有的IP路由選擇只為數(shù)據(jù)包傳輸提供下一站路由器的IP地址。第十六頁,共81頁。4.TCP(TransferControlProtocol,傳輸控制協(xié)議)TCP協(xié)議是一個面向連接的可靠的傳輸層協(xié)議。TCP為兩臺主機(jī)提供高可靠性的端到端數(shù)據(jù)通信。它所做的工作包括:①發(fā)送方把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊,并添加附加信息(TCP頭),包括順序號,源、目的端口,控制、糾錯信息等字段,稱為TCP數(shù)據(jù)包。并將TCP數(shù)據(jù)包交給下面的網(wǎng)絡(luò)層處理。②接受方確認(rèn)接收到的TCP數(shù)據(jù)包,重組并將數(shù)據(jù)送往高層。第十七頁,共81頁。5.UDP(UserDatagramProtocol,用戶數(shù)據(jù)包協(xié)議)UDP協(xié)議是一種無連接不可靠的傳輸層協(xié)議。它只是把應(yīng)用程序傳來的數(shù)據(jù)加上UDP頭(包括端口號,段長等字段),作為UDP數(shù)據(jù)包發(fā)送出去,但是并不保證它們能到達(dá)目的地。可靠性由應(yīng)用層來提供。因?yàn)閰f(xié)議開銷少,和TCP協(xié)議相比,UDP更適用于應(yīng)用在低端的嵌入式領(lǐng)域中。很多場合如網(wǎng)絡(luò)管理SNMP,域名解析DNS,簡單文件傳輸協(xié)議TFTP,大都使用UDP協(xié)議。第十八頁,共81頁。6.端口TCP和UDP采用16位的端口號來識別上層的TCP用戶,即上層應(yīng)用協(xié)議,如FTP和TELNET等。常見的TCP/IP服務(wù)都用眾所周知的1~255之間的端口號。例如FTP服務(wù)的TCP端口號都是21,Telnet服務(wù)的TCP端口號都是23。TFTP(簡單文件傳輸協(xié)議)服務(wù)的UDP端口號都是69。256~1023之間的端口號通常都是提供一些特定的UNIX服務(wù)。TCP/IP臨時端口分配1024~5000之間的端口號。第十九頁,共81頁。7.1.4網(wǎng)絡(luò)編程接口BSD套接字(BSDSockets)使用的最廣泛的網(wǎng)絡(luò)程序編程方法,主要用于應(yīng)用程序的編寫,用于網(wǎng)絡(luò)上主機(jī)與主機(jī)之間的相互通信。很多操作系統(tǒng)都支持BSD套接字編程。例如,UNIX、Linux、VxWorks、Windows的Winsock基本上是來自BSDSockets。套接字(Sockets)分為StreamSockets和DataSockets。StreamSockets是可靠性的雙向數(shù)據(jù)傳輸,對應(yīng)使用TCP協(xié)議傳輸數(shù)據(jù);DataSockets是不可靠連接,對應(yīng)使用UDP協(xié)議傳輸數(shù)。第二十頁,共81頁。下面給出一個使用套接字接口的UDP通信的流程。UDP服務(wù)器端和一個UDP客戶端通信的程序過程:(1)創(chuàng)建一個Socket:sFd=socket(AF_INET,SOCK_DGRAM,0)(2)把Socket和本機(jī)的IP,UDP口綁定:bind(sFd,(structsockaddr*)&serverAddr,sockAddrSize)(3)循環(huán)等待,接收(recvfrom)或者發(fā)送(sendfrom)信息。(4)關(guān)閉Socket,通信終止:close(sFd)第二十一頁,共81頁。7.1.5以太網(wǎng)的物理層接口及編程大多數(shù)ARM都內(nèi)嵌一個以太網(wǎng)控制器,支持媒體獨(dú)立接口(MediaIndependentInterfaceMII)和帶緩沖DMA接口(BufferedDMAInterface,BDI),可在半雙工或全雙工模式下提供10M/100Mbps的以太網(wǎng)接入。在半雙工模式下,控制器支持CSMA/CD協(xié)議;在全雙工模式下,支持IEEE802.3MAC控制層協(xié)議。ARM內(nèi)部雖然包含了以太網(wǎng)MAC控制,但并未提供物理層接口,因此,需外接一片物理層芯片以提供以太網(wǎng)的接入通道。常用的單口10M/100Mbps高速以太網(wǎng)物理層接口器件均提供MII接口和傳統(tǒng)7線制網(wǎng)絡(luò)接口,可方便地與ARM接口。以太網(wǎng)物理層接口器件主要功能一般包括:物理編碼子層、物理媒體附件、雙絞線物理媒體子層、10BASE-TX編碼/解碼器和雙絞線媒體訪問單元等。如CS8900、RTL8019/8029/8039等。第二十二頁,共81頁。CS8900A是CirrusLogic公司生產(chǎn)的16位以太網(wǎng)控制器,芯片內(nèi)嵌片內(nèi)RAM10BASE-T收發(fā)濾波器,直接ISA總線接口。該芯片的物理層接口、數(shù)據(jù)傳輸模式和工作模式等都能根據(jù)需要而動態(tài)調(diào)整,通過內(nèi)部寄存器的設(shè)置來適應(yīng)不同的應(yīng)用環(huán)境。CS8900A采用3V供電電壓,最大工作電流55mA,具有全雙工通信方式,可編程發(fā)送功能,數(shù)據(jù)碰撞自動重發(fā),自動打包及生成CRC校驗(yàn)碼,可編程接收功能,自動切換于DMA和片內(nèi)RAM,提前產(chǎn)生中斷便于數(shù)據(jù)幀預(yù)處理,數(shù)據(jù)流可降低CPU消耗,自動阻斷錯誤包,可跳線控制EEPROM功能,啟動編程支持無盤系統(tǒng),邊沿掃描和回環(huán)測試,待機(jī)和睡眠模式,支持廣泛的軟件驅(qū)動,工業(yè)級溫度范圍,LED指示連接狀態(tài)和網(wǎng)絡(luò)活動情況等特點(diǎn)。采用TQFP-100封裝。CS8900A內(nèi)部結(jié)構(gòu)方框圖如圖7.1.3所示。第二十三頁,共81頁。圖7.1.3CS8900A內(nèi)部結(jié)構(gòu)方框圖第二十四頁,共81頁。1.CS8900A工作原理CS8900A有兩種工作模式:和I/O模式。當(dāng)配置成MEMORYMODE模式操作時,CS8900A的內(nèi)部寄存器和幀緩沖區(qū)映射到主機(jī)內(nèi)存中連續(xù)的4KB的塊中,主機(jī)可以通過這個塊直接訪問CS8900A的內(nèi)部寄存器和幀緩沖區(qū)。MEMORY模式需要硬件上多根地址線和網(wǎng)卡相連。而在I/OMODE模式,對任何寄存器操作均要通過I/O端口0寫入或讀出。I/OMODE模式在硬件上實(shí)現(xiàn)比較方便,而且這也是芯片的默認(rèn)模式。在I/O模式下,PacketPage存儲器被映射到CPU的8個16位的I/O端口上。在芯片被加電后,I/O基地址的默認(rèn)值被置為300H。第二十五頁,共81頁。使用CS8900A作為以太網(wǎng)的物理層接口,在收到由主機(jī)發(fā)來的數(shù)據(jù)報(bào)后(從目的地址域到數(shù)據(jù)域),偵聽網(wǎng)絡(luò)線路。如果線路忙,它就等到線路空閑為止,否則,立即發(fā)送該數(shù)據(jù)幀。在發(fā)送過程中,首先它添加以太網(wǎng)幀頭(包括前導(dǎo)字段和幀開始標(biāo)志),然后生成CRC校驗(yàn)碼,最后將此數(shù)據(jù)幀發(fā)送到以太網(wǎng)上。在接收過程中,它將從以太網(wǎng)收到的數(shù)據(jù)幀在經(jīng)過解碼、去幀頭和地址檢驗(yàn)等步驟后緩存在片內(nèi)。在CRC校驗(yàn)通過后,它會根據(jù)初始化配置情況,通知主機(jī)CS8900A收到了數(shù)據(jù)幀,最后,用某種傳輸模式(FO模式、Memory模式、DMA模式)傳到主機(jī)的存儲區(qū)中。第二十六頁,共81頁。2.CS8900A引腳端和功能CS8900A的ISA總線接口引腳端和功能如表7.1.3所示,EEPROM和引導(dǎo)編程接口引腳端和功能如表7.1.4所示,IOBASE-T接口引腳端和功能如表7.1.5所示,附加單元接口AUD引腳端和功能如表7.1.6所示,通用引腳端和功能如表7.1.7所示。第二十七頁,共81頁。引腳類型功能SA[0:19]I地址總線SD[0:15]I/O雙向數(shù)據(jù)總線,三態(tài)輸出RESETI復(fù)位輸入端,高電平有效(至少保持400ns)AENI地址使能,高電平有效MEMRI存儲器讀信號,低電平有效MEMWI存儲器寫信號,低電平有效MEMCS16O存儲器16位選擇信號,OC(集電極開路)輸出REFRESHI刷新信號,低電平有效。當(dāng)REFRESH為低電平時,MEMR,MEMW,IOR,IOW,DMACK0,DMACKl和DMACK2都被忽略第二十八頁,共81頁。表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應(yīng)答信號,低電平有效CHIPSELI片選信號,低電平有效第二十九頁,共81頁。表7.1.4EEPROM和引導(dǎo)編程接口引腳端和功能引腳類型功能EESKIEEPROM時鐘輸入信號EECSIEEPROM片選輸入信號,低電平有效EEDataINIEEPROM數(shù)據(jù)輸入,內(nèi)部上拉ELCSI外部邏輯片選信號,內(nèi)部上拉EEDataOUTOEEPROM數(shù)據(jù)輸出CSOUTO外部引導(dǎo)編程選擇信號輸出,低電平有效第三十頁,共81頁。表7.1.5IOBASE-T接口引腳端引腳類型功能TXD+/TXDO數(shù)據(jù)發(fā)送,差分對管輸出RXD+/RXDI數(shù)據(jù)接收,差分對管輸入第三十一頁,共81頁。表7.1.6附加單元接口引腳端和功能引腳類型功能DO+/DOOAUI數(shù)據(jù)輸出,差分對管輸出DI+/DIIAUI數(shù)據(jù)輸入,差分對管輸入CI+/CIIAUI振動輸入,差分對管輸入第三十二頁,共81頁。表7.1.7通用引腳端和功能引腳類型功能XTAL[1:2]I/O晶體振蕩器輸入/輸出SLEEPI硬件睡眠控制輸入信號,低電平有效,內(nèi)部上拉LINKLED/HCOO線路正常輸出信號或主控制器輸出0信號,低電平有效,OC(集電極開路)輸出BSTAUTS/HC1O總線狀態(tài)輸出信號或主控制器輸出1信號,低電平有效,OC(集電極開路)輸出LANLEDO網(wǎng)絡(luò)狀態(tài)指示輸出信號,OC(集電極開路)輸出TESTI測試輸入使能信號,低電平有效,內(nèi)部上拉RESI基準(zhǔn)電阻輸入端DVDD[1:4]I數(shù)字電路電源DVSS[1:4]I數(shù)字電路地AVDD[1:4]I模擬電路電源AVSS[1:4]I模擬電路地第三十三頁,共81頁。3.電路連接
采用CS8900A與S3C2410A連接構(gòu)成的以太網(wǎng)接口電路如圖7.1.4所示。第三十四頁,共81頁。4.CS8900A的以太網(wǎng)接口驅(qū)動程序[于明](1)初始化函數(shù)初始化函數(shù)完成設(shè)備的初始化功能,由數(shù)據(jù)結(jié)構(gòu)device中的init函數(shù)指針來調(diào)用。加載網(wǎng)絡(luò)驅(qū)動模塊后,就會調(diào)用初始化過程。首先通過檢測物理設(shè)備的硬件特征來檢測網(wǎng)絡(luò)物理設(shè)備是否存在,之后配置設(shè)備所需要的資源。比如,中斷。這些配置完成之后就要構(gòu)造設(shè)備的數(shù)據(jù)結(jié)構(gòu)device,用檢測到的數(shù)據(jù)初始化device中的相關(guān)變量,最后向Linux內(nèi)核中注冊該設(shè)備并申請內(nèi)存空間。函數(shù)定義為:第三十五頁,共81頁。staticint__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));
第三十六頁,共81頁。lp=(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;第三十七頁,共81頁。if(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;}第三十八頁,共81頁。out:if(ret)kfree(dev_cs89x0.priv);returnret;}在這個網(wǎng)絡(luò)設(shè)備驅(qū)動程序中,設(shè)備的數(shù)據(jù)結(jié)構(gòu)device就是dev_cs89x0。探測網(wǎng)絡(luò)物理設(shè)備是否存在,利用cs89x0_probe函數(shù)實(shí)現(xiàn),通過調(diào)用register_netdrv(structnet_device*dev)函數(shù)進(jìn)行注冊。與init函數(shù)相對應(yīng)的cleanup函數(shù)在模塊卸載時運(yùn)行,主要完成資源的釋放工作,如取消設(shè)備注冊、釋放內(nèi)存、釋放端口等。函數(shù)定義為:第三十九頁,共81頁。staticvoid__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);}}第四十頁,共81頁。(2)打開函數(shù)打開函數(shù)在網(wǎng)絡(luò)設(shè)備驅(qū)動程序中是在網(wǎng)絡(luò)設(shè)備被激活時調(diào)用,即設(shè)備狀態(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;}第四十一頁,共81頁。if(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)第四十二頁,共81頁。lp->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);第四十三頁,共81頁。writereg(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;}第四十四頁,共81頁。打開函數(shù)中對寄存器操作使用了兩個函數(shù):readreg和writereg。readreg函數(shù)用來讀取寄存器內(nèi)容,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);}第四十五頁,共81頁。(3)關(guān)閉函數(shù)關(guān)閉函數(shù)釋放資源減少系統(tǒng)負(fù)擔(dān),設(shè)備狀態(tài)有up轉(zhuǎn)為down時被調(diào)用。函數(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;}第四十六頁,共81頁。(4)發(fā)送函數(shù)首先,在網(wǎng)絡(luò)設(shè)備驅(qū)動加載時,通過device域中的init函數(shù)指針調(diào)用網(wǎng)絡(luò)設(shè)備的初始化函數(shù)對設(shè)備進(jìn)行初始化,如果操作成功,就可以通過device域中的open函數(shù)指針調(diào)用網(wǎng)絡(luò)設(shè)備的打開函數(shù)打開設(shè)備,再通過device域中的包頭函數(shù)指針hard_header來建立硬件包頭信息。最后,通過協(xié)議接口層函數(shù)dev_queue_xmit調(diào)用device域中的hard_start_xmit函數(shù)指針來完成數(shù)據(jù)包的發(fā)送。如果發(fā)送成功,hard_start_xmit釋放sk_buff,返回0。如果設(shè)備暫時無法處理,比如,硬件忙,則返回l。此時如果dev->tbusy置為非0,則系統(tǒng)認(rèn)為硬件忙,要等到dev->tbusy置0以后才會再次發(fā)送。tbusy的置0任務(wù)一般由中斷完成。硬件在發(fā)送結(jié)束會產(chǎn)生中斷,這時可以把tbusy置0,然后用mark_bh()調(diào)用通知系統(tǒng)可以再次發(fā)送。在CS8900A驅(qū)動程序中,網(wǎng)絡(luò)設(shè)備的傳輸函數(shù)dev->hard_start__xmit定義為net_send_packet:第四十七頁,共81頁。staticintnet_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*/第四十八頁,共81頁。writeword(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;}第四十九頁,共81頁。(5)中斷處理和接收函數(shù)網(wǎng)絡(luò)設(shè)備接收數(shù)據(jù)通過中斷實(shí)現(xiàn),當(dāng)數(shù)據(jù)收到后,產(chǎn)生中斷,在中斷處理程序中驅(qū)動程序申請一塊sk_buff(skb),從硬件讀出數(shù)據(jù)放置到申請好的緩沖區(qū)里。接下來,填充sk_buff中的一些信息。處理完后,如果是獲得數(shù)據(jù)包,則執(zhí)行數(shù)據(jù)接收子程序,該函數(shù)被中斷服務(wù)程序調(diào)用。函數(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);第五十頁,共81頁。if((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;}第五十一頁,共81頁。skb_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;}第五十二頁,共81頁。在net_rx()函數(shù)中調(diào)用netif_rx()把數(shù)據(jù)傳送到協(xié)議層。netif_rx()函數(shù)把數(shù)據(jù)放入處理隊(duì)列,然后返回,真正的處理是在中斷返回以后,這樣可以減少中斷時間。調(diào)用netif_rx()后,驅(qū)動程序不能再存取數(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.tv_sec==0) do_gettimeofday(&skb->stamp);queue=&softnet_data[this_cpu];local_irq_save(flags);第五十三頁,共81頁。netdev_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].cng_level;}第五十四頁,共81頁。if(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_FLOWCONTROL第五十五頁,共81頁。atomic_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ā)生后,首先驅(qū)動中斷管腳為高電平,然后主機(jī)讀取CS8900A中的中斷申請序列ISQ值,以確定事件類型,根據(jù)事件類型做出響應(yīng)。函數(shù)定義為:第五十六頁,共81頁。staticvoidnet_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).*/第五十七頁,共81頁。net_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;第五十八頁,共81頁。caseISQ_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;第五十九頁,共81頁。caseISQ_RX_MISS_EVENT:lp->stats.rx_missed_errors+=(status>>6);break;caseISQ_TX_COL_EVENT:lp->stats.collisions+=(status>>6);break;}}}第六十頁,共81頁。
7.2CAN總線接口7.2.1CAN總線概述CAN(ControllerAreaNetwork,控制器局域網(wǎng))是德國Bosch公司于1983年為汽車應(yīng)用而開發(fā)的,它是一種現(xiàn)場總線(FieldBus),能有效支持分布式控制和實(shí)時控制的串行通信網(wǎng)絡(luò)。1993年11月,ISO正式頒布了控制器局域網(wǎng)CAN國際標(biāo)準(zhǔn)(IS011898)。一個理想的由CAN總線構(gòu)成的單一網(wǎng)絡(luò)中可以掛接任意多個節(jié)點(diǎn),實(shí)際應(yīng)用中節(jié)點(diǎn)數(shù)目受網(wǎng)絡(luò)硬件的電氣特性所限制。例如:當(dāng)使用PhilipsP82C250作為CAN收發(fā)器時,同一網(wǎng)絡(luò)中允許掛接110個節(jié)點(diǎn)。CAN可提供1Mb/s的數(shù)據(jù)傳輸速率。CAN總線是一種多主方式的串行通信總線?;驹O(shè)計(jì)規(guī)范要求有高的位速率,高抗電磁干擾性,并可以檢測出產(chǎn)生的任何錯誤。當(dāng)信號傳輸距離達(dá)到10Km時CAN總線仍可提供高達(dá)50Kb/s的數(shù)據(jù)傳輸速率。CAN總線具有很高的實(shí)時性能,已經(jīng)在汽車工業(yè)、航空工業(yè)、工業(yè)控制、安全防護(hù)等領(lǐng)域中得到了廣泛應(yīng)用。第六十一頁,共81頁。CAN總線的通信介質(zhì)可采用雙絞線、同軸電纜和光導(dǎo)纖維,最常用的是雙絞線。通信距離與波特率有關(guān),最大通信距離可達(dá)10km,最大通信波特率可達(dá)1Mbps。CAN總線仲裁采用11位標(biāo)識和非破壞性位仲裁總線結(jié)構(gòu)機(jī)制,可以確定數(shù)據(jù)塊的優(yōu)先級,保證在網(wǎng)絡(luò)節(jié)點(diǎn)沖突時最高優(yōu)先級節(jié)點(diǎn)不需要沖突等待。CAN總線采用了多主競爭式總線結(jié)構(gòu),具有多主站運(yùn)行和分散仲裁的串行總線以及廣播通信的特點(diǎn)。CAN總線上任意節(jié)點(diǎn)可在任意時刻主動向網(wǎng)絡(luò)上其他節(jié)點(diǎn)發(fā)送信息而不分主次,因此可在各節(jié)點(diǎn)之間實(shí)現(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。當(dāng)“顯性”位和“隱性”位同時發(fā)送的時候,最后總線數(shù)值將為“顯性”。CAN總線的一個位時間可以分成四個部分:同步段,傳播時間段,相位緩沖段1和相位緩沖段2。每段的時間份額的數(shù)目都是可以通過CAN總線控制器編程控制,而時間份額的大小tq由系統(tǒng)時鐘tsys和波特率預(yù)分頻值BRP決定:tq=BRP/tsys。圖7.2.1說明了CAN總線的一個位時間的各個組成部分。第六十二頁,共81頁。圖7.2.1CAN總線的一個位時間第六十三頁,共81頁?!裢蕉危河糜谕娇偩€上的各個節(jié)點(diǎn),在此段內(nèi)期望有一個跳變沿出現(xiàn)(其長度固定)。如果跳變沿出現(xiàn)在同步段之外,那么沿與同步段之間的長度叫做沿相位誤差。采樣點(diǎn)位于相位緩沖段1的末尾和相位緩沖段2開始處?!駛鞑r間段:用于補(bǔ)償總線上信號傳播時間和電子控制設(shè)備內(nèi)部的延遲時間。因此,要實(shí)現(xiàn)與位流發(fā)送節(jié)點(diǎn)的同步,接收節(jié)點(diǎn)必須移相。CAN總線非破壞性仲裁規(guī)定,發(fā)送位流的總線節(jié)點(diǎn)必須能夠收到同步于位流的CAN總線節(jié)點(diǎn)發(fā)送的顯性位?!裣辔痪彌_段1:重同步時可以暫時延長?!裣辔痪彌_段2:重同步時可以暫時縮短?!裢教D(zhuǎn)寬度:長度小于相位緩沖段。同步段,傳播時間段,相位緩沖段1和相位緩沖段2的設(shè)定和CAN總線的同步、仲裁等信息有關(guān)。其主要思想是要求各個節(jié)點(diǎn)在一定誤差范圍內(nèi)保持同步。必須考慮各個節(jié)點(diǎn)時鐘(振蕩器)的誤差和總線的長度帶來的延遲(通常每米延遲為5.5ns)。正確設(shè)置CAN總線各個時間段,是保證CAN總線良好工作的關(guān)鍵。第六十四頁,共81頁。7.2.2在嵌入式處理器上擴(kuò)展CAN總線接口一些面向工業(yè)控制的嵌入式處理器本身就集成了一個或者多個CAN總線控制器。例如:韓國現(xiàn)代公司的hms30c7202(ARM720T內(nèi)核)帶有兩個CAN總線控制器;Phillips公司的LPC2194和LPC2294(ARM7TDMI內(nèi)核)帶有4個CAN總線控制器。CAN總線控制器主要是完成時序邏輯轉(zhuǎn)換等工作,要在電氣特性上滿足CAN總線標(biāo)準(zhǔn),還需要一個CAN總線的物理層芯片,用它來實(shí)現(xiàn)TTL電平到CAN總線電平特性的轉(zhuǎn)換,即CAN收發(fā)器。實(shí)際上,多數(shù)嵌入式處理器都不帶CAN總線控制器。通常的解決方案是在嵌入式處理器的外部總線上擴(kuò)展CAN總線接口芯片,例如:Phillips公司的SJA1000CAN總線接口芯片,Microchip公司的MCP251x系列(MCP2510和MCP2515)CAN總線接口芯片,這兩種芯片都支持CAN2.0B標(biāo)準(zhǔn)。SJA1000的總線采用的是地址線和數(shù)據(jù)線復(fù)用的方式,多數(shù)嵌入式處理器采用SJA1000擴(kuò)展CAN總線較為復(fù)雜。第六十五頁,共81頁。MCP2510是由Microchip公司生產(chǎn)的CAN協(xié)議控制器,完全支持CAN總線V2.OA/B技術(shù)規(guī)范。0~8字節(jié)的有效數(shù)據(jù)長度,支持遠(yuǎn)程幀;最大1Mb/s的可編程波特率;兩個支持過濾器Filter,Mask)的接收緩沖區(qū),三個發(fā)送緩沖區(qū);支持回環(huán)(LoopBack)模式,便于測試;SPI高速串行總線,最大5MHz;3V到5.5V供電。MCP2510主要由CAN協(xié)議引擎,用來為器件及其運(yùn)行進(jìn)行配置的控制邏輯,SRAM寄存器和SPI協(xié)議模塊3部分組成。MCP2510支持CANT2、CAN2.0A、主動和被動CAN2.0B等版本的協(xié)議,能夠發(fā)送和接收標(biāo)準(zhǔn)和擴(kuò)展報(bào)文,還同時具備驗(yàn)收過濾以及報(bào)文管理功能。MCP2510包含三個發(fā)送緩沖器和兩個接收緩沖器,減少了處理器(CPU)的管理負(fù)擔(dān)。CPU的通信是通過行業(yè)標(biāo)準(zhǔn)串行外設(shè)接口(SPI)來實(shí)現(xiàn)的,其數(shù)據(jù)傳輸速率高達(dá)5Mbps。CPU通過SPI接口與器件進(jìn)行通信。通過使用標(biāo)準(zhǔn)SPI讀/寫命令對寄存器進(jìn)行所有讀/寫操作。器件上有一個多用途中斷引腳以及各接收緩沖器專用的中斷引腳,可用于指示有效報(bào)文是否被接收和載入各接收緩沖器。是否使用專用中斷引腳由用戶決定,若不使用,也可用通用中斷引腳和狀態(tài)寄存器(通過SPI接口訪問)確定有效報(bào)文是否已被接收。第六十六頁,共81頁。1.CAN協(xié)議引擎CAN協(xié)議引擎的功能是處理所有總線上的報(bào)文發(fā)送和接收。報(bào)文發(fā)送時,首先將報(bào)文裝載到正確的報(bào)文緩沖器和控制寄存器中。利用控制寄存器位、通過SPI接口或使用發(fā)送使能引腳均可啟動發(fā)送操作。通過讀取相應(yīng)的寄存器可以檢查通信狀態(tài)和錯誤。任何在CAN總線上偵測到的報(bào)文都會進(jìn)行錯誤檢測,然后與用戶定義的濾波器進(jìn)行匹配,以確定是否將其轉(zhuǎn)移到兩個接收緩沖器之一中。CAN協(xié)議引擎的核心是有限狀態(tài)機(jī)(FSM)。該狀態(tài)機(jī)逐位檢查報(bào)文,當(dāng)各個報(bào)文幀發(fā)生數(shù)據(jù)字段的發(fā)送和接收時,狀態(tài)機(jī)改變狀態(tài)。FSM確保了報(bào)文接收、總線仲裁、報(bào)文發(fā)送以及錯誤信號發(fā)生等操作過程依據(jù)CAN總線協(xié)議進(jìn)行??偩€上報(bào)文的自動重發(fā)送也由FSM處理。第六十七頁,共81頁。2.CAN報(bào)文幀MCP2510支持CAN2.0B技術(shù)規(guī)范中所定義的標(biāo)準(zhǔn)數(shù)據(jù)幀、擴(kuò)展數(shù)據(jù)幀以及遠(yuǎn)程幀(標(biāo)準(zhǔn)和擴(kuò)展),詳細(xì)的描述請登錄,查閱MCP2510數(shù)據(jù)手冊。3.寄存器映射表MCP2510寄存器映射表如表7.2.1所示。通過使用行(低4位)列(高4位)值可對映射表中的寄存器地址進(jìn)行確定。寄存器的地址排列優(yōu)化了寄存器數(shù)據(jù)的順序讀/寫。一些特定控制和狀態(tài)寄存器允許使用SPI位修改命令進(jìn)行單獨(dú)位的設(shè)定??梢允褂梦恍薷拿顚Ρ?.2.1中的陰影部分的寄存器進(jìn)行位修改操作。第六十八頁,共81頁。4.SPI接口MCP2510可以與許多微控制器的串行外設(shè)接口(SPI)直接相連,支持0,0和1,1運(yùn)行模式。外部數(shù)據(jù)和命令通過SI引腳傳送到器件中,而數(shù)據(jù)在SCK時鐘信號的上升沿傳送進(jìn)去。MCP2510在SCK下降沿通過SO引腳發(fā)送。MCP2510SPI指令如表7.2.3所示。有關(guān)0,0和1,1運(yùn)行模式詳細(xì)的輸入輸出時序請登錄,查閱MCP2510數(shù)據(jù)手冊。第六十九頁,共81頁。CANSPI接口函數(shù)為:unsignedcharCAN_SPI_CMD(unsignedcharcmd,unsignedlongaddr,unsignedcharargl,unsignedchararg2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023六年級數(shù)學(xué)下冊 二 圓柱和圓錐第四課時 圓柱的體積教案 蘇教版
- 租賃倉庫合同(2篇)
- 自擔(dān)風(fēng)險(xiǎn)的合同(2篇)
- 西南林業(yè)大學(xué)《城市規(guī)劃原理》2021-2022學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《藝術(shù)鑒賞》2021-2022學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《攝影攝像基礎(chǔ)》2021-2022學(xué)年第一學(xué)期期末試卷
- 別克新一代君威按鍵操作課件
- 西京學(xué)院《電子系統(tǒng)綜合設(shè)計(jì)實(shí)訓(xùn)》2021-2022學(xué)年期末試卷
- 風(fēng)力發(fā)電 課件
- 浣溪沙課件圖片
- 涵洞檢查評定表
- 幼兒園健康課件ppt
- 衛(wèi)健委2020年落實(shí)婦女兒童發(fā)展規(guī)劃情況的匯報(bào)
- 白蛋白的合理使用(專業(yè)應(yīng)用)
- 不同季節(jié)的花(共27張PPT)課件
- 綠化起重吊裝專項(xiàng)方案
- 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)ppt課件(完整版)
- DB62∕T 4339-2021 高速公路工地試驗(yàn)室標(biāo)準(zhǔn)化指南
- 安然納米會員手冊
- 發(fā)散思維與聚合思維(課堂PPT)
- 《安全評價》課程設(shè)計(jì)-采石場
評論
0/150
提交評論