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