feat(canfd): 添加直接发送CANFD帧功能用于SPI桥接场景

- 新增 CanFd::transmitFrame() 方法,支持绕过软件队列直接调用
  硬件发送CANFD扩展帧
- 实现参数验证,包括通道索引、数据指针和DLC长度检查
- 集成GD32E508特定的FD标志和波特率切换设置
- 更新诊断统计信息,记录发送计数、最后ID、通道和负载长度

feat(spi-command): 添加SPI到CAN总线桥接发送命令类型

- 引入 kTypeCanSend (0xC0) 命令类型用于SPI-CAN桥接
- 实现CAN_SEND命令处理逻辑,解析载荷中的通道、ID和数据
- 支持3个CAN通道(0/1/2),验证通道有效性防止越界访问
- 添加详细的错误处理和日志记录机制

refactor(config): 更新SPI命令ACK确认码和构建版本号

- 将CONFIG_SPI_APP_OTA_BOOT_ACK_OK从0xA5U改为0xB5U以避免冲突
- 提升APP_FW_VERSION_BUILD从1到2以反映新功能集成
This commit is contained in:
cbb
2026-06-13 17:07:25 +08:00
parent d0b6d9537e
commit 01382a3fc1
5 changed files with 100 additions and 57 deletions
+43
View File
@@ -432,6 +432,49 @@ bool CanFd::consumeRxFrame(uint32_t *id, uint8_t *data, uint8_t *length, uint8_t
return true;
}
/**
* @brief 直接向指定 CAN 通道发送一帧任意数据报文(扩展帧)。
* @param[in] channelIndex 目标 CAN 通道号(0/1/2)。
* @param[in] ext_id 扩展帧 ID(29 位)。
* @param[in] data 数据负载指针。
* @param[in] dlc 数据长度(1~64)。
* @retval bool true 表示成功入队硬件邮箱,false 表示参数无效或邮箱已满。
* @note 绕过软件发送队列,直接调用硬件发送;适用于 SPI 桥接等即时发送场景。
*/
bool CanFd::transmitFrame(uint8_t channelIndex, uint32_t ext_id,
const uint8_t *data, uint8_t dlc)
{
if (channelIndex >= kChannelCount || data == nullptr || dlc == 0U || dlc > 64U) {
return false;
}
can_trasnmit_message_struct tx_msg{};
can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &tx_msg);
tx_msg.tx_efid = ext_id;
tx_msg.tx_ff = CAN_FF_EXTENDED;
tx_msg.tx_ft = CAN_FT_DATA;
tx_msg.tx_dlen = dlc;
#ifdef GD32E508
tx_msg.fd_flag = (dlc > 8U) ? ENABLE : DISABLE;
tx_msg.fd_brs = (dlc > 8U) ? ENABLE : DISABLE;
tx_msg.fd_esi = CAN_ESI_DOMINANT;
#endif
for (uint8_t i = 0U; i < dlc; ++i) {
tx_msg.tx_data[i] = data[i];
}
const uint8_t mailbox = can_message_transmit(kChannels[channelIndex].canPeriph, &tx_msg);
if (mailbox != CAN_NOMAILBOX) {
s_diag.tx_count++;
s_diag.last_tx_id = ext_id;
s_diag.last_tx_channel = channelIndex;
s_diag.last_payload_length = dlc;
return true;
}
s_diag.error_count++;
return false;
}
/**
* @brief 获取 CANFD 诊断统计信息只读指针。
* @param[in] 无。