三年前设计过一个 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();
-
-
- }
复制代码
参考:
|