




已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第7章嵌入式系統(tǒng)網(wǎng)絡(luò)接口 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)成 圖7 1 1802 3模型層間結(jié)構(gòu) 1 傳輸編碼在802 3版本的標(biāo)準(zhǔn)中 沒有采用直接的二進制編碼 即用0V表示 0 用5V表示 1 而是采用曼徹斯特編碼 ManchesterEncoding 或者差分曼徹斯特編碼 DifferentialManchesterEncoding 不同編碼形式如圖7 1 2所示 圖7 1 2不同編碼形式 其中 曼徹斯特編碼的規(guī)律是 每位中間有一個電平跳變 從高到低的跳變表示為 0 從低到高的跳變表示為 1 差分曼徹斯特編碼的規(guī)律是 每位的中間也有一個電平跳變 但不用這個跳變來表示數(shù)據(jù) 而是利用每個碼元開始時有無跳變來表示 0 或 1 有跳變表示 0 無跳變表示 1 曼徹斯特編碼和差分曼徹斯特編碼相比 前者編碼簡單 后者能提供更好的噪聲抑制性能 在802 3系統(tǒng)中 采用曼徹斯特編碼 其高電平為 0 85V 低電平信號為 0 85V 這樣指令信號電壓仍然是0V 2 802 3Mac層的幀802 3Mac層的以太網(wǎng)的物理傳輸幀如表7 1 1所示 表7 1 1802 3幀的格式 PR 同步位 用于收發(fā)雙方的時鐘同步 同時也指明了傳輸?shù)乃俾?是56位的的二進制數(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é) TYPE 類型字段 表明該幀的數(shù)據(jù)是什么類型的數(shù)據(jù) 不同協(xié)議的類型字段不同 如 0800H表示數(shù)據(jù)為IP包 0806H表示數(shù)據(jù)為ARP包 814CH是SNMP包 8137H為IPX SPX包 小于0600H的值是用于IEEE802的 表示數(shù)據(jù)包的長度 DATA 數(shù)據(jù)段 該段數(shù)據(jù)不能超過1500B 因為以太網(wǎng)規(guī)定整個傳輸包的最大長度不能超過1514E 14B為DA SA TYPE PAD 填充位 由于以太網(wǎng)幀傳輸?shù)臄?shù)據(jù)包最小不能小于60B 除去 DA SA TYPE的14B 還必須傳輸46B的數(shù)據(jù) 當(dāng)數(shù)據(jù)段的數(shù)據(jù)不足46B時 后面通常是補0 也可以補其他值 FCS 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個段的內(nèi)容是由上層的軟件控制的 3 以太網(wǎng)數(shù)據(jù)傳輸?shù)奶攸c 所有數(shù)據(jù)位的傳輸由低位開始 傳輸?shù)奈涣魇怯寐鼜厮固鼐幋a 以太網(wǎng)是基于沖突檢測的總線復(fù)用方法 沖突退避算法是由硬件自動執(zhí)行的 以太網(wǎng)傳輸?shù)臄?shù)據(jù)段的長度 DA SA TYPE DATA PAD最小為60B 最大為1514B 通常的以太網(wǎng)卡可以接收3種地址的數(shù)據(jù) 一個是廣播地址 一個是多播地址 或者叫組播地址 在嵌入式系統(tǒng)中很少用到 一個是它自己的地址 但有時 用于網(wǎng)絡(luò)分析和監(jiān)控 網(wǎng)卡也可以設(shè)置為接收任何數(shù)據(jù)包 任何兩個網(wǎng)卡的物理地址都是不一樣的 是世界上唯一的 網(wǎng)卡地址由專門機構(gòu)分配 不同廠家使用不同地址段 同一廠家的任何兩個網(wǎng)卡的地址也是唯一的 根據(jù)網(wǎng)卡的地址段 網(wǎng)卡地址的前3個字節(jié) 可以知道網(wǎng)卡的生產(chǎn)廠家 7 1 2嵌入式以太網(wǎng)接口的實現(xiàn)方法在嵌入式系統(tǒng)中增加以太網(wǎng)接口 通常有如下兩種方法實現(xiàn) 1 嵌入式處理器 網(wǎng)卡芯片這種方法只要把以太網(wǎ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è)計的 要求嵌入式處理器有通用的網(wǎng)絡(luò)接口 比如 MII接口 處理器和網(wǎng)絡(luò)數(shù)據(jù)交換通過內(nèi)部總線 速度快 7 1 3在嵌入式系統(tǒng)中主要處理的以太網(wǎng)協(xié)議TCP IP是一個分層的協(xié)議 包含有用于層 傳輸層 網(wǎng)絡(luò)層 數(shù)據(jù)鏈路層 物理層等 每一層實現(xiàn)一個明確的功能 對應(yīng)一個或者幾個傳輸協(xié)議 每層相對于它的下層都作為一個獨立的數(shù)據(jù)包來實現(xiàn) 典型的分層和每層上的協(xié)議如表7 1 2所示 表7 1 2TCP IP協(xié)議的典型分層和協(xié)議 1 ARP AddressResolationProtocol 地址解析協(xié)議 網(wǎng)絡(luò)層用32位的地址來標(biāo)識不同的主機 即IP地址 而鏈路層使用48位的物理 MAC 地址來標(biāo)識不同的以太網(wǎng)或令牌環(huán)網(wǎng)接口 只知道目的主機的IP地址并不能發(fā)送數(shù)據(jù)幀給它 必須知道目的主機網(wǎng)絡(luò)接口的物理地址才能發(fā)送數(shù)據(jù)幀 ARP的功能就是實現(xiàn)從IP地址到對應(yīng)物理地址的轉(zhuǎn)換 源主機發(fā)送一份包含目的主機IP地址的ARP請求數(shù)據(jù)幀給網(wǎng)上的每個主機 稱作ARP廣播 目的主機的ARP收到這份廣播報文后 識別出這是發(fā)送端在詢問它的IP地址 于是發(fā)送一個包含目的主機IP地址及對應(yīng)的物理地址的ARP回答給源主機 為了加快ARP協(xié)議解析的數(shù)據(jù) 每臺主機上都有一個ARPcache存放最近的IP地址到硬件地址之間的映射記錄 其中每一項的生存時間 一般為20分鐘 這樣當(dāng)在ARP的生存時間之內(nèi)連續(xù)進行ARP解析的時候 不需要反復(fù)發(fā)送ARP請求了 2 ICMP InternetControlMessagesProtocol 網(wǎng)絡(luò)控制報文協(xié)議 ICMP是IP層的附屬協(xié)議 IP層用它來與其他主機或路由器交換錯誤報文和其他重要控制信息 ICMP報文是在IP數(shù)據(jù)包內(nèi)部被傳輸?shù)?在Linux或者Windows中 兩個常用的網(wǎng)絡(luò)診斷工具ping和traceroute Windows下是Tracert 其實就是ICMP協(xié)議 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ù)包最長可達65535字節(jié) 其中報頭占32位 還包含各32位的源IP地址和32位的目的IP地址 TTL time to live 生存時間字段 指定了IP數(shù)據(jù)包的生存時間 數(shù)據(jù)包可以經(jīng)過的最多路由器數(shù) TTL的初始值由源主機設(shè)置 一旦經(jīng)過一個處理它的路由器 它的值就減去1 當(dāng)該字段的值為0時 數(shù)據(jù)包就被丟棄 并發(fā)送ICMP報文通知源主機重發(fā) IP提供不可靠 無連接的數(shù)據(jù)包傳送服務(wù) 高效 靈活 不可靠 unreliable 的意思是它不能保證IP數(shù)據(jù)包能成功地到達目的地 如果發(fā)生某種錯誤 IP有一個簡單的錯誤處理算法 丟棄該數(shù)據(jù)包 然后發(fā)送ICMP消息報給信源端 任何要求的可靠性必須由上層來提供 如TCP 無連接 connectionless 的意思是IP并不維護任何關(guān)于后續(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)絡(luò)上 那么IP數(shù)據(jù)包就直接送到目的主機上 否則就把數(shù)據(jù)包發(fā)往一默認的路由器上 由路由器來轉(zhuǎn)發(fā)該數(shù)據(jù)包 最終經(jīng)過數(shù)次轉(zhuǎn)發(fā)到達目的主機 IP路由選擇是逐跳 hop by hop 進行的 所有的IP路由選擇只為數(shù)據(jù)包傳輸提供下一站路由器的IP地址 4 TCP TransferControlProtocol 傳輸控制協(xié)議 TCP協(xié)議是一個面向連接的可靠的傳輸層協(xié)議 TCP為兩臺主機提供高可靠性的端到端數(shù)據(jù)通信 它所做的工作包括 發(fā)送方把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊 并添加附加信息 TCP頭 包括順序號 源 目的端口 控制 糾錯信息等字段 稱為TCP數(shù)據(jù)包 并將TCP數(shù)據(jù)包交給下面的網(wǎng)絡(luò)層處理 接受方確認接收到的TCP數(shù)據(jù)包 重組并將數(shù)據(jù)送往高層 5 UDP UserDatagramProtocol 用戶數(shù)據(jù)包協(xié)議 UDP協(xié)議是一種無連接不可靠的傳輸層協(xié)議 它只是把應(yīng)用程序傳來的數(shù)據(jù)加上UDP頭 包括端口號 段長等字段 作為UDP數(shù)據(jù)包發(fā)送出去 但是并不保證它們能到達目的地 可靠性由應(yīng)用層來提供 因為協(xié)議開銷少 和TCP協(xié)議相比 UDP更適用于應(yīng)用在低端的嵌入式領(lǐng)域中 很多場合如網(wǎng)絡(luò)管理SNMP 域名解析DNS 簡單文件傳輸協(xié)議TFTP 大都使用UDP協(xié)議 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之間的端口號 7 1 4網(wǎng)絡(luò)編程接口BSD套接字 BSDSockets 使用的最廣泛的網(wǎng)絡(luò)程序編程方法 主要用于應(yīng)用程序的編寫 用于網(wǎng)絡(luò)上主機與主機之間的相互通信 很多操作系統(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ù) 下面給出一個使用套接字接口的UDP通信的流程 UDP服務(wù)器端和一個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 關(guān)閉Socket 通信終止 close sFd 7 1 5以太網(wǎng)的物理層接口及編程大多數(shù)ARM都內(nèi)嵌一個以太網(wǎng)控制器 支持媒體獨立接口 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等 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校驗碼 可編程接收功能 自動切換于DMA和片內(nèi)RAM 提前產(chǎn)生中斷便于數(shù)據(jù)幀預(yù)處理 數(shù)據(jù)流可降低CPU消耗 自動阻斷錯誤包 可跳線控制EEPROM功能 啟動編程支持無盤系統(tǒng) 邊沿掃描和回環(huán)測試 待機和睡眠模式 支持廣泛的軟件驅(qū)動 工業(yè)級溫度范圍 LED指示連接狀態(tài)和網(wǎng)絡(luò)活動情況等特點 采用TQFP 100封裝 CS8900A內(nèi)部結(jié)構(gòu)方框圖如圖7 1 3所示 圖7 1 3CS8900A內(nèi)部結(jié)構(gòu)方框圖 1 CS8900A工作原理CS8900A有兩種工作模式 和I O模式 當(dāng)配置成MEMORYMODE模式操作時 CS8900A的內(nèi)部寄存器和幀緩沖區(qū)映射到主機內(nèi)存中連續(xù)的4KB的塊中 主機可以通過這個塊直接訪問CS8900A的內(nèi)部寄存器和幀緩沖區(qū) MEMORY模式需要硬件上多根地址線和網(wǎng)卡相連 而在I OMODE模式 對任何寄存器操作均要通過I O端口0寫入或讀出 I OMODE模式在硬件上實現(xiàn)比較方便 而且這也是芯片的默認模式 在I O模式下 PacketPage存儲器被映射到CPU的8個16位的I O端口上 在芯片被加電后 I O基地址的默認值被置為300H 使用CS8900A作為以太網(wǎng)的物理層接口 在收到由主機發(fā)來的數(shù)據(jù)報后 從目的地址域到數(shù)據(jù)域 偵聽網(wǎng)絡(luò)線路 如果線路忙 它就等到線路空閑為止 否則 立即發(fā)送該數(shù)據(jù)幀 在發(fā)送過程中 首先它添加以太網(wǎng)幀頭 包括前導(dǎo)字段和幀開始標(biāo)志 然后生成CRC校驗碼 最后將此數(shù)據(jù)幀發(fā)送到以太網(wǎng)上 在接收過程中 它將從以太網(wǎng)收到的數(shù)據(jù)幀在經(jīng)過解碼 去幀頭和地址檢驗等步驟后緩存在片內(nèi) 在CRC校驗通過后 它會根據(jù)初始化配置情況 通知主機CS8900A收到了數(shù)據(jù)幀 最后 用某種傳輸模式 FO模式 Memory模式 DMA模式 傳到主機的存儲區(qū)中 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所示 表7 1 3ISA總線接口引腳端和功能 表7 1 4EEPROM和引導(dǎo)編程接口引腳端和功能 表7 1 5IOBASE T接口引腳端 表7 1 6附加單元接口引腳端和功能 表7 1 7通用引腳端和功能 3 電路連接采用CS8900A與S3C2410A連接構(gòu)成的以太網(wǎng)接口電路如圖7 1 4所示 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ù)定義為 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 lp structnet local dev cs89x0 priv request region dev cs89x0 base addr NETCARD IO EXTENT cs8900a spin lock init 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 0 xNNN n ret EPERM gotoout if register netdev 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ù)實現(xiàn) 通過調(diào)用register netdrv structnet device dev 函數(shù)進行注冊 與init函數(shù)相對應(yīng)的cleanup函數(shù)在模塊卸載時運行 主要完成資源的釋放工作 如取消設(shè)備注冊 釋放內(nèi)存 釋放端口等 函數(shù)定義為 staticvoid exitcleanup cs8900a s3c2410 void if dev cs89x0 priv NULL Freeuptheprivatestructure orleakmemory unregister netdev 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 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 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 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 打開函數(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 3 關(guān)閉函數(shù)關(guān)閉函數(shù)釋放資源減少系統(tǒng)負擔(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 4 發(fā)送函數(shù)首先 在網(wǎng)絡(luò)設(shè)備驅(qū)動加載時 通過device域中的init函數(shù)指針調(diào)用網(wǎng)絡(luò)設(shè)備的初始化函數(shù)對設(shè)備進行初始化 如果操作成功 就可以通過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)認為硬件忙 要等到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 staticintnet send packet structsk buff skb structnet device dev structnet local lp structnet local dev priv writereg dev PP BusCTL 0 x0 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 data ETH ALEN ETH ALEN 1 spin lock irq initiateatransmitsequence writeword dev TX CMD PORT lp send cmd writeword dev TX LEN PORT skb len Testtoseeifthechiphasallocatedmemoryforthepacket if readreg dev PP BusST 5 中斷處理和接收函數(shù)網(wǎng)絡(luò)設(shè)備接收數(shù)據(jù)通過中斷實現(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 if status 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 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 在net rx 函數(shù)中調(diào)用netif rx 把數(shù)據(jù)傳送到協(xié)議層 netif rx 函數(shù)把數(shù)據(jù)放入處理隊列 然后返回 真正的處理是在中斷返回以后 這樣可以減少中斷時間 調(diào)用netif rx 后 驅(qū)動程序不能再存取數(shù)據(jù)緩沖區(qū)skb netif 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 netdev rx stat this cpu total if queue input pkt queue qleninput pkt queue qlen if queue throttle gotodrop enqueue dev hold skb dev skb queue tail if queue throttle queue throttle 0 ifdefCONFIG NET HW FLOWCONTROLif atomic dec and test ifdefCONFIG NET HW FLOWCONTROL atomic inc 中斷函數(shù)net interrupt在打開函數(shù)中申請 中斷發(fā)生后 首先驅(qū)動中斷管腳為高電平 然后主機讀取CS8900A中的中斷申請序列ISQ值 以確定事件類型 根據(jù)事件類型做出響應(yīng) 函數(shù)定義為 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 net rx dev break caseISQ TRANSMITTER EVENT lp stats tx packets netif wake queue dev Informupperlayers if status caseISQ BUFFER EVENT if status caseISQ RX MISS EVENT lp stats rx missed errors status 6 break caseISQ TX COL EVENT lp stats collisions status 6 break 7 2CAN總線接口 7 2 1CAN總線概述CAN ControllerAreaNetwork 控制器局域網(wǎng) 是德國Bosch公司于1983年為汽車應(yīng)用而開發(fā)的 它是一種現(xiàn)場總線 FieldBus 能有效支持分布式控制和實時控制的串行通信網(wǎng)絡(luò) 1993年11月 ISO正式頒布了控制器局域網(wǎng)CAN國際標(biāo)準(zhǔn) IS011898 一個理想的由CAN總線構(gòu)成的單一網(wǎng)絡(luò)中可以掛接任意多個節(jié)點 實際應(yīng)用中節(jié)點數(shù)目受網(wǎng)絡(luò)硬件的電氣特性所限制 例如 當(dāng)使用PhilipsP82C250作為CAN收發(fā)器時 同一網(wǎng)絡(luò)中允許掛接110個節(jié)點 CAN可提供1Mb s的數(shù)據(jù)傳輸速率 CAN總線是一種多主方式的串行通信總線 基本設(shè)計規(guī)范要求有高的位速率 高抗電磁干擾性 并可以檢測出產(chǎn)生的任何錯誤 當(dāng)信號傳輸距離達到10Km時CAN總線仍可提供高達50Kb s的數(shù)據(jù)傳輸速率 CAN總線具有很高的實時性能 已經(jīng)在汽車工業(yè) 航空工業(yè) 工業(yè)控制 安全防護等領(lǐng)域中得到了廣泛應(yīng)用 CAN總線的通信介質(zhì)可采用雙絞線 同軸電纜和光導(dǎo)纖維 最常用的是雙絞線 通信距離與波特率有關(guān) 最大通信距離可達10km 最大通信波特率可達1Mbps CAN總線仲裁采用11位標(biāo)識和非破壞性位仲裁總線結(jié)構(gòu)機制 可以確定數(shù)據(jù)塊的優(yōu)先級 保證在網(wǎng)絡(luò)節(jié)點沖突時最高優(yōu)先級節(jié)點不需要沖突等待 CAN總線采用了多主競爭式總線結(jié)構(gòu) 具有多主站運行和分散仲裁的串行總線以及廣播通信的特點 CAN總線上任意節(jié)點可在任意時刻主動向網(wǎng)絡(luò)上其他節(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 當(dāng) 顯性 位和 隱性 位同時發(fā)送的時候 最后總線數(shù)值將為 顯性 CAN總線的一個位時間可以分成四個部分 同步段 傳播時間段 相位緩沖段1和相位緩沖段2 每段的時間份額的數(shù)目都是可以通過CAN總線控制器編程控制 而時間份額的大小tq由系統(tǒng)時鐘tsys和波特率預(yù)分頻值BRP決定 tq BRP tsys 圖7 2 1說明了CAN總線的一個位時間的各個組成部分 圖7 2 1CAN總線的一個位時間 同步段 用于同步總線上的各個節(jié)點 在此段內(nèi)期望有一個跳變沿出現(xiàn) 其長度固定 如果跳變沿出現(xiàn)在同步段之外 那么沿與同步段之間的長度叫做沿相位誤差 采樣點位于相位緩沖段1的末尾和相位緩沖段2開始處 傳播時間段 用于補償總線上信號傳播時間和電子控制設(shè)備內(nèi)部的延遲時間 因此 要實現(xiàn)與位流發(fā)送節(jié)點的同步 接收節(jié)點必須移相 CAN總線非破壞性仲裁規(guī)定 發(fā)送位流的總線節(jié)點必須能夠收到同步于位流的CAN總線節(jié)點發(fā)送的顯性位 相位緩沖段1 重同步時可以暫時延長 相位緩沖段2 重同步時可以暫時縮短 同步跳轉(zhuǎn)寬度 長度小于相位緩沖段 同步段 傳播時間段 相位緩沖段1和相位緩沖段2的設(shè)定和CAN總線的同步 仲裁等信息有關(guān) 其主要思想是要求各個節(jié)點在一定誤差范圍內(nèi)保持同步 必須考慮各個節(jié)點時鐘 振蕩器 的誤差和總線的長度帶來的延遲 通常每米延遲為5 5ns 正確設(shè)置CAN總線各個時間段 是保證CAN總線良好工作的關(guān)鍵 7 2 2在嵌入式處理器上擴展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總線的物理層芯片 用它來實現(xiàn)TTL電平到CAN總線電平特性的轉(zhuǎn)換 即CAN收發(fā)器 實際上 多數(shù)嵌入式處理器都不帶CAN總線控制器 通常的解決方案是在嵌入式處理器的外部總線上擴展CAN總線接口芯片 例如 Phillips公司的SJA1000CAN總線接口芯片 Microchip公司的MCP251x系列 MCP2510和MCP2515 CAN總線接口芯片 這兩種芯片都支持CAN2 0B標(biāo)準(zhǔn) SJA1000的總線采用的是地址線和數(shù)據(jù)線復(fù)用的方式 多數(shù)嵌入式處理器采用SJA1000擴展CAN總線較為復(fù)雜 MCP2510是由Microchip公司生產(chǎn)的CAN協(xié)議控制器 完全支持CAN總線V2 OA B技術(shù)規(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ā)送和接收標(biāo)準(zhǔn)和擴展報文 還同時具備驗收過濾以及報文管理功能 MCP2510包含三個發(fā)送緩沖器和兩個接收緩沖器 減少了處理器 CPU 的管理負擔(dān) CPU的通信是通過行業(yè)標(biāo)準(zhǔn)串行外設(shè)接口 SPI 來實現(xiàn)的 其數(shù)據(jù)傳輸速率高達5Mbps CPU通過SPI接口與器件進行通信 通過使用標(biāo)準(zhǔn)SPI讀 寫命令對寄存器進行所有讀 寫操作 器件上有一個多用途中斷引腳以及各接收緩沖器專用的中斷引腳 可用于指示有效報文是否被接收和載入各接收緩沖器 是否使用專用中斷引腳由用戶決定 若不使用 也可用通用中斷引腳和狀態(tài)寄存器 通過SPI接口訪問 確定有效報文是否已被接收 1 CAN協(xié)議引擎CAN協(xié)議引擎的功能是處理所有總線上的報文發(fā)送和接收 報文發(fā)送時 首先將報文裝載到正確的報文緩沖器和控制寄存器中 利用控制寄存器位 通過SPI接口或使用發(fā)送使能引腳均可啟動發(fā)送操作 通過讀取相應(yīng)的寄存器可以檢查通信狀態(tài)和錯誤 任何在CAN總線上偵測到的報文都會進行錯誤檢測 然后與用戶定義的濾波器進行匹配 以確定是否將其轉(zhuǎn)移到兩個接收緩沖器之一中 CAN協(xié)議引擎的核心是有限狀態(tài)機 FSM 該狀態(tài)機逐位檢查報文 當(dāng)各個報文幀發(fā)生數(shù)據(jù)字段的發(fā)送和接收時 狀態(tài)機改變狀態(tài) FSM確保了報文接收 總線仲裁 報文發(fā)送以及錯誤信號發(fā)生等操作過程依據(jù)CAN總線協(xié)議進行 總線上報文的自動重發(fā)送也由FSM處理 2 CAN報文幀MCP2510支持CAN2 0B技術(shù)規(guī)范中所定義的標(biāo)準(zhǔn)數(shù)據(jù)幀 擴展數(shù)據(jù)幀以及遠程幀 標(biāo)準(zhǔn)和擴展 詳細的描述請登錄 查閱MCP2510數(shù)據(jù)手冊 3 寄存器映射表MCP2510寄存器映射表如表7 2 1所示 通過使用行 低4位 列 高4位 值可對映射表中的寄存器地址進行確定 寄存器的地址排列優(yōu)化了寄存器數(shù)據(jù)的順序讀 寫 一些特定控制和狀態(tài)寄存器允許使用SPI位修改命令進行單獨位的設(shè)定 可以使用位修改命令對表7 2 1中的陰影部分的寄存器進行位修改操作 4 SPI接口MCP2510可以與許多微控制器的串行外設(shè)接口 SPI 直接相連 支持0 0和1 1運行模式 外部數(shù)據(jù)和命令通過SI引腳傳送到器件中 而數(shù)據(jù)在SCK時鐘信號的上升沿傳送進去 MCP2510在SCK下降沿通過SO引腳發(fā)送 MCP2510SPI指令如表7 2 3所示 有關(guān)0 0和1 1運行模式詳細的輸入輸出時序請登錄 查閱MCP2510數(shù)據(jù)手冊 CANSPI接口函數(shù)為 unsignedcharCAN SPI CMD unsignedcharcmd unsignedlongaddr unsignedcharargl unsignedchararg2 其中cmd表示指令名稱 addr為寄存器地址 argl和arg2為可選的參數(shù) cmd為SPI CMD READ時 將讀取addr地址的寄存器值 argl和arg2沒有使用 cmd為SPI CMD WRITE時 將往addr地址的寄存器寫argl值 arg2沒有使用 cmd為SPI CMD RTS時 將發(fā)送RTS請求 argl和arg2沒有使用 cmd為SPI CMD REA
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ICU膿毒血癥的護理措施
- 幼兒園網(wǎng)絡(luò)安全管理培訓(xùn)
- 幼犬術(shù)后護理常規(guī)
- 護理學(xué)基礎(chǔ)知識培訓(xùn)
- 起重作業(yè)安全培訓(xùn)
- 安全教育網(wǎng)課
- 2025年互聯(lián)網(wǎng)廣告精準(zhǔn)投放算法效果評估與廣告投放效果效果評估創(chuàng)新報告
- 腫瘤登記隨訪方法
- 2025年工業(yè)互聯(lián)網(wǎng)平臺自然語言處理技術(shù)賦能工業(yè)生產(chǎn)報告
- 儲能系統(tǒng)在智能電網(wǎng)中的應(yīng)用與系統(tǒng)穩(wěn)定性研究報告
- 哮喘的治療與護理講課件
- 部編版語文五年級下冊全冊復(fù)習(xí)知識匯-總
- 2025年河北地礦中地建設(shè)有限公司招聘筆試參考題庫含答案解析
- 常見護理工作應(yīng)急預(yù)案及流程
- 2025年聊城市茌平區(qū)高鐵建設(shè)發(fā)展有限公司招聘筆試參考題庫含答案解析
- 湖南省長沙市寧鄉(xiāng)市2024-2025學(xué)年三年級下學(xué)期6月期末科學(xué)試卷(含答案)
- 2025五年級道德與法治下冊期末綜合測試卷(含答案)
- 2025至2030中國房產(chǎn)證抵押貸款行業(yè)市場深度分析及投資與前景預(yù)測報告
- 定向士官心理測試題及答案
- 2025至2030中國LNG運輸行業(yè)市場發(fā)展分析及前景預(yù)測與戰(zhàn)略規(guī)劃報告
- GM/T 0021-2023動態(tài)口令密碼應(yīng)用技術(shù)規(guī)范
評論
0/150
提交評論