feat(can): 添加跨通道CAN突发发送功能支持多电机同步驱动
- 新增 /can/send_burst HTTP接口,支持一次SPI事务批量发送多帧CAN消息 - 实现canFdSendBurst函数,通过0xC7 SPI类型实现背靠背装载各通道邮箱 - 添加canBurstCapacity函数计算单次突发最大帧数限制 - 突发发送期间暂停can_feedback_task避免SPI抢占冲突 refactor(can_feedback_task): 改造为周期查询+事件消费模式 - 0xC4/0xC5从GD32主动推送改为ESP32周期查询(250ms/1s) - 0xC6/0xD2仍保留事件驱动推送模式,由任务消费处理 - 消除OTA期间GD32悬空按铃导致的超时刷屏问题 - 电机OTA期间也暂停任务避免与0xD1抢夺SPI资源 perf(ota_relay): 增加重发次数上限提升传输可靠性 - 将kMaxDataSends从3次增加到5次,提高数据包传输成功率 chore(version): 更新固件版本号至0.3.78 - 版本查询checkVersionWait移到tickInFlight释放后异步触发 - 避免/motor/version请求拖长tick导致tickStuck误报通道闪黄
This commit is contained in:
@@ -53,6 +53,44 @@ int canFdSend(can_channel_t channel, uint32_t ext_id,
|
||||
uint32_t timeout_ms,
|
||||
uint8_t *gd32_err_out = nullptr);
|
||||
|
||||
// ============================================================
|
||||
// CAN 跨通道突发发送(SPI 0xC7)
|
||||
// 一次 SPI 事务携带多帧,GD32 背靠背装载各通道 CAN 邮箱,
|
||||
// 组内近同时上线(偏差 <1ms),用于多电机同步驱动。
|
||||
// ============================================================
|
||||
#define CAN_BURST_HARD_MAX (16) ///< GD32 单次突发硬上限(帧数)
|
||||
|
||||
/** @brief 突发条目:chnode=(ch<<4)|node,data 指向 dlc 字节数据。 */
|
||||
typedef struct {
|
||||
uint8_t chnode; ///< (channel<<4) | node
|
||||
const uint8_t *data; ///< dlc 字节数据
|
||||
} can_burst_entry_t;
|
||||
|
||||
/**
|
||||
* @brief 给定统一 DLC,返回单次突发最多可容纳的帧数。
|
||||
* 受 236B SPI payload(4B 头 + count*(1+dlc))与 GD32 硬上限约束。
|
||||
*/
|
||||
uint8_t canBurstCapacity(uint8_t dlc);
|
||||
|
||||
/**
|
||||
* @brief 发送一次 CAN 突发(SPI 0xC7)。count 必须 <= canBurstCapacity(dlc)。
|
||||
* GD32 在 ISR 内对每帧调用非阻塞 transmitFrame,各通道邮箱背靠背装载。
|
||||
* @param id_suffix CAN ID 低 16 位(CMD=0x0200);id=(node<<16)|suffix。
|
||||
* @param dlc 所有条目统一数据长度(0~64)。
|
||||
* @param entries count 个条目(chnode + data)。
|
||||
* @param count 条目数(1~canBurstCapacity(dlc))。
|
||||
* @param status_out 输出每帧状态(GD32 CanTxResult 码,0x00=成功),可为 nullptr。
|
||||
* @param status_max status_out 容量。
|
||||
* @param timeout_ms SPI 事务超时。
|
||||
* @param gd32_err_out 返回 -3 时的 GD32 细分错误码;可为 nullptr。
|
||||
* @return 成功返回 count;-1 参数错误;-2 SPI 通信失败;-3 GD32 ERROR。
|
||||
*/
|
||||
int canFdSendBurst(uint16_t id_suffix, uint8_t dlc,
|
||||
const can_burst_entry_t *entries, uint8_t count,
|
||||
uint8_t *status_out, uint8_t status_max,
|
||||
uint32_t timeout_ms,
|
||||
uint8_t *gd32_err_out = nullptr);
|
||||
|
||||
// ============================================================
|
||||
// 不重复 ID 快照表(SPI 0xC3 协议配套)
|
||||
// ============================================================
|
||||
|
||||
Reference in New Issue
Block a user