USB數(shù)據(jù)通信接口模塊的程序設(shè)計(jì)
中斷服務(wù)處理函數(shù)代碼如下
4.主端點(diǎn)操作
這部分代碼較多,包括各個(gè)端口的發(fā)送/接收函數(shù),端點(diǎn)1和主端點(diǎn)(端點(diǎn)2)的收發(fā)函數(shù)相對(duì)較簡(jiǎn)單。
(2)主端點(diǎn)接收函數(shù)。
5.程序說(shuō)明
在端點(diǎn)0的發(fā)送函數(shù)中,MCU首先需要通過(guò)讀DI2的最后處理狀態(tài)寄存器,清0Control_In中斷標(biāo)志位,接著 MCU在確認(rèn)DI2處于傳輸模式后進(jìn)行數(shù)據(jù)所的發(fā)送。由于D12的控件端點(diǎn)只有16bit,如果傳輸?shù)拈L(zhǎng)度大于 16bit,MCU在傳輸階段就必須控制數(shù)據(jù)的數(shù)量,其流程如圖2所示。MCU必須檢查要發(fā)送到主機(jī)的當(dāng)前和剩余 的數(shù)據(jù)大小,如果剩下的字節(jié)數(shù)大于16,MCU將先發(fā)送16字節(jié)并減去參考長(zhǎng)度(要求的長(zhǎng)度)16。
當(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í)控制傳輸是控制讀還是寫,這可以通過(guò)讀建立包中bmRequestType的第8位來(lái)實(shí)現(xiàn)。
· 如果控制傳輸是一個(gè)控制讀類型,那就是說(shuō)器件需要在下一個(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)求過(guò)程后,MCU等待數(shù)據(jù)階段主機(jī)發(fā)送一個(gè)ControlOut標(biāo)志,MCU從D12緩沖區(qū)中減去數(shù)據(jù) 。流程現(xiàn)在處于ControleOut處理程序的右端,MCU首先確認(rèn)D12是否處于USB Receive模式,然后MCU通過(guò)檢 查選擇控制輸出端點(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ì)說(shuō)明。
主循環(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。這些過(guò)程是很重要的,它確保了在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)論