三年前设计过一个 FireBeetle USB Host Shied【参考1】,后来有其他项目需要再次使用,因为主控芯片 Max3421e 的特定封装很难买到,所以进行了重新设计选择了市面上更常见的封装。
电路设计如下:
其中的H3条线是预留的USB设备供电,短路时USB 母头(U2)将会从 VCC 引脚取电给USB设备使用。
硬件方面,使用到如下引脚有:
FireBeetle | 引脚功能 |
VCC | 为USB 设备供电 |
3.3V | 为 Max3421e 芯片供电 |
GND | 地 |
D8(IO5) | SS信号 |
IO18 | SCLK信号 |
IO23 | MOSI信号 |
IO19 | MISO信号 |
IO17 | INT信号 |
上述引脚的选择原因是能够最大限度兼容USB Host Shield Library,无需修改这个 Library 即可正常工作。
最终PCB设计如下:
3D 预览如下:
焊接后实物图如下:
从左到右分别是 FireBeetle USB Host Shield, FireBeetle【DFR0478,参考2】 和 12864 OLED【DFR0507,参考3】。
将三者叠放连接起来,通过FireBeetle USB接口供电即可工作:
接下来进行代码设计,代码参考了USB Host Shield Library中的 UBSHIDBootMouse 的例子,以及OLED Library 中的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();
}
本文提到的电路图和PCB下载(立创EDA设计,但是特别注意,不要使用电路图中的BOM):
本文提到的库下载:
参考: