無(wú)線(xiàn)USB的設計與實(shí)現
![]() |
后臺D12中斷服務(wù)程序和nRF401中斷服務(wù)程序與前臺主循環(huán)程序之間的數據交換,通過(guò)事件標志和數據緩沖區來(lái)實(shí)現。后臺中斷服務(wù)程序由中斷觸發(fā),通過(guò)標志位與主模塊通信。主模塊循環(huán)掃描各標志位,對相應的標志位做出處理。例如,nRF401 接受到有效數據后,送入串口觸發(fā)串口中斷,進(jìn)入nRF401中斷服務(wù)程序,將數據接收后放入數據緩沖區,然后設置UART_DATA標志,退出子模塊。主模塊查詢(xún)到UART_DATA被置位,則調用 writendpoint()程序將數據發(fā)往PC。
值得注意的是,nRF401在接受狀態(tài)下即使沒(méi)有數據接受,也會(huì )有隨機碼輸出。因此需要在所需傳輸的數據前加入標識頭,如55AAH。當檢測到從串口進(jìn)入的數據為55AAH時(shí),再開(kāi)始有效數據的接受。
對PC而言,無(wú)線(xiàn)USB傳輸模塊是它的一個(gè)USB外設,因此必須提供USB設備的驅動(dòng)程序。驅動(dòng)程序的設計采用WDM模型[5],使用DriverStudio 進(jìn)行開(kāi)發(fā)。DriverStudio是一款優(yōu)秀的驅動(dòng)程序開(kāi)發(fā)軟件。啟動(dòng)DriverStudio中DriverWizard,填寫(xiě)USB設備的端點(diǎn)配置,便會(huì )自動(dòng)生成驅動(dòng)程序原代碼和相應的測試程序原代碼,只需稍做改動(dòng)便可用VC6.0編譯運行[5]。驅動(dòng)程序向用戶(hù)程序提供標準的IO接口:WriteFile ()、 ReadFile() 、DeviceIoControl ()。用戶(hù)程序調用相應的函數,即可實(shí)現對USB設備的訪(fǎng)問(wèn)。下面的例子是實(shí)現向USB總線(xiàn)寫(xiě)數據的功能。
hFile = open_file(threadParam->pipe_name); //打開(kāi)需要使用的端點(diǎn)
……
bResult = WriteFile(hFile,
threadParam->pcIoBuffer,
//等待傳送的數據緩沖區地址
threadParam->uiLength, //數據長(cháng)度
nBytes,
NULL); //向該端點(diǎn)寫(xiě)入數據
if (bResult != TRUE) { //出錯處理
DeviceIoControl(hFile, //復位該端點(diǎn)
IOCTL_D12_RESET_PIPE,
0, 0, 0, 0,
nBytes,
NULL);}
編程過(guò)程中要注意串口波特率要一致,否則會(huì )造成接受數據錯誤。nRF401周?chē)牟季€(xiàn)和天線(xiàn)的設計很有講究,一定要按照手冊的要求進(jìn)行設計。
參考文獻:
[1] Universal Serial Bus Specification Revision 1.1. http:/
/www.usb.org/developers/docs.html , 1998.
[2] Philips Semiconductors PDIUSBD12 Specification. http://www.semiconductors.philips.com /, 1999.
[3] Nordic 433Mhz Single Chip RF Transceiver nRF401 datasheet. http:// www.nvlsi.no/thenRF401.htm, 2000.
[4] 徐愛(ài)鈞.單片機高級語(yǔ)言C51 Windows環(huán)境編程與應用[M].北京: 電子工業(yè)出版社, 2001.
[5] KRULINSKI D J. Programming Microsoft Visual C++6. 0技術(shù)內幕[M].北京: 希望電子出版社,1999.
[6]PDIUSBD12 datasheethttp://www.dzsc.com/datasheet/PDIUSBD12+_544412.html.
[7]PCBdatasheethttp://www.dzsc.com/datasheet/PCB_1201640.html.
[8]nRF401datasheethttp://www.dzsc.com/datasheet/nRF401_521026.html.
評論