feat(ethercat): 添加ESP32使能控制功能通过EtherCAT SDO

添加0x2503对象字典项用于通过EtherCAT SDO控制ESP32 WiFi使能信号,
解决WiFi关断后无法重新开启的问题。同时添加sys/esp32_en.h/.cpp文件
提供GPIO控制接口。

SPI诊断命令(0xA2)扩展支持ESP32 EN引脚控制,用于诊断备援。
ESP32掉电重启后自动清理SPI链路状态,防止通信异常。
This commit is contained in:
cbb
2026-09-24 03:18:18 +08:00
parent 5fd986299c
commit 28d8426052
10 changed files with 272 additions and 5 deletions
+49
View File
@@ -167,6 +167,10 @@ extern void EcatPdo_WriteInputs(UINT8 *esc);
* 只置 pending 标志,真正的配置页写入 + 复位在主循环下一圈,见 ObjBootReqWrite 注。 */
extern void EcatEnterBootRequestAsync(void);
/* 0x2503 用:ESP32 EN(PC9) 控制(sys/esp32_en.cpp 的 extern "C" shim)。
* 经 EtherCAT SDO 下发,**不走 ESP32 WiFi**——WiFi 关断后主站仍能拉回使能。 */
extern UINT8 EcatEsp32EnDrive(UINT8 action);
/*---------------------------------------------------------------------------
* PDO Assign 对象 (0x1C12 / 0x1C13)
*---------------------------------------------------------------------------*/
@@ -346,6 +350,47 @@ static UINT8 ObjBootReqWrite(UINT16 index, UINT8 subindex, UINT32 dataSize,
return 0U;
}
/*---------------------------------------------------------------------------
* 0x2503 ESP32 WiFi EN(PC9 / WLESS_EN)控制(主站 → APP)
*
* 为什么走 EtherCAT 而不是 SPI 0xA2 / WiFi HTTP:WiFi 使能被拉低后 ESP32
* 当场掉线,经 /spi/send 的控制路径跟被控对象同生共死——关得掉、开不回来。
* EtherCAT 主站在 PC 侧,与 ESP32 完全解耦,关断/开启都能下发。
*
* 语义(UINT32 bit[7:0]=action,与 sys/esp32_en.h Esp32En::drive 对齐):
* 0=拉高(开) 1=拉低保持(关) 2=拉高 3=浮空 4=只读
* 读回:bit[7:0] = 实际引脚电平 0/1(0xEE=无效 action)。
*---------------------------------------------------------------------------*/
OBJCONST TSDOINFOENTRYDESC OBJMEM sEntryDesc0x2503[] = {
{DEFTYPE_UNSIGNED32, 0x20, ACCESS_READWRITE},
};
static OBJCONST UCHAR aName0x2503[] = "ESP32 WiFi EN";
static UINT32 s_esp32EnVal = 1U; /**< 读回缓存:默认 1=上电已释放 EN */
static UINT8 ObjEsp32EnWrite(UINT16 index, UINT8 subindex, UINT32 dataSize,
UINT16 MBXMEM *pData, UINT8 bCompleteAccess)
{
const UINT8 *p8 = (const UINT8 *)pData;
UINT32 v;
UINT8 action, st;
(void)index;
(void)bCompleteAccess;
if (subindex != 0U) {
return ABORTIDX_SUBINDEX_NOT_EXISTING;
}
if (pData == NULL || dataSize < 4U) {
return ABORTIDX_PARAM_LENGTH_TOO_SHORT;
}
v = (UINT32)p8[0] | ((UINT32)p8[1] << 8) | ((UINT32)p8[2] << 16) | ((UINT32)p8[3] << 24);
action = (UINT8)(v & 0xFFU);
st = EcatEsp32EnDrive(action);
s_esp32EnVal = (UINT32)st;
return 0U;
}
/*---------------------------------------------------------------------------
* Object Names
*---------------------------------------------------------------------------*/
@@ -395,6 +440,10 @@ TOBJECT OBJMEM ApplicationObjDicList[] = {
{NULL, NULL, 0x2502, {DEFTYPE_UNSIGNED32, 0 | (OBJCODE_VAR << 8)},
sEntryDesc0x2502, aName0x2502, &s_bootReq, NULL, ObjBootReqWrite, 0x0000},
/* 0x2503: ESP32 WiFi EN(PC9) —— 经 EtherCAT 控制,WiFi 关断后仍可拉回 */
{NULL, NULL, 0x2503, {DEFTYPE_UNSIGNED32, 0 | (OBJCODE_VAR << 8)},
sEntryDesc0x2503, aName0x2503, &s_esp32EnVal, NULL, ObjEsp32EnWrite, 0x0000},
/* 终止条目 */
{NULL, NULL, 0xFFFF, {0, 0}, NULL, NULL, NULL, NULL, NULL, 0x000}
};