USB數(shù)據(jù)通信接□模塊的程序設(shè)計(jì)
當(dāng)下一個(gè)Control_In標(biāo)志來(lái)時(shí),MCU將確定剩余的字節(jié)是否為0,如果已經(jīng)沒有數(shù)據(jù)要發(fā)送,MCU需要發(fā)送一 個(gè)空的包以指示主機(jī)數(shù)據(jù)已發(fā)送完畢。
圖2 控制點(diǎn)發(fā)送函數(shù)流程
· 如果是一個(gè)有效的請(qǐng)求,MCU必須向控制輸出端點(diǎn)發(fā)送應(yīng)答建立命令,以重新使能下一個(gè)建立階段。接 下來(lái),MCU需要證實(shí)控制傳輸是控制讀還是寫,這可以通過讀建立包中bmRequestType的第8位來(lái)實(shí)現(xiàn)。
· 如果控制傳輸是一個(gè)控制讀類型,那就是說器件需要在下一個(gè)數(shù)據(jù)階段向主機(jī)發(fā)回?cái)?shù)據(jù)包。MCU需要設(shè) 置一個(gè)標(biāo)志以指示USB設(shè)備現(xiàn)在正處于傳輸模式,即準(zhǔn)備在主機(jī)發(fā)送請(qǐng)求時(shí)發(fā)送數(shù)據(jù)。建立階段結(jié)束之后, 主機(jī)會(huì)執(zhí)行數(shù)據(jù)階段,D12等待接收Control In包。
· 如果建立包為SetesDescriptor()請(qǐng)求,那么建立包中的控制傳輸將指示此包為控制寫類型。在執(zhí)行 完Setpescnptor請(qǐng)求過程后,MCU等待數(shù)據(jù)階段主機(jī)發(fā)送一個(gè)ControlOut標(biāo)志,MCU從D12緩沖區(qū)中減去數(shù)據(jù) 。流程現(xiàn)在處于ControleOut處理程序的右端,MCU首先確認(rèn)D12是否處于USB Receive模式,然后MCU通過檢 查選擇控制輸出端點(diǎn),確認(rèn)緩沖區(qū)是否已滿,并將數(shù)據(jù)從緩沖區(qū)讀出。
設(shè)備標(biāo)準(zhǔn)請(qǐng)求STANDARDASK,C。此部分代碼用于實(shí)現(xiàn)各種USB協(xié)議的標(biāo)準(zhǔn)請(qǐng)求。對(duì)應(yīng)每一個(gè)請(qǐng)求,用不同 的函數(shù)實(shí)現(xiàn)。在主循環(huán)中,當(dāng)建立包標(biāo)志為真時(shí),利用control_handler()函數(shù)進(jìn)入不同的標(biāo)準(zhǔn)請(qǐng)求處理 函數(shù)。雖然此處函數(shù)較多,但每個(gè)函數(shù)結(jié)構(gòu)較簡(jiǎn)單,在此不做詳細(xì)說明。
主循環(huán)MAINLOOP.C。主循環(huán)檢查事件標(biāo)志并進(jìn)入對(duì)應(yīng)的子程序進(jìn)行進(jìn)一步的處理。在主循環(huán)中,MCU首先 對(duì)其所有端口、存儲(chǔ)區(qū)、定時(shí)器和中斷服務(wù)程序進(jìn)行初始化,之后MCU將重新連接USB,包括將SofteCo nnect寄存器設(shè)置為ON。這些過程是很重要的,它確保了在MCU準(zhǔn)各好服務(wù)D12之前,D12不會(huì)進(jìn)行操作。初始 化后,進(jìn)入循環(huán),輪詢各種狀態(tài)。當(dāng)輪詢到了檢測(cè)建立包時(shí),它確認(rèn)建立標(biāo)志是否被中斷服務(wù)程序所置位。 如果建立標(biāo)志被置位,它將向協(xié)議層發(fā)送一個(gè)器件請(qǐng)求進(jìn)行處理。圖3所示為主程序在前臺(tái)執(zhí)行的流程。
圖3 主循環(huán)流程
評(píng)論