如何與HID設備通訊(一)


說明:本實例所使用的上位機程序開發工具為Visual C++6.0。

一、修改下位機固件程序

  我們如果想實現一個USB的HID類設備,不需要在Windows下開發自己的驅動程序。HID不一定要是標准的外設類型,唯一的要求是交換的數據存儲在報文的結構內,設備固件必須支持報文的格式。任何工作在該限制之內的設備都可以成為一個HID,例如溫度計、電壓計、讀卡機等。

  報文的格式是由報告描述符決定的,所以只要修改描述符就能實現我們需要的報文格式。下面我們來實現一個簡單的報文格式:上位機發送固定64字節數據給設備,這個數據可以是命令,也可是數據,具體含義並不是由報告描述符來決定的,是由開發人員事先約定好的。設備返回的數據也是64個字節,同樣這個數據流的每個字節(甚至每個位)的具體含義由開發人員事先約定好。

1、修改報告描述符

A、在Descriptor.C中找到以MouseReportDescriptor函數,將其內容修改如下:

 
  1. code char MouseReportDescriptor[29] = {   
  2.     0x06,0x00,0xFF,             //USAGE_PAGE (Vendor Defined Page 1)    
  3.     0x09,0x01,              //USAGE (Vendor Usage 1)    
  4.     0xA1,0x01,              //COLLECTION (Application)    
  5.   
  6.     0x19,0x01,              //(Vendor Usage 1)    
  7.     0x29,0x08,              //(Vendor Usage 1)    
  8.     0x15,0x00,              //LOGICAL_MINIMUM (0)    
  9.     0x26,0xFF,0x00,             //LOGICAL_MAXIMUM (255)    
  10.     0x75,0x08,              //REPORT_SIZE (8)    
  11.     0x95,0x40,              //REPORT_COUNT (64)    
  12.     0x81,0x02,              //INPUT (Data,Var,Abs)    
  13.   
  14.     0x19,0x01,              //(Vendor Usage 1)    
  15.     0x29,0x08,              //(Vendor Usage 1)    
  16.     0x91,0x02,              //OUTPUT (Data,Var,Abs)    
  17.   
  18.     0xC0                    // END_COLLECTION   
  19. };  

  此報告描述符定義了64個字節的輸入輸出數據。

B、將Descriptor.C中的如下代碼

 
  1. 0x66,0x03,                      //設備制造商定的產品ID  

修改為

 
  1. 0x66,0x06,                      //設備制造商定的產品ID  

 

C、在Descriptor.h中,將以下代碼

 
  1. extern code char MouseReportDescriptor[52];  

修改為

 
  1. extern code char MouseReportDescriptor[29];  

D、在Main.C中找到以下代碼

 
  1. if(bEPPflags.bits.configuration)   
  2. {   
  3.     //在這里添加端點操作代碼   
  4.       
  5. }  

將其修改為

 
  1. if(bEPPflags.bits.configuration)       
  2. {       
  3.     //在這里添加端點操作代碼       
  4.         
  5.     if(bEPPflags.bits.ep2_rxdone )  //主端點接收到數據(從主機發往設備的數據)       
  6.     {       
  7.         bEPPflags.bits.ep2_rxdone       = 0;           
  8.            
  9.         D12_WriteEndpoint(5,EP2_PACKET_SIZE,EpBuf);    //立即將收到的64個字節發送到PC機       
  10.     }        
  11. }   

這一步的作用是立即將接到的數據返回給主機。函數D12_WriteEndpoint的定義位於D12CI.C中。

點擊這里下載已修改好的源代碼

2、測試

  我們可以利用一些USB調試軟件在自己沒有編寫上位機程序的情況下先進行一些測試。這里我們要用到的工具是BUS HOUND

A、首先將第1步修改好的程序燒錄到主控芯片中並將硬件插入電腦,然后打開BUS HOUND,點“Settings”按鈕切換到設置頁,將“Max Phase”的值設為64並點“Apply”按鈕,這樣BUS HOUND才能監控最多64個字節的數據流。 

B、點“Devices”按鈕切換到Devices頁,選定我們剛插入的硬件(一定要選緊臨“USB Root Hub”的下一級設備)。

C、點“Send Commands”按鈕,出現如下畫面

D、選中“Endpoint”為2,“Direction”為Out的那項,“Data Length”填64,發送的數據隨便填上一些數據,最后點擊“Run”按鈕

E、切換到BUS HOUND主界面,點“Capture”按鈕切換到監控頁面,如下圖所示,BUS HOUND捕捉到了一些數據。其中“Phase”列中的“DO”代表主機發往設備的數據,而“DI”代表設備發往主機的數據。我們看到設備返回的數據正好和主機發送的數據一樣,證明我們的下位機程序已經修改成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM