想不到有啥好写法了,先全用BSP_FDCAN_MAX_DLC,BSP_FDCAN_MAX_DLC可以通过mr读ioc调整
This commit is contained in:
parent
55153c98a0
commit
9f884a4f7e
@ -65,25 +65,21 @@ typedef struct BSP_FDCAN_QueueNode {
|
||||
} BSP_FDCAN_QueueNode_t;
|
||||
|
||||
/* Private variables -------------------------------------------------------- */
|
||||
//static BSP_FDCAN_QueueNode_t *queue_list = NULL;
|
||||
//static osMutexId_t queue_mutex = NULL;
|
||||
//static void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void);
|
||||
//static bool inited = false;
|
||||
//static BSP_FDCAN_IdParser_t id_parser = NULL;
|
||||
//static BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM];
|
||||
BSP_FDCAN_QueueNode_t *queue_list = NULL;
|
||||
osMutexId_t queue_mutex = NULL;
|
||||
void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void);
|
||||
bool inited = false;
|
||||
BSP_FDCAN_IdParser_t id_parser = NULL;
|
||||
BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM];
|
||||
static BSP_FDCAN_QueueNode_t *queue_list = NULL;
|
||||
static osMutexId_t queue_mutex = NULL;
|
||||
static void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void);
|
||||
static bool inited = false;
|
||||
static BSP_FDCAN_IdParser_t id_parser = NULL;
|
||||
static BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM];
|
||||
static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64};
|
||||
|
||||
/* Private function prototypes ---------------------------------------------- */
|
||||
static BSP_FDCAN_t FDCAN_Get(FDCAN_HandleTypeDef *hfdcan);
|
||||
static osMessageQueueId_t BSP_FDCAN_FindQueue(BSP_FDCAN_t fdcan, uint32_t can_id);
|
||||
static int8_t BSP_FDCAN_CreateIdQueue(BSP_FDCAN_t fdcan, uint32_t can_id, uint8_t queue_size);
|
||||
static void BSP_FDCAN_RxFifo0Callback(void);
|
||||
static void BSP_FDCAN_RxFifo1Callback(void);
|
||||
// static void BSP_FDCAN_TxCompleteCallback(void);
|
||||
static void BSP_FDCAN_TxCompleteCallback(void);
|
||||
static BSP_FDCAN_FrameType_t BSP_FDCAN_GetFrameType(FDCAN_RxHeaderTypeDef *header);
|
||||
static uint32_t BSP_FDCAN_DefaultIdParser(uint32_t original_id, BSP_FDCAN_FrameType_t frame_type);
|
||||
static void BSP_FDCAN_TxQueueInit(BSP_FDCAN_t fdcan);
|
||||
@ -210,7 +206,6 @@ static void BSP_FDCAN_TxCompleteCallback(void) {
|
||||
}
|
||||
}
|
||||
}
|
||||
static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64};
|
||||
|
||||
static void BSP_FDCAN_RxFifo0Callback(void) {
|
||||
FDCAN_RxHeaderTypeDef rx_header;
|
||||
@ -246,7 +241,6 @@ static void BSP_FDCAN_RxFifo0Callback(void) {
|
||||
static void BSP_FDCAN_RxFifo1Callback(void) {
|
||||
FDCAN_RxHeaderTypeDef rx_header;
|
||||
uint8_t rx_data[BSP_FDCAN_MAX_DLC];
|
||||
static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64};
|
||||
for (int fdcan_idx = 0; fdcan_idx < BSP_FDCAN_NUM; fdcan_idx++) {
|
||||
FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle((BSP_FDCAN_t)fdcan_idx);
|
||||
if (hfdcan == NULL) continue;
|
||||
@ -329,19 +323,16 @@ int8_t BSP_FDCAN_Init(void) {
|
||||
if (inited) return BSP_ERR_INITED;
|
||||
|
||||
memset(FDCAN_Callback, 0, sizeof(FDCAN_Callback));
|
||||
|
||||
for (int i = 0; i < BSP_FDCAN_NUM; i++) BSP_FDCAN_TxQueueInit((BSP_FDCAN_t)i);
|
||||
|
||||
id_parser = BSP_FDCAN_DefaultIdParser;
|
||||
|
||||
queue_mutex = osMutexNew(NULL);
|
||||
|
||||
if (queue_mutex == NULL) return BSP_ERR;
|
||||
|
||||
inited = true;
|
||||
|
||||
/* 配置并启动 FDCAN 实例,绑定中断/回调 */
|
||||
|
||||
//========== 过滤器配置说明:==========================
|
||||
// 过滤器编号:相对于每个(相当于经典can过滤器的bank)
|
||||
// sFilterConfig.FilterIndex = 0 to 127(标准ID) or 0 to 63(扩展ID);
|
||||
// 关于过滤器索引的说明:
|
||||
@ -379,7 +370,7 @@ int8_t BSP_FDCAN_Init(void) {
|
||||
// 仅在FilterConfig 设为 FDCAN_FILTER_TO_RXBUFFER 时才有意义,通常设置为0
|
||||
// IsCalibrationMsg = 0 or 1;
|
||||
// fdcan_filter_table.h
|
||||
|
||||
//=================================================================================
|
||||
/* 依据上述说明,配置过滤器并启动FDCAN */
|
||||
FDCAN_FilterTypeDef sFilterConfig;
|
||||
|
||||
@ -452,7 +443,7 @@ int8_t BSP_FDCAN_RegisterCallback(BSP_FDCAN_t fdcan, BSP_FDCAN_Callback_t type,
|
||||
FDCAN_Callback[fdcan][type] = callback;
|
||||
return BSP_OK;
|
||||
}
|
||||
uint32_t fifolevel=0;
|
||||
|
||||
int8_t BSP_FDCAN_Transmit(BSP_FDCAN_t fdcan, BSP_FDCAN_Format_t format, uint32_t id, uint8_t *data, uint8_t dlc) {
|
||||
if (!inited) return BSP_ERR_INITED;
|
||||
if (fdcan >= BSP_FDCAN_NUM) return BSP_ERR;
|
||||
@ -507,10 +498,8 @@ int8_t BSP_FDCAN_Transmit(BSP_FDCAN_t fdcan, BSP_FDCAN_Format_t format, uint32_t
|
||||
tx_msg.header.DataLength = BSP_FDCAN_EncodeDLC(dlc);
|
||||
|
||||
memset(tx_msg.data, 0, dlc);
|
||||
if (data != NULL && dlc > 0) {
|
||||
memcpy(tx_msg.data, data, dlc);}
|
||||
if (data != NULL && dlc > 0) {memcpy(tx_msg.data, data, dlc);}
|
||||
|
||||
fifolevel=HAL_FDCAN_GetTxFifoFreeLevel(hfdcan);
|
||||
if (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan) > 0) {
|
||||
if (HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &tx_msg.header, tx_msg.data) == HAL_OK) return BSP_OK;
|
||||
}
|
||||
|
||||
@ -20,9 +20,11 @@
|
||||
/* USER STRUCT BEGIN */
|
||||
BSP_FDCAN_Message_t msg1={0};
|
||||
BSP_FDCAN_Message_t msg2={0};
|
||||
BSP_FDCAN_Message_t msg3={0};
|
||||
BSP_FDCAN_Message_t msg3A={0};
|
||||
BSP_FDCAN_Message_t msg3B={0};
|
||||
BSP_FDCAN_Message_t msg3C={0};
|
||||
/* USER STRUCT END */
|
||||
float rxlevel=0;
|
||||
|
||||
/* Private function --------------------------------------------------------- */
|
||||
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
@ -51,7 +53,8 @@ void Task_blink(void *argument) {
|
||||
BSP_FDCAN_RegisterId(BSP_FDCAN_1, 0x101, 8);
|
||||
BSP_FDCAN_RegisterId(BSP_FDCAN_2, 0x102, 8);
|
||||
BSP_FDCAN_RegisterId(BSP_FDCAN_3, 0x103, 8);
|
||||
|
||||
BSP_FDCAN_RegisterId(BSP_FDCAN_3, 0x104, 8);
|
||||
BSP_FDCAN_RegisterId(BSP_FDCAN_3, 0x105, 8);
|
||||
/* USER CODE INIT END */
|
||||
|
||||
while (1) {
|
||||
@ -78,15 +81,20 @@ void Task_blink(void *argument) {
|
||||
// 使用 BSP 封装的发送接口(非阻塞,若硬件 FIFO 满则内部入队)
|
||||
BSP_FDCAN_Transmit(BSP_FDCAN_1, BSP_FDCAN_FORMAT_STD_DATA, 0x101, data1, 8);
|
||||
BSP_FDCAN_Transmit(BSP_FDCAN_2, BSP_FDCAN_FORMAT_STD_DATA, 0x102, data2, 8);
|
||||
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x103, data3, 13);
|
||||
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x103, data3, 30);
|
||||
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x104, data2, 5);
|
||||
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x105, data1, 8);
|
||||
|
||||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_1, 0x101, &msg1, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||||
}
|
||||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_2, 0x102, &msg2, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||||
}
|
||||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x103, &msg3, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x103, &msg3A, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||||
}
|
||||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x104, &msg3B, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||||
}
|
||||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x105, &msg3C, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||||
}
|
||||
rxlevel=HAL_FDCAN_GetRxFifoFillLevel(BSP_FDCAN_GetHandle(BSP_FDCAN_2), FDCAN_RX_FIFO1);
|
||||
}
|
||||
// osDelay(10);
|
||||
/* USER CODE END */
|
||||
|
||||
Loading…
Reference in New Issue
Block a user