基于USB接口1553B總線設(shè)備檢測(cè)系統(tǒng)設(shè)計(jì)
3 軟件設(shè)計(jì)
1553B設(shè)備測(cè)試軟件首先要實(shí)現(xiàn)USB接口與PC之間的通信,然后,再對(duì)設(shè)備進(jìn)行性能檢測(cè)。因此,需要對(duì)USB芯片進(jìn)行固件、PC驅(qū)動(dòng)程序和測(cè)試程序設(shè)計(jì)。
3.1 USB固件設(shè)計(jì)
AT89C52中的固化程序可采用C51 設(shè)計(jì),主要功能是:控制PDIUSBDl2接受USB驅(qū)動(dòng)程序的請(qǐng)求;控制PDIUSBDl2接受應(yīng)用程序的控制指令;通過(guò)PDIUSBDl2存儲(chǔ)數(shù)據(jù)并實(shí)時(shí)上傳PC機(jī)。PDIUSBDl2的固件設(shè)計(jì)成完全的中斷驅(qū)動(dòng),當(dāng)CPU處理前臺(tái)任務(wù)時(shí)USB的傳輸可在后臺(tái)進(jìn)行,確保了最佳的傳輸速率和更好的軟件結(jié)構(gòu),簡(jiǎn)化了編程和調(diào)試。單片機(jī)通過(guò)PDIUSBDl2與主機(jī)通信的過(guò)程簡(jiǎn)述如下::當(dāng)PDIUSBDl2接收到主機(jī)發(fā)來(lái)的令牌包后就給單片機(jī)發(fā)中斷,單片機(jī)進(jìn)入中斷服務(wù)程序。它將數(shù)據(jù)從PDIUSBD12的內(nèi)部FIFO取回到CPU存儲(chǔ)器并根據(jù)中斷寄存器判斷USB令牌包的類型從而建立正確的事件標(biāo)志以通知主循環(huán)程序進(jìn)行處理,主循環(huán)檢查事件標(biāo)志并進(jìn)入對(duì)應(yīng)的子程序進(jìn)行進(jìn)一步的處理,固件程序流程如圖2所示。系統(tǒng)上電后,先檢測(cè)PDIUSBD12,如檢測(cè)不成功則報(bào)錯(cuò),要使用者重插USB接口,再次檢測(cè)。檢測(cè)成功則根據(jù)PDIUSBD12的中斷類型設(shè)定中斷標(biāo)志位的值,再根據(jù)中斷位的值調(diào)用相應(yīng)的功能子程序[3]。
圖2 固件框架流程圖
在本設(shè)計(jì)中,功能子程序主要包括兩部分:
1)通過(guò)AT89C52的P0端口從FPGA接收1553B設(shè)備數(shù)據(jù),重新打包,再經(jīng)過(guò)P0端口寫入PC機(jī);
2) 通過(guò)P0端口接收PC數(shù)據(jù),重新打包,通過(guò)AT89C52的P0端口從FPGA寫入1553B設(shè)備。
3.2 驅(qū)動(dòng)程序
完成驅(qū)動(dòng)程序設(shè)計(jì)的方法一般有三種:基于DDK開發(fā)、基于Windrive開發(fā)和基于DriveStudio開發(fā)。由于Windrive和DriveStudio開發(fā)對(duì)DDK中的函數(shù)進(jìn)行了一定程度的封裝,它們開發(fā)的難度比直接用DDK開發(fā)要小,但開發(fā)的靈活性不如DDK。本設(shè)計(jì)使用的驅(qū)動(dòng)是DriveStudio與DDK配合進(jìn)行開發(fā),開發(fā)驅(qū)動(dòng)程序的效率較高。
在驅(qū)動(dòng)程序開發(fā)平臺(tái)搭建成功后,我們利用驅(qū)動(dòng)程序生成向?qū)river Wizard,根據(jù)硬件設(shè)置生成USB設(shè)備驅(qū)動(dòng)程序的大體框架。設(shè)置如下:①選擇 WDM的驅(qū)動(dòng)程序類型和Windows 2000運(yùn)行平臺(tái)。②選擇 USB總線類型,填寫它的VID(供應(yīng)商ID)和PID(設(shè)備ID),這些信息由芯片的供應(yīng)商提供。③增加端點(diǎn) 1和端點(diǎn)2,它們分別具有IN 和OUT屬性。④根據(jù)需要選擇對(duì)設(shè)備的操作有:Read、Write、Device Control和CleanUp。⑤選擇給端點(diǎn)2產(chǎn)生 BULK Read和Write的代碼, 向?qū)?huì)自動(dòng)產(chǎn)生一套對(duì)端點(diǎn)2進(jìn)行讀、寫的代碼。⑥設(shè)置驅(qū)動(dòng)程序的屬性,采用WDM接口;在選取讀寫方式時(shí)應(yīng)遵循一條原則:需要快速傳送大量數(shù)據(jù)時(shí),用 Direct I/O,反之用 Buffer I/O,本設(shè)計(jì)數(shù)據(jù)量不大,故選用Buffer I/O;由于無(wú)特殊的電源需求,故選用系統(tǒng)默認(rèn)的Manage Power For This Device。⑦增加IOCTL接口,在其生成的代碼框架中加入自己的操作,以實(shí)現(xiàn)一個(gè)完整的USB 設(shè)備驅(qū)動(dòng)程序。最后就生成了一個(gè) WDM 型的 USB 設(shè)備驅(qū)動(dòng)程序框架和一個(gè)測(cè)試該驅(qū)動(dòng)程序的測(cè)試程序大體框架。然后在其中添加需要的功能代碼。
評(píng)論