新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌人式操作系統(tǒng)中USB雙向通信的設(shè)計(jì)與實(shí)現(xiàn)

        嵌人式操作系統(tǒng)中USB雙向通信的設(shè)計(jì)與實(shí)現(xiàn)

        作者: 時(shí)間:2013-11-08 來(lái)源:網(wǎng)絡(luò) 收藏

          (3)嵌入式操作系統(tǒng)端應(yīng)用程序讀寫(xiě)過(guò)程

          讀函數(shù):void Read(unsigned char * ReadBuffer, DWORD size)函數(shù):

          功能:嵌入式系統(tǒng)應(yīng)用程序通過(guò)接口讀取上位機(jī)(PC)的數(shù)據(jù)。

          參數(shù)說(shuō)明:unsigned char*ReadBuffer存放數(shù)據(jù)的指針,DWORD size為要讀出的數(shù)據(jù)的尺寸(單位:B)。

          實(shí)現(xiàn)過(guò)程:首先判斷循環(huán)隊(duì)列是否為空,不為空則判斷自身信號(hào)量是否可用,若可用,則從隊(duì)列中讀取一字節(jié),每讀一字節(jié)后向USB任務(wù)中的BulkOutGet函數(shù)(直接讀取OUT的FIFO函數(shù))發(fā)出一個(gè)信號(hào)量,通知BulkOutGet函數(shù)隊(duì)列此時(shí)可以向OUT循環(huán)隊(duì)列中寫(xiě)入數(shù)據(jù),接著重新判斷,依次逐字節(jié)從OUT循環(huán)隊(duì)列中讀取數(shù)據(jù),直到讀完要求數(shù)據(jù)大小為止。當(dāng)循環(huán)隊(duì)列為空時(shí),首先發(fā)一個(gè)信號(hào)量,通知BulkOutGet函數(shù)應(yīng)向本隊(duì)列中寫(xiě)入數(shù)據(jù)了,然后復(fù)位自身信號(hào)量,接著調(diào)用等待信號(hào)量的函數(shù),直到信號(hào)量到時(shí)才接著讀取。若超時(shí),則向嵌入式操作系統(tǒng)發(fā)出超時(shí)通知,同時(shí)通過(guò)向控制包中寫(xiě)入超時(shí)狀態(tài)(0x01)來(lái)向上位機(jī)(PC)發(fā)出超時(shí)信號(hào)。

          寫(xiě)函數(shù):void WriteUSB(unsigned char*Write Buffer,DWORD size)函數(shù):

          功能:嵌入式系統(tǒng)應(yīng)用程序通過(guò)USB接口向上位機(jī)(PC)發(fā)送數(shù)據(jù)。

          參數(shù)說(shuō)明:unsigned char * WriteBuffer 存放數(shù)據(jù)的指針,DWORD size為要寫(xiě)入的數(shù)據(jù)的尺寸(單位:B)。

          實(shí)現(xiàn)過(guò)程:首先判斷循環(huán)隊(duì)列是否滿(mǎn),不為滿(mǎn)則判斷自身信號(hào)量是否可用,若可用,則向隊(duì)列中寫(xiě)入一字節(jié),每寫(xiě)入一字節(jié)后向USB任務(wù)中的BulkInDataSet(直接寫(xiě)IN的FIFO函數(shù))函數(shù)發(fā)出一個(gè)信號(hào)量通知此函數(shù)此時(shí)可以從IN循環(huán)隊(duì)列中讀取數(shù)據(jù);然后接著重新判斷依次逐字節(jié)向IN循環(huán)隊(duì)列寫(xiě)入數(shù)據(jù),直到寫(xiě)完要求數(shù)據(jù)大小的數(shù)據(jù)為止。當(dāng)循環(huán)隊(duì)列滿(mǎn)時(shí),先發(fā)一個(gè)信號(hào)量通知BulkInDataSet函數(shù)應(yīng)從隊(duì)列中取走數(shù)據(jù),再?gòu)?fù)位自身信號(hào)量,接著調(diào)用等待信號(hào)量的函數(shù),直到信號(hào)量到時(shí)才接著寫(xiě)入,若超時(shí),則向嵌入式操作系統(tǒng)發(fā)出超時(shí)通知,同時(shí)通過(guò)向控制包中寫(xiě)入超時(shí)狀態(tài)(0x02)來(lái)向上位機(jī)(PC)發(fā)出超時(shí)信號(hào)。

          (4) USB塊傳輸函數(shù)

          USB塊傳輸函數(shù)是直接和USB硬件打交道的函數(shù),他們直接讀取IN和OUT傳輸通道的FIFO。voi d BulkInDataSet(void):其功能是IN傳輸過(guò)程,即從IN循環(huán)隊(duì)列中讀取數(shù)據(jù)并向IN FIFO中寫(xiě)入數(shù)據(jù),再對(duì)嵌入式操作系統(tǒng)信號(hào)量做相應(yīng)處理。

          void BulkOutDataGet(void)其功能是OUT傳輸過(guò)程,即從OUT FIFO中讀出數(shù)據(jù)并向OUT循環(huán)隊(duì)列中寫(xiě)入數(shù)據(jù),再對(duì)嵌入式操作系統(tǒng)信號(hào)量做相應(yīng)處理。

          (5) 嵌入式操作系統(tǒng)USB 任務(wù)調(diào)用函數(shù)

          void SystemInit(void):MCU初始化(微處理器各控制寄存器和狀態(tài)初始化過(guò)程)

          void USBInit(void):USB初始化(包括對(duì)循環(huán)隊(duì)列分配內(nèi)存等)

          void USBThread(void):USB運(yùn)行體(USB工作過(guò)程對(duì)USB中斷進(jìn)行處理主要包括USB塊傳輸函 數(shù)、USB中斷狀態(tài)分析處理等)。

          void FreeUSB(void):關(guān)閉USB和釋放由malloc函數(shù)分配的循環(huán)隊(duì)列所占內(nèi)存

          3.2上位機(jī)(PC)部分

          USB函數(shù)層(USBD及HCD)由Windows98提供,負(fù)責(zé)管理USB設(shè)備驅(qū)動(dòng)程序與USB控制器之間的通信、加載及卸載USB驅(qū)動(dòng)程序等。具體方法是通過(guò)DriverWorks軟件生成上位機(jī)(PC)機(jī)端USB驅(qū)動(dòng)程序模板[3],根據(jù)下位機(jī)的情況處理相應(yīng)的讀寫(xiě)部分,最后通過(guò)封裝基本API函數(shù)ReadFile,WriteFile來(lái)實(shí)現(xiàn)用戶(hù)態(tài)應(yīng)用程序與PC機(jī)USB驅(qū)動(dòng)程序的隔離,使PC的應(yīng)用層對(duì)USB的使用如同對(duì)串口的使用一樣方便,給用戶(hù)態(tài)應(yīng) 用程序提供有了3個(gè)接口函數(shù):

          unsigned char Read(void *pReadBuffer,DWORD Size):從下位機(jī)中讀取數(shù)據(jù)

          參數(shù)說(shuō)明:void *pBuffer:存放讀取數(shù)據(jù)的緩沖,DWORD Size:需讀取數(shù)據(jù)的大小(字節(jié)數(shù))

          返回值:

          0x10:驅(qū)動(dòng)出錯(cuò)(指Windows USB 驅(qū)動(dòng)程序出錯(cuò))

          0x20:內(nèi)存空間不足?

          0x30:請(qǐng)求的數(shù)據(jù)大小為0 B

          0x02:下位機(jī)發(fā)送軟超時(shí)

          0x08:讀取成功

          unsigned char Write(void *pWriteBuffer,DWORD Size):發(fā)送數(shù)據(jù)到下位機(jī)

          參數(shù)說(shuō)明:void *pBuffer; 存放寫(xiě)入數(shù)據(jù)的緩沖,DWORD Size; 需寫(xiě)入數(shù)據(jù)的大小(字節(jié)數(shù))。



        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 茶陵县| 柞水县| 永胜县| 二连浩特市| 策勒县| 红河县| 西乌珠穆沁旗| 都匀市| 宣化县| 南昌县| 旺苍县| 长宁县| 甘肃省| 泽库县| 苏尼特左旗| 于都县| 湖南省| 怀宁县| 盘山县| 阿克| 安多县| 来凤县| 赞皇县| 武定县| 新津县| 肇州县| 通州区| 商丘市| 阜城县| 惠来县| 北宁市| 通海县| 伊通| 罗山县| 镇安县| 城步| 合肥市| 旌德县| 庆云县| 衡阳市| 西峡县|