...
/* USER CODE BEGIN 1 */
void User_Config_Filter(void)
{
// 給FIFO0配置一個過濾器0
CAN_FilterTypeDef filter_config;
filter_config.FilterBank = 0;
filter_config.FilterFIFOAssignment = CAN_FILTER_FIFO0;
filter_config.FilterMode = CAN_FILTERMODE_IDMASK;
filter_config.FilterScale = CAN_FILTERSCALE_32BIT;
filter_config.FilterIdLow = 0;
filter_config.FilterIdHigh = 0;
filter_config.FilterMaskIdHigh = 0;
filter_config.FilterMaskIdLow = 0;
filter_config.FilterActivation = CAN_FILTER_ENABLE;
HAL_CAN_ConfigFilter(&hcan, &filter_config);
}
void User_CAN_SendMsg(uint16_t stdId, uint8_t data[], uint8_t length)
{
/* 1.讀取當前發送郵箱的狀態 */
// 得到空閒的發送郵箱的個數
uint32_t freeBoxesNum = HAL_CAN_GetTxMailboxesFreeLevel(&hcan);
/* 2.使用封裝好的方法發送報文 */
if (freeBoxesNum > 0)
{
CAN_TxHeaderTypeDef header_type;
header_type.IDE = CAN_ID_STD;
header_type.RTR = CAN_RTR_DATA;
header_type.StdId = stdId;
header_type.DLC = length;
// 自動尋找空閒的郵箱 存放對應的發送郵箱編號
uint32_t boxNum;
HAL_CAN_AddTxMessage(&hcan, &header_type, data, &boxNum);
}
else
{
// 當前郵箱沒有空閒 等會再發
printf("當前郵箱沒有空閒 等會再發\n");
}
}
void User_CAN_ReceiveMsg(RxDataStruct rxDataStruct[], uint8_t *msgCount)
{
/* 1. 獲取接收隊列中的報文數 */
*msgCount = HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0);
/* 2. 將報文數據賦值到結構體數組中 */
for (uint8_t i = 0; i < *msgCount; i++)
{
// 提前聲明結構體 用於接收報文數據的頭信息
CAN_RxHeaderTypeDef header_tyep;
RxDataStruct *msg = &rxDataStruct[i];
memset(msg->data, 0, 8);
HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &header_tyep, msg->data);
// 補全頭信息
msg->stdId = header_tyep.StdId;
msg->length = header_tyep.DLC;
}
}
/* USER CODE END 1 */