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[i]==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[i*DISK_SECTOR_SIZE], &msc_disk[getLBA][0], DISK_SECTOR_SIZE);
- //HWSerial.printf("Send %u\n", getLBA);
- //HWSerial.printf("Buffer2 %X\n", (void *)&p[i*DISK_SECTOR_SIZE]);
- } else {
- //HWSerial.printf("Send all zero to %u\n", getLBA);
- for (uint16_t j=0;j<DISK_SECTOR_SIZE;j++) {
- p[i*DISK_SECTOR_SIZE+j]=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 的玩法。
完整代码在: ESP32S2256DSK_FullSize.zip
参考:
1.https://www.lab-z.com/fakeud/ ESP32 S2 上实现假U盘(ESP32 2.0.1 )
2.https://mc.dfrobot.com.cn/thread-309859-1-1.html ESP32 S2 做一个假U盘
|