修复BOOT丢帧问题,优化标志位的存储
This commit is contained in:
+31
-22
@@ -6,8 +6,6 @@
|
||||
#include "gd32c10x_dma.h"
|
||||
#include "gd32c10x_gpio.h"
|
||||
#include "main.h"
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -176,6 +174,10 @@ u8 CAN_transmiter::init() {
|
||||
/* initialize receive message */
|
||||
can_struct_para_init(CAN_RX_MESSAGE_STRUCT, &receive_message);
|
||||
|
||||
// 初始化计数器和标志位
|
||||
can0_receive_count = 0;
|
||||
can0_send_flag = RESET;
|
||||
|
||||
// 初始化DMA缓冲区
|
||||
memset(can_rx_buffer, 0, sizeof(can_rx_buffer));
|
||||
memset(can_tx_buffer, 0, sizeof(can_tx_buffer));
|
||||
@@ -184,28 +186,20 @@ u8 CAN_transmiter::init() {
|
||||
|
||||
/**
|
||||
* @brief CAN通信检查函数
|
||||
* @retval 0: 无新消息
|
||||
* 1: 有新消息
|
||||
* @retval 无
|
||||
*/
|
||||
void CAN_transmiter::communication_check() {
|
||||
// CAN0 发送数据标志
|
||||
if (SET == can0_send_flag) {
|
||||
can0_send_flag = RESET;
|
||||
}
|
||||
|
||||
// CAN0 接收数据标志
|
||||
if (SET == can0_receive_flag) {
|
||||
if (receive_message.rx_efid == CANFD_OTA_DATA_ID or
|
||||
receive_message.rx_efid == CANFD_OTA_REQ_ID) {
|
||||
ota.handleOTAMessage(receive_message.rx_efid,
|
||||
receive_message.rx_data,
|
||||
receive_message.rx_dlen);
|
||||
} else {
|
||||
#if CAN_DEBUG
|
||||
printf("Unknown CAN ID: %X\n", receive_message.rx_efid);
|
||||
#endif
|
||||
}
|
||||
can0_receive_flag = RESET;
|
||||
// CAN0 接收数据计数器
|
||||
if (can0_receive_count > 0) {
|
||||
can0_receive_count--;
|
||||
// 处理OTA消息(中断处理程序已确保只接收OTA相关ID)
|
||||
ota.handleOTAMessage(receive_message.rx_efid,
|
||||
receive_message.rx_data,
|
||||
receive_message.rx_dlen);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,7 +219,6 @@ u8 CAN_transmiter::sendBackup() { // 握手的时候
|
||||
return CANFD_AsyncSend(CANFD_OTA_ACK_ID, 0, transmit_data);
|
||||
}
|
||||
|
||||
|
||||
u8 CAN_transmiter::sendDATA_ACK(u32 packet_num,
|
||||
bool if_success) { // 发送数据的时候
|
||||
memset(transmit_data, 0, 4);
|
||||
@@ -255,10 +248,26 @@ void CAN0_RX0_IRQHandler(void) {
|
||||
dma_channel_enable(DMA0, DMA_CH4);
|
||||
|
||||
// 读取接收到的数据
|
||||
can_message_receive(CAN0, CAN_FIFO0, &CAN0_transmiter.receive_message);
|
||||
can_receive_message_struct temp_message;
|
||||
can_message_receive(CAN0, CAN_FIFO0, &temp_message);
|
||||
|
||||
// 接收标志位置1
|
||||
CAN0_transmiter.can0_receive_flag = SET;
|
||||
// 只处理指定的OTA相关ID(硬件过滤器已经确保只接收这些ID)
|
||||
if (temp_message.rx_efid == CANFD_OTA_DATA_ID ||
|
||||
temp_message.rx_efid == CANFD_OTA_REQ_ID ||
|
||||
temp_message.rx_efid == CANFD_OTA_ACK_ID ||
|
||||
temp_message.rx_efid == CANFD_OTA_WAIT_ID ||
|
||||
temp_message.rx_efid == CANFD_OTA_CANCEL_ID) {
|
||||
// 将消息复制到接收缓冲区
|
||||
CAN0_transmiter.receive_message = temp_message;
|
||||
// 增加待处理消息计数器
|
||||
if (CAN0_transmiter.can0_receive_count < 255) {
|
||||
CAN0_transmiter.can0_receive_count++;
|
||||
}
|
||||
} else {
|
||||
#if CAN_DEBUG
|
||||
printf("Unknown CAN ID: %X\n", temp_message.rx_efid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// 检查其他可能的中断源
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
#ifndef _CAN_H
|
||||
#define _CAN_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "cstdint"
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "gd32c10x_can.h"
|
||||
#include "stdint.h"
|
||||
#include <stdio.h>
|
||||
|
||||
u8 can_gpio_init(void); // CAN引脚初始化
|
||||
@@ -32,7 +31,7 @@ class CAN_transmiter {
|
||||
u8 init(void);
|
||||
|
||||
can_receive_message_struct receive_message; // 接收消息结构体
|
||||
FlagStatus can0_receive_flag; // CAN0接收标志
|
||||
u8 can0_receive_count; // CAN0待处理消息计数器
|
||||
FlagStatus can0_send_flag; // CAN0发送标志
|
||||
|
||||
void communication_check(); // 通信检查
|
||||
|
||||
Reference in New Issue
Block a user