FireBeetle 2 ESP32 P4 USB 速度测试
ESP32 P4 终于开始了量产,可以轻松的在市面上购买到芯片和模块了。相比之前的型号,这个型号最大的不同是:增加了USB High Speed的支持,这样在 Arduino 开发环境的支持下,
这个芯片可以快捷简单的和PC进行连接,制作出更多的好玩项目。
最近 DFRobot 也推出了对应的 ESP32 P4 开发板:FireBeetle 2 ESP32 P4。笔者有幸拿到一块,这次做一个简单的测试,测试ESP32 P4 的 USB 速度。
可以看到,板子带有2个 TypeC 接口,其中一个是用于下载的接口(来自P4芯片内部),另外一个是可以编程的 TypeC 接口(同样来自P4内部)
开发板上手很简单,使用 Arduino 环境即可。测试的代码是将自身模拟为一个 U盘,上面有一个文件可以用于测试。
代码如下:
#include "USB.h"
#include "USBMSC.h"
#include "256MBDisk.bin.h"
#if ARDUINO_USB_CDC_ON_BOOT
#define HWSerial Serial0
#define USBSerial Serial
#else
#define HWSerial Serial
USBCDC USBSerial;
#endif
USBMSC MSC;
uint32_t findLBA(uint32_t LBA) {
for (uint16_t i=0; i<415;i++) {
if (Index==LBA) {
return i;
}
}
return 0xFFFFFF;
}
static const uint32_t DISK_SECTOR_COUNT = 520192;
static int32_t onRead(uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize){
//HWSerial.printf("MSC READ: lba: %u, offset: %u, bufsize: %u\n", lba, offset, bufsize);
int32_t getLBA=0;
uint8_t *p;
p=(uint8_t *)buffer;
//HWSerial.printf("Buffer1 %X\n", buffer);
for (uint32_t i=0;i<bufsize/DISK_SECTOR_SIZE;i++) {
//HWSerial.printf("Check %u\n", lba+i);
getLBA=findLBA(lba+i);
//HWSerial.printf("getLBA %u\n", getLBA);
if (getLBA!=0xFFFFFF) { //如果找到了
memcpy((void *)&p, &msc_disk, DISK_SECTOR_SIZE);
//HWSerial.printf("Send %u\n", getLBA);
//HWSerial.printf("Buffer2 %X\n", (void *)&p);
} else {
//HWSerial.printf("Send all zero to %u\n", getLBA);
for (uint16_t j=0;j<DISK_SECTOR_SIZE;j++) {
p=0;
}
}
}
return bufsize;
}
static bool onStartStop(uint8_t power_condition, bool start, bool load_eject){
HWSerial.printf("MSC START/STOP: power: %u, start: %u, eject: %u\n", power_condition, start, load_eject);
return true;
}
static void usbEventCallback(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data){
if(event_base == ARDUINO_USB_EVENTS){
arduino_usb_event_data_t * data = (arduino_usb_event_data_t*)event_data;
switch (event_id){
case ARDUINO_USB_STARTED_EVENT:
HWSerial.println("USB PLUGGED");
break;
case ARDUINO_USB_STOPPED_EVENT:
HWSerial.println("USB UNPLUGGED");
break;
case ARDUINO_USB_SUSPEND_EVENT:
HWSerial.printf("USB SUSPENDED: remote_wakeup_en: %u\n", data->suspend.remote_wakeup_en);
break;
case ARDUINO_USB_RESUME_EVENT:
HWSerial.println("USB RESUMED");
break;
default:
break;
}
}
}
static int32_t onWrite(uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize){
HWSerial.printf("MSC WRITE: lba: %u, offset: %u, bufsize: %u\n", lba, offset, bufsize);
return bufsize;
}
void setup() {
HWSerial.begin(115200);
HWSerial.setDebugOutput(true);
USB.onEvent(usbEventCallback);
MSC.vendorID("ESP32");//max 8 chars
MSC.productID("USB_MSC");//max 16 chars
MSC.productRevision("1.0");//max 4 chars
MSC.onStartStop(onStartStop);
MSC.onRead(onRead);
MSC.onWrite(onWrite);
MSC.mediaPresent(true);
MSC.begin(DISK_SECTOR_COUNT, DISK_SECTOR_SIZE);
USBSerial.begin();
USB.begin();
}
void loop() {
// put your main code here, to run repeatedly:
}
需要特别注意
1.选择 TinyUSB
2.型号使用 P4
连接板卡上方 TypeC 即可烧录, 然后连接右侧的TypeC,系统中会出现一个U盘
测试显示速度可以稳定在 10MB/S 左右。
之前的 ESP32 S2/S3 同样代码最高速度在 750KB/S 左右。相比之下速度提升了 13倍。相信未来可以研究出更多的 ESP32 P4 的玩法。
完整代码在:
参考:
1.https://www.lab-z.com/fakeud/ESP32 S2 上实现假U盘(ESP32 2.0.1 )
2.https://mc.dfrobot.com.cn/thread-309859-1-1.htmlESP32 S2 做一个假U盘
页:
[1]