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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user