fix(spi-ota): 修复SPI OTA从机接收和状态机处理逻辑

- 调整pollAllLinks执行顺序,先轮询SPI再轮询CAN,减少CAN阻塞对SPI的影响
- SPI内部NSS固定拉低,避免因NSS延迟导致首字节丢失问题
- onCsAssert中全面停止和重启DMA,确保DMA传输第一拍正确发出
- 修正CS断开时DMA停止逻辑,保持内部NSS常低,提升SPI从机响应稳定性
- 增加多缓冲ISR日志区,提升关键事件调试信息完整性
- 完善SPI中断流程,支持缺失EXTI中断时补做CS断言,优化首字节数据处理
- 实现tryProcessCompleteFrame函数,实现RBNE中断内即时帧检测和处理
- OTA模块增加getState和resetToIdle接口,支持BOOT命令重置OTA状态机
- 开启DEBUG_PRINT,启用调试打印输出,便于运行时状态监控和问题排查
This commit is contained in:
cbb
2026-05-28 21:52:07 +08:00
parent d1beb3b615
commit 9d4572da13
5 changed files with 288 additions and 57 deletions
+4 -5
View File
@@ -16,6 +16,7 @@ typedef enum {
SPI_OTA_CMD_REQ = 0x01,
SPI_OTA_CMD_DATA = 0x02,
SPI_OTA_CMD_CANCEL = 0x03,
SPI_OTA_CMD_BOOT = 0xB0,
SPI_OTA_RSP_ACK = 0x80,
SPI_OTA_RSP_WAIT = 0x81,
SPI_OTA_RSP_ERROR = 0x82
@@ -44,12 +45,10 @@ public:
static bool hasTxFrame();
static u16 copyTxFrame(u8 *out, u16 max_len);
/** @brief CS 释放后 ISR 中直接完成帧校验+处理+响应准备。 */
static void isrProcessFrame();
/** @brief ISR 内轻量日志写入延迟打印缓冲。 */
static void tryProcessCompleteFrame();
static void isrLogFrame(const char *tag, const u8 *data, u16 len);
/* ---- 公开成员 ---- */
static OTAHandler *s_otaHandler;
static volatile bool s_csActive;
static volatile u16 s_rxStreamLen;
@@ -58,7 +57,7 @@ public:
static u8 s_txBuf[kTxBufSize];
static volatile u16 s_txLen;
static volatile bool s_txPending;
static volatile bool s_isrResponded; // ISR 已发送响应帧,主循环本轮不再发 WAIT
static volatile bool s_isrResponded;
static volatile bool s_isrLogPending;
static u8 s_isrLogBuf[kIsrLogBufSize];
static u16 s_isrLogLen;
@@ -100,4 +99,4 @@ u16 spi_ota_copy_tx_frame(u8 *out, u16 max_len);
}
#endif
#endif
#endif