| 
 三年前设计过一个 FireBeetle USB Host Shied【参考1】,后来有其他项目需要再次使用,因为主控芯片 Max3421e 的特定封装很难买到,所以进行了重新设计选择了市面上更常见的封装。 电路设计如下:   
其中的H3条线是预留的USB设备供电,短路时USB母头(U2)将会从 VCC 引脚取电给USB设备使用。 硬件方面,使用到如下引脚有:   上述引脚的选择原因是能够最大限度兼容USBHost Shield Library,无需修改这个 Library 即可正常工作。 最终PCB设计如下:   
3D 预览如下:   
焊接后实物图如下:   
从左到右分别是 FireBeetle USB Host Shield, FireBeetle【DFR0478,参考2】 和 12864 OLED【DFR0507,参考3】。 将三者叠放连接起来,通过FireBeetleUSB接口供电即可工作:   
接下来进行代码设计,代码参考了USBHost Shield Library中的 UBSHIDBootMouse 的例子,以及OLEDLibrary 中的DFRobot_OLED12864ChineseDemo例子。  
 
			
			
			- #include "DFRobot_OLED12864.h"
 - #include <hidboot.h>
 - #include <usbhub.h>
 - #include <SPI.h>
 - 
 - const uint8_t I2C_addr = 0x3c;
 - const uint8_t pin_SPI_cs = D2;
 - 
 - DFRobot_OLED12864 OLED(I2C_addr, pin_SPI_cs);
 - 
 - USB     Usb;
 - USBHub     Hub(&Usb);
 - HIDBoot<USB_HID_PROTOCOL_MOUSE>    HidMouse(&Usb);
 - 
 - 
 - class MouseRptParser : public MouseReportParser
 - {
 - protected:
 -   void OnMouseMove  (MOUSEINFO *mi);
 -   void OnLeftButtonUp (MOUSEINFO *mi);
 -   void OnLeftButtonDown (MOUSEINFO *mi);
 -   void OnRightButtonUp  (MOUSEINFO *mi);
 -   void OnRightButtonDown  (MOUSEINFO *mi);
 -   void OnMiddleButtonUp (MOUSEINFO *mi);
 -   void OnMiddleButtonDown (MOUSEINFO *mi);
 - };
 - void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
 - {
 -     char str[14];
 -     
 -     sprintf(str, "x=%d y=%d    ", mi->dX,mi->dY);
 -     OLED.disStr(0, 16, (char *)str);
 -     OLED.display();
 - 
 -     Serial.print("dx=");
 -     Serial.print(mi->dX, DEC);
 -     Serial.print(" dy=");
 -     Serial.println(mi->dY, DEC);
 -     Serial.println(str);
 - };
 - void MouseRptParser::OnLeftButtonUp (MOUSEINFO *mi)
 - {
 -     Serial.println("L Butt Up");
 - 
 -     OLED.disStr(0, 32, "L Butt Up   ");
 -     OLED.display();
 - };
 - void MouseRptParser::OnLeftButtonDown (MOUSEINFO *mi)
 - {
 -     Serial.println("L Butt Dn");
 -     OLED.disStr(0, 32, "L Butt Dn  ");
 -     OLED.display();    
 - };
 - void MouseRptParser::OnRightButtonUp  (MOUSEINFO *mi)
 - {
 -     Serial.println("R Butt Up");
 -     OLED.disStr(0, 32, "R Butt Up   ");
 -     OLED.display();    
 - };
 - void MouseRptParser::OnRightButtonDown  (MOUSEINFO *mi)
 - {
 -     Serial.println("R Butt Dn");
 -     OLED.disStr(0, 32, "R Butt Un   ");
 -     OLED.display();    
 - };
 - void MouseRptParser::OnMiddleButtonUp (MOUSEINFO *mi)
 - {
 -     Serial.println("M Butt Up");
 -     OLED.disStr(0, 32, "M Butt Up   ");
 -     OLED.display();    
 - };
 - void MouseRptParser::OnMiddleButtonDown (MOUSEINFO *mi)
 - {
 -     Serial.println("M Butt Dn");
 -     OLED.disStr(0, 32, "M Butt Up   ");
 -     OLED.display();    
 - };
 - 
 - MouseRptParser                               Prs;
 - 
 - 
 - void setup(void)
 - {
 -   Serial.begin(115200);
 -   OLED.init();
 -   OLED.flipScreenVertically();
 - 
 -     if (Usb.Init() == -1)
 -         Serial.println("OSC did not start.");
 - 
 -     delay( 200 );
 - 
 -     HidMouse.SetReportParser(0, &Prs);
 - 
 -     OLED.disStr(0, 0, "Mouse测试");
 -     OLED.display();
 - }
 - 
 - 
 - void loop(void)
 - {
 - 
 -     Usb.Task();
 -     
 - 
 - }    
 
  复制代码
 参考:  
 |