CP2102與C8051F040的USB-CAN轉(zhuǎn)換器設(shè)計(jì)
3 USB與CAN之間協(xié)議轉(zhuǎn)換的實(shí)現(xiàn)
設(shè)計(jì)在充分遵守USB和CAN協(xié)議的基礎(chǔ)上,實(shí)現(xiàn)了USB數(shù)據(jù)與CAN數(shù)據(jù)之間的協(xié)議轉(zhuǎn)換和轉(zhuǎn)發(fā)。在設(shè)計(jì)過(guò)程中,USB的高速率和CAN的低速率,以及USB的大數(shù)據(jù)包和CAN的小數(shù)據(jù)包之間存在著矛盾,必須認(rèn)真解決,否則可能造成數(shù)據(jù)丟失、協(xié)議轉(zhuǎn)換不可靠、設(shè)備工作不穩(wěn)定。本設(shè)計(jì)中USB和CAN都采用了接收中斷方式,將USB和CAN的數(shù)據(jù)包先存儲(chǔ)下來(lái),作為緩沖進(jìn)一步處理。在接收中斷服務(wù)程序的數(shù)據(jù)時(shí),只有將數(shù)據(jù)準(zhǔn)確地收取下來(lái),才將接收緩沖區(qū)釋放,在此之前拒絕接收新的數(shù)據(jù)。在數(shù)據(jù)發(fā)送時(shí),先確認(rèn)發(fā)送緩沖區(qū)可用才寫(xiě)入數(shù)據(jù)。由于兩端接口芯片都有內(nèi)部的發(fā)送和接收緩沖區(qū),主程序的主要任務(wù)就是完成數(shù)據(jù)的轉(zhuǎn)發(fā),以及提供通信同步的握手協(xié)議,防止數(shù)據(jù)丟失和順序錯(cuò)誤。
相對(duì)于CAN總線傳輸速率,USB總線速率要高得多,128字節(jié)的緩沖區(qū)也比CAN總線芯片8字節(jié)緩沖區(qū)大得多。因此,向CAN接口發(fā)送數(shù)據(jù)需要完成拆包和重新打包的任務(wù),屬較慢的操作,采用定時(shí)查詢式發(fā)送。CAN接收任務(wù)時(shí),每次盲接轉(zhuǎn)發(fā)CAN接口收到的8字節(jié)數(shù)據(jù)到USB接口發(fā)送緩沖區(qū),采用2個(gè)信號(hào)量(CAN―rcv,USB―wr)完成數(shù)據(jù)同步操作。數(shù)據(jù)轉(zhuǎn)發(fā)工作共有以下4個(gè)任務(wù)協(xié)調(diào)配合完成。
(1)USB中斷后續(xù)處理任務(wù)
CP2102接收到數(shù)據(jù)或發(fā)送完成,都會(huì)觸發(fā)中斷程序運(yùn)行。中斷處理程序只需要簡(jiǎn)單地通知此任務(wù)有中斷發(fā)生,以盡量減少中斷關(guān)閉的時(shí)間。因此,這個(gè)任務(wù)的優(yōu)先級(jí)最高,并且一旦開(kāi)始運(yùn)行便不再等待其他事件,要盡快處理完成。此任務(wù)根據(jù)USB接口的不同中斷原因,通知其他任務(wù)進(jìn)行后續(xù)的數(shù)據(jù)處理或轉(zhuǎn)發(fā)工作。
(2)控制端點(diǎn)信息處理任務(wù)
當(dāng)USB接口接收到主機(jī)發(fā)來(lái)的USB協(xié)議信息時(shí),此任務(wù)得到通知。根據(jù)主機(jī)的要求,該任務(wù)按照USB協(xié)議規(guī)范的數(shù)據(jù)格式對(duì)主機(jī)應(yīng)答。它主要用于USB設(shè)備枚舉階段,與主機(jī)之間進(jìn)行信息交換。其他時(shí)間,此任務(wù)不占用處理器時(shí)間。
(3)CAN總線發(fā)送任務(wù)
當(dāng)USB接口有新的數(shù)據(jù)要轉(zhuǎn)發(fā)到CAN總線時(shí),USB中斷后續(xù)處理任務(wù)通知此任務(wù)運(yùn)行。讀出USB芯片接收緩沖區(qū)中的數(shù)據(jù)到內(nèi)存緩沖區(qū),然后分解成小于或等于8字節(jié)的數(shù)據(jù)包,增加CAN總線協(xié)議數(shù)據(jù)包頭,送入C805lF040的發(fā)送緩沖區(qū)。微處理器的主要處理時(shí)間就是USB數(shù)據(jù)包的分解和重新打包發(fā)送。
此任務(wù)占用處理器的時(shí)間最長(zhǎng)。CAN發(fā)送任務(wù)每次等待USB接收中斷觸發(fā)USB_rd信號(hào)量后,開(kāi)始讀取CP2102接收緩沖區(qū)數(shù)據(jù)到內(nèi)存數(shù)組Ep2out_Bur[128],然后采用查詢式發(fā)送方式,將數(shù)據(jù)送到C8051F040的發(fā)送緩沖區(qū),每次8字節(jié)。在查詢過(guò)程中,如果C8051F040處于正在發(fā)送中,將任務(wù)休眠3個(gè)時(shí)鐘嘀嗒(5 ms),然后再次查詢,避免長(zhǎng)時(shí)間占用處理器。
(4)CAN總線接收任務(wù)
當(dāng)CAN總線接收到數(shù)據(jù)后,由于數(shù)據(jù)包最多只有8個(gè)字節(jié),因此可以一次放入U(xiǎn)SB接口芯片發(fā)送緩沖區(qū),由主機(jī)讀取。此任務(wù)很少占用處理器時(shí)間。主要是為了協(xié)調(diào)CAN總線與USB總線之間數(shù)據(jù)轉(zhuǎn)發(fā)的同步,使數(shù)據(jù)包可以按照原來(lái)的順序接收到,并且不覆蓋尚未發(fā)送的上一個(gè)數(shù)據(jù)包,避免數(shù)據(jù)丟失。CAN接收中斷首先讀C8051F040中斷寄存器,清除中斷標(biāo)志。然后觸發(fā)CAN―rcv信號(hào)量,使CAN接收任務(wù)得以運(yùn)行。CAN接收任務(wù)然后等待USB發(fā)送完成中斷觸發(fā)USB―wr信號(hào)量,表示USB接口可以發(fā)送新的數(shù)據(jù)。由于USB接口緩沖區(qū)較大,并且發(fā)送速度快,CAN接收任務(wù)直接將CAN接收到的數(shù)據(jù)送入U(xiǎn)SB接口芯片CP2012的發(fā)送緩沖區(qū)。然后打開(kāi)CAN接收中斷。
結(jié) 語(yǔ)
在遵守USB和CAN協(xié)議的基礎(chǔ)上,USB和CAN都采用了接收中斷方式,通過(guò)通信同步的握手協(xié)議,實(shí)現(xiàn)了USB數(shù)據(jù)與CAN數(shù)據(jù)之間的協(xié)議轉(zhuǎn)換和轉(zhuǎn)發(fā),很好地解決了USB的高速率和CAN的低速率,以及USB的大數(shù)據(jù)包與CAN的小數(shù)據(jù)包之間的矛盾,能夠保證數(shù)據(jù)完整和協(xié)議的可靠轉(zhuǎn)換。
評(píng)論