網站導航:首頁開源項目 USB開源項目:Easy USB 51 Programer  

目錄導航

   
  1、項目簡介
USB開發基礎
1、USB接口的優點及開發難易度
2、USB設備的開發流程
3、USB接口芯片(USB控制器)的選擇
4、了解USB的通訊過程
5、USB命令(請求)和USB描述符
6、實例講解USB的枚舉(配置)過程
准備工作
1、需要哪些工具
2、電路原理圖
3、手工制作您的電路板
4、測試您的硬件
HID設備類
1、讓PC機找到我們的硬件
2、如何成爲一個HID設備(模擬鼠標)
3、如何成爲一個HID設備(模擬鍵盤)
4、如何與HID設備通訊(一)
5、如何與HID設備通訊(二)
6、51編程器的實現
Windows USB 驱动程序(自定义设备)
1、Windows驅動開發基礎
2、開發環境配置
3、第一个实例-Hello Wdm(一)
4、第一个实例-Hello Wdm(二)
5、真正的實例—驅動我們的實驗板
6、真正的實例—測試驅動程序
7、真正的實例—控制LED及讀取按鍵狀態
8、如何編寫應用程序
   

相关産品    淘寶網店
     
 

 
  更多...  
 
 
讓PC機找到我們的硬件 查看/参与此開源項目相关讨论
 

  此節的目的只是讓PC能識別到硬件的插入(即識別到這是一個USB設備),其實質是要求我們能驅動PDIUSBD12,只要實現了這一步,說明PDIUSBD12的固件驅動已經完成一半了。一般,各廠商都供了各自USB接口芯片固件參考代碼,我們只需要對這些代碼作少量修改就能滿足我們的要求,所以沒有必要從零開始寫固件驅動,這一定是個龐大的工程。 

第一步:固件下載

下載周立公編寫的基于其一款開發板的PDIUSBD12固件程序。

點此下載

此固件程序基于PHILIPS公司提供PDIUSBD12固件驅動,選用周立公版是因爲我們只需要對其再作小小改動即能適用于本項目的硬件。

第二步:修改D12Config.h文件

  主要是修改主控芯片的I/0引腳定義。

1、找到以下代碼:

 
  1. #define     D12_COMMAND         0xff03  //D12 命令地址  

在其後面添加以下代碼:

 
  1. #define     ucD12_DataPort      P1  //數據端口  

2、將以下幾行代碼:

 
  1. sbit MCU_D12CS    = P1 ^ 6;             //D12 片選引腳       
  2. sbit MCU_D12RST   = P1 ^ 7;             //D12 複位引腳       
  3. sbit MCU_D12SUSPD = P3 ^ 3;             //D12 挂起  

修改爲:

 
  1.  sbit bD12_A0            = P2 ^ 3;               //數據/命令控制線           
  2. sbit bD12_WR            = P2 ^ 0;               //D12寫控制線           
  3. sbit bD12_RD            = P3 ^ 3;               //D12讀控制線   

第三步:修改D12HAL.C文件

  由于原固件是基于DMA方式的,而我們的硬件電路不支持DMA傳輸,所于主要是對這些部分作修改。

1、將以下兩行注釋掉: 

 
  1. MCU_D12CS = 1;          //釋放D12       
  2. MCU_D12CS = 0;          //選擇D12   

2、將以下幾行注釋掉:

 
  1. INT16U i;       
  2.       
  3. MCU_D12RST = 0;                 //D12的 RESET引腳置0       
  4. for(i = 0; i < 0x100; i++);     //軟件延時       
  5.     MCU_D12RST = 1;             //D12的 RESET引腳置1       
  6.       
  7. MCU_D12SUSPD = 0;               //D12的 SUSPEND引腳置0    

3、將以下代碼

 
  1. *((INT8U xdata *) Addr) = Data;      
  2. 修改爲:   
  3.   
  4. if(Addr == D12_COMMAND) //命令       
  5. {       
  6.     bD12_A0     = 1;       
  7. }       
  8. else if(Addr == D12_DATA)   //數據       
  9. {       
  10.     bD12_A0     = 0;       
  11. }       
  12. else      
  13. {       
  14. }       
  15. ucD12_DataPort  = Data;       
  16. bD12_WR     = 0;       
  17. bD12_WR     = 1;     

修改爲

 
  1. if(Addr == D12_COMMAND) //命令       
  2. {       
  3.     bD12_A0     = 1;       
  4. }       
  5. else if(Addr == D12_DATA)   //數據       
  6. {       
  7.     bD12_A0     = 0;       
  8. }       
  9. else      
  10. {       
  11. }       
  12. ucD12_DataPort  = Data;       
  13. bD12_WR     = 0;       
  14. bD12_WR     = 1;     

4、將以下代碼

 
  1. return *((INT8U xdata *) Addr);    

全部修改爲

 
  1. unsigned char ucTemp;       
  2. bD12_A0     = 0;    //選擇數據       
  3. ucD12_DataPort      = 0xFF;       
  4. bD12_RD     = 0;       
  5. ucTemp      = ucD12_DataPort;       
  6. bD12_RD     = 1;       
  7. return ucTemp;   

第四步:修改D12Driver.c文件

將以下函數

 
  1. /*********************************************************************  
  2. ** 函數名稱: Init_D12()  
  3. ** 功能描述: 設置D12與硬件的連接, 初始化D12, 複位D12  
  4. ** 輸   入: 無  
  5. ** 輸   出: 0: 初始化成功    1: 初始化失敗    
  6. **********************************************************************/  
  7. INT8U Init_D12(void)   
  8. {   
  9.     bEPPflags.value = 0;                    //初始化USB事件標志變量   
  10.   
  11.     Init_D12Port();                         //初始化PDIUSBD12與51單片機連接的端口   
  12.     Rst_D12();                              //複位PDIUSBD12   
  13.     reconnect_USB();                        //重新連接USB   
  14.   
  15.     if (D12_ReadChipID() != 0x1012)         //讀取芯片ID號,如果不爲1012H   
  16.         return 1;                           //則複位失敗   
  17.        
  18.     return 0;                               //初始化成功   
  19. }  

修改爲

 
  1. /*********************************************************************  
  2. ** 函數名稱: Init_D12()  
  3. ** 功能描述: 設置D12與硬件的連接, 初始化D12, 複位D12  
  4. ** 輸   入: 無  
  5. ** 輸   出: 0: 初始化成功    1: 初始化失敗    
  6. **********************************************************************/  
  7. INT8U Init_D12(void)   
  8. {   
  9.     bEPPflags.value = 0;                    //初始化USB事件標志變量   
  10.   
  11.     Init_D12Port();                         //初始化PDIUSBD12與51單片機連接的端口   
  12.     Rst_D12();     
  13.     D12_SetAddressEnable(0,1);   
  14.     D12_SetEndpointEnable(1);                           //複位PDIUSBD12   
  15.     reconnect_USB();                        //重新連接USB   
  16.   
  17.     if (D12_ReadChipID() != 0x1012)         //讀取芯片ID號,如果不爲1012H   
  18.         return 1;                           //則複位失敗   
  19.        
  20.     return 0;                               //初始化成功   
  21. }  

第五步:測試PC機是否能識別硬件

1、燒錄編譯後的HEX文件

2、將EUP51連接到電腦,如果一切順利的話,LED燈會閃爍幾下,然後電腦提示找到新硬件,否你您的硬件可能有問題,請參考"測試您的硬件"一節排除硬件故障。

修改好後的源程序:點擊下載

附錄:

快速判斷主控芯片與D12是否連接正確的方法

1)、使用模式設置命令(0xF3)去改變D12第13腳的輸出頻率,如果可以改變,證明主控芯片向D12發送命令正確。
2)、使用讀取ID命令(0xFD)去讀,讀回兩個字節的內容,第一個字節應爲0x12,第二個字節應爲0x10。如果正確,則表明D12向單片機發送數據沒有問題。

以上兩步都通過了的話,證明硬件連接應該沒有問題了。

  您如果使用仿真器進行開發的話將會非常方便,如果沒有仿真器,可以使用擴展板EXT-BOARD-A上的串行接口將一些需要的信息發送到PC機上。以下是我們通過串行口向PC機發送的D12枚舉的過程: 

 
  1. Chip ID:1012   
  2. Power on reset!   
  3. Suspend changed!(Wait for 3 EOT failure)   
  4. Suspend changed!(Wait for 3 EOT failure)   
  5. Power on reset!   
  6. Suspend changed!(Wait for 3 EOT failure)   
  7. Control point out!   
  8. ---------标准命令请求!------------   
  9. GET_DESCRIPTOR->DEVICE   
  10. Control point in!   
  11. Power on reset!   
  12. Control point out!   
  13. ---------标准命令请求!------------   
  14. SET_ADDRESS->258   
  15. Control point in!   
  16. Control point out!   
  17. ---------标准命令请求!------------   
  18. GET_DESCRIPTOR->DEVICE   
  19. Control point in!   
  20. Control point in!   
  21. Control point out!   
  22. ---------标准命令请求!------------   
  23. GET_DESCRIPTOR->CONFIGURATION   
  24. Control point in!   
  25. Control point out!   
  26. ---------标准命令请求!------------   
  27. GET_DESCRIPTOR->STRING->LANGUAGE ID.   
  28.   
  29. Control point in!   
  30. Control point out!   
  31. ---------标准命令请求!------------   
  32. GET_DESCRIPTOR->STRING->DEVICE SERIAL NO.   
  33.   
  34. Control point in!   
  35. Control point in!   
  36. Control point in!   
  37. Control point out!   
  38. ---------标准命令请求!------------   
  39. GET_DESCRIPTOR->CONFIGURATION   
  40. Control point in!   
  41. Control point in!   
  42. Control point in!   
  43. Control point out!   
  44. ---------标准命令请求!------------   
  45. GET_DESCRIPTOR->STRING->LANGUAGE ID.   
  46.   
  47. Control point in!   
  48. Control point out!   
  49. ---------标准命令请求!------------   
  50. GET_DESCRIPTOR->STRING->PRODUCT.   
  51.   
  52. Control point in!   
  53. Control point in!   
  54. Control point in!   
  55. Control point in!   
  56. Control point out!   
  57. ---------标准命令请求!------------   
  58. GET_DESCRIPTOR->STRING->LANGUAGE ID.   
  59.   
  60. Control point in!   
  61. Control point out!   
  62. ---------标准命令请求!------------   
  63. GET_DESCRIPTOR->STRING->PRODUCT.   
  64.   
  65. Control point in!   
  66. Control point in!   
  67. Control point in!   
  68. Control point in!   
  69. Control point out!   
  70. ---------标准命令请求!------------   
  71. GET_DESCRIPTOR->DEVICE   
  72. Control point in!   
  73. Control point in!   
  74. Control point out!   
  75. ---------标准命令请求!------------   
  76. GET_DESCRIPTOR->CONFIGURATION   
  77. Control point in!   
  78. Control point out!   
  79. ---------标准命令请求!------------   
  80. GET_DESCRIPTOR->CONFIGURATION   
  81. Control point in!   
  82. Control point in!   
  83. Control point in!   
  84. Control point out!   
  85. ---------标准命令请求!------------   
  86. SET_CONFIGURATION   
  87. Control point in!   
  88. Control point out!   
  89. ---------类请求!------------   
  90. SET_IDLE   
  91. Control point in!   
  92. Control point out!   
  93. ---------标准命令请求!------------   
  94. GET_DESCRIPTOR->REPORT   
  95. Control point in!   
  96. Control point in!   
  97. Control point in!   
  98. Control point in!   
  99. Control point out!  

點擊這裏下載嵌入了串口調試的固件程序源代碼(此代碼模擬了一個鼠標)

 
 
 
本站程序由百合電子工作室開發和維護
Copyright @ baihe electric studio
渝ICP備09006681號-4