無線USB的設計與實現
![]() |
后臺D12中斷服務程序和nRF401中斷服務程序與前臺主循環程序之間的數據交換,通過事件標志和數據緩沖區來實現。后臺中斷服務程序由中斷觸發,通過標志位與主模塊通信。主模塊循環掃描各標志位,對相應的標志位做出處理。例如,nRF401 接受到有效數據后,送入串口觸發串口中斷,進入nRF401中斷服務程序,將數據接收后放入數據緩沖區,然后設置UART_DATA標志,退出子模塊。主模塊查詢到UART_DATA被置位,則調用 writendpoint()程序將數據發往PC。
值得注意的是,nRF401在接受狀態下即使沒有數據接受,也會有隨機碼輸出。因此需要在所需傳輸的數據前加入標識頭,如55AAH。當檢測到從串口進入的數據為55AAH時,再開始有效數據的接受。
對PC而言,無線USB傳輸模塊是它的一個USB外設,因此必須提供USB設備的驅動程序。驅動程序的設計采用WDM模型[5],使用DriverStudio 進行開發。DriverStudio是一款優秀的驅動程序開發軟件。啟動DriverStudio中DriverWizard,填寫USB設備的端點配置,便會自動生成驅動程序原代碼和相應的測試程序原代碼,只需稍做改動便可用VC6.0編譯運行[5]。驅動程序向用戶程序提供標準的IO接口:WriteFile ()、 ReadFile() 、DeviceIoControl ()。用戶程序調用相應的函數,即可實現對USB設備的訪問。下面的例子是實現向USB總線寫數據的功能。
hFile = open_file(threadParam->pipe_name); //打開需要使用的端點
……
bResult = WriteFile(hFile,
threadParam->pcIoBuffer,
//等待傳送的數據緩沖區地址
threadParam->uiLength, //數據長度
nBytes,
NULL); //向該端點寫入數據
if (bResult != TRUE) { //出錯處理
DeviceIoControl(hFile, //復位該端點
IOCTL_D12_RESET_PIPE,
0, 0, 0, 0,
nBytes,
NULL);}
編程過程中要注意串口波特率要一致,否則會造成接受數據錯誤。nRF401周圍的布線和天線的設計很有講究,一定要按照手冊的要求進行設計。
參考文獻:
[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] 徐愛鈞.單片機高級語言C51 Windows環境編程與應用[M].北京: 電子工業出版社, 2001.
[5] KRULINSKI D J. Programming Microsoft Visual C++6. 0技術內幕[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.
評論