/** * @file esp32_en.h * @brief ESP32 EN/RESET (PC9 / WLESS_EN) 手动控制 —— 网页开关经 EtherCAT SDO 0x2503 下发。 * * 硬件语义(见 sys/config.h CONFIG_ESP32_RESET_*): * - PC9 推挽高 = 释放 ESP_CHIP_EN,ESP32 运行、WiFi 可用 * - PC9 推挽低 = 按死 EN,ESP32 硬复位/掉使能,WiFi 与 HTTP 全断 * - PC9 浮空 = 外部 C41/U11 把 ESP_CHIP_EN 拉低,同样关断(与复位后一致) * * 控制必须走 EtherCAT(与 ESP32 解耦):WiFi 关断后 ESP32 已死, * 经 /spi/send 的路径关得掉、开不回来。 * 恢复:再次 SDO 写 action 0/2 拉高;或 GD32 复位/重新上电(initial.cpp 无条件拉高)。 * * SPI 重建:ESP32 冷启动的 GPIO 毛刺会再次弄脏 SPI 链路,故拉高 PC9 后 * 在起机窗口内多次 resetEsp32Link(),赶在 HELLO 前把 session/DMA 清干净。 */ #ifndef SYS_ESP32_EN_H #define SYS_ESP32_EN_H #include class Esp32En { public: /** * @brief 驱动/回读 ESP32 EN(PC9)。EtherCAT SDO 0x2503 转发到此。 * @param action 0=拉高(开) 1=拉低保持(关) 2=拉高 3=浮空 4=只读 5=仅复位 SPI * @return 实际引脚电平 0/1(与 nrstDrive 同口径);0xEE=无效 action。 */ static uint8_t drive(uint8_t action); /** * @brief 起机窗口内补清 SPI 链路(TaskRunner::runPending 每圈调用)。 * @note 无排期时立即返回。PC9 拉高后早期少量补清;一旦收到 CS 事务即停, * 避免打断正在建连的 HELLO。 */ static void poll(); /** @brief SPI 收到任意 CS 事务时取消剩余补清(由 processCommand 调用)。 */ static void cancelRelinkFromSpi(); }; #endif /* SYS_ESP32_EN_H */