feat(comm): 1.6.51 CAN 空通道自动静默 + PDO 诊断 + OTA 布局共用头
变更点: 1. CAN-FD(device/CANFD.cpp、sys/config.h) - 发送统一 FD+BRS(DLC≤8 不再回退经典 CAN);OTA 期仍按通道压制 BRS - 空通道自动识别:连续 5 个 1Hz 窗口无有效帧且有错误 → 静默上报;有帧即恢复 - 三路 CAN 默认全开;RX parse budget 48→64 2. EtherCAT 桥 / PDO - 段1 增 txtxid/rx00ff;版本应答 0x00FF 粘滞发布,避免被 CONFIG 冲掉 - STATUS 禁止写入 xrx 快照;processSeq 新鲜度救援 3. OTA / 配置 - sys/config.h include 仓库内 shared/ota_layout.h(与 BOOT 共用,不再依赖仓外路径) - ota_boot_request 对齐配置页 word 布局 4. docs/audit_ecat_spi_wifi_ota_compatibility.md:ECAT/SPI/WiFi/OTA 兼容性审计 5. .gitignore:忽略 .trae/、docs/traework-import、评审过程稿
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
* ADC → CANFD → OtaBootRequest → TaskManager → Scheduler →
|
||||
* EtherCAT(+Sync 可选) → Watchdog → report
|
||||
*
|
||||
* 1.5.34:各模块 init 从"盲配置"改为带检查(寄存器回读 / 节拍验证 / 校准超时),
|
||||
* 各模块 init 带检查(寄存器回读 / 节拍验证 / 校准超时),
|
||||
* 失败不置位;复位源/模块位图/critical 失败位图经 getter 导出供 SPI 0xA3 上报。
|
||||
*/
|
||||
|
||||
@@ -38,8 +38,7 @@ uint8_t AppInitializer::s_resetCause = 0U;
|
||||
uint8_t AppInitializer::s_faultCodes[AppInitializer::kModuleCount] = {0U};
|
||||
|
||||
/* CoE 0x100A「Software version」写入口,实现在 comm/ssc/src/coeappl.c(C 链接)。
|
||||
* APP 侧原本一直回 SSC 占位 "1.0",主站在总线上读不到版本,只能靠 SPI PING 的
|
||||
* 4 字节二进制身份块;这条总线读数是刷写后「新 APP 真起来了」的自证。 */
|
||||
* 主站总线读此对象可自证「新 APP 真起来了」。 */
|
||||
extern "C" void AppSetSoftwareVersion(const char *version);
|
||||
|
||||
namespace {
|
||||
@@ -200,9 +199,8 @@ void AppInitializer::report()
|
||||
fail_list[0] != '\0' ? fail_list : "?");
|
||||
}
|
||||
|
||||
/* 日志完整性自证:串口 TX 缓冲溢出会静默吞字节,1.5.40 及之前实测使 [ECAT] 诊断
|
||||
* 出现 "bus eaabled"/"pdi_type=0x8Dexect" 等掉字,并两次导致 LAN9252 故障误定性。
|
||||
* 1.5.41 起缓冲满时自旋腾位,仅 USART 外设异常才丢弃;非 0 即代表上面的日志不可全信。 */
|
||||
/* 日志完整性自证:串口 TX 缓冲溢出会静默吞字节。
|
||||
* 缓冲满时自旋腾位,仅 USART 外设异常才丢弃;非 0 即代表上面的日志不可全信。 */
|
||||
const uint32_t dropped = Usart0::droppedBytes();
|
||||
if (dropped != 0U) {
|
||||
printf("[APP] WARN: uart dropped %u bytes, 以上日志可能不完整\r\n",
|
||||
@@ -308,13 +306,11 @@ void AppInitializer::init()
|
||||
}
|
||||
|
||||
/* ---- EtherCAT: EXMC 总线探活 → SSC 协议栈初始化 → SYNC0/IRQ 中断使能 ----
|
||||
* 1.5.27:改经 EthercatSlave::init()(内部调用 EscLan9252::init 并记录
|
||||
* chipId/AL 状态诊断,此前该函数无调用点、s_escReady 恒为 false)。
|
||||
* 门控用 EscLan9252::isBusReady()(BYTE_TEST 通过)而非 isEscReady():
|
||||
* 冷启动时 AL=INIT,SSC 必须照常启动并等待主站配置。
|
||||
* 1.5.39:追加 isCoreReady() 门控——EscLan9252::init() 已等待 EEPROM(SII)
|
||||
* 另需 isCoreReady()——EscLan9252::init() 已等待 EEPROM(SII)
|
||||
* 加载完成(DL_STATUS bit0);未加载时 EtherCAT 核心寄存器写静默丢弃,
|
||||
* SSC 的 AL Event Mask/邮箱 SM 配置会全部落空(主站恒读 AL=INIT 的根因),
|
||||
* SSC 的 AL Event Mask/邮箱 SM 配置会全部落空(主站恒读 AL=INIT),
|
||||
* 此时跳过 SSC 并以独立故障码上报。
|
||||
* EEPROM 校验/烧录延迟到主循环执行,避免阻塞 init(烧录需 ~20s)。 */
|
||||
EthercatSlave::init();
|
||||
@@ -337,7 +333,9 @@ void AppInitializer::init()
|
||||
printf("[ECAT] EXMC bus not ready, SSC skipped\r\n");
|
||||
}
|
||||
|
||||
/* 看门狗放最后:PSC/RLD 写入经硬件确认才置位 */
|
||||
/* 看门狗放最后:PSC/RLD 写入经硬件确认才置位。
|
||||
* 崩溃计数不在这里清:须喂狗稳定满 CONFIG_CRASH_CLEAR_AFTER_SEC
|
||||
* (task_runner 每圈 maybeClearCrashCount),否则主循环崩溃攒不到阈值。 */
|
||||
const uint8_t wdgFault = Watchdog::init();
|
||||
if (wdgFault == Watchdog::kFaultOk) {
|
||||
mark(kWatchdog);
|
||||
|
||||
Reference in New Issue
Block a user