zoologist 发表于 2025-7-26 10:33:28

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]
查看完整版本: FireBeetle 2 ESP32 P4 USB 速度测试