幀結(jié)構(gòu)
- CAN的報(bào)文結(jié)構(gòu):
測(cè)試模式(靜默/換回/環(huán)回靜默):
- 靜默模式:
- 環(huán)回模式:
- 環(huán)回靜默模式:
環(huán)回測(cè)試配置
- 選好對(duì)應(yīng)GPIO即可,APB1 36 Mhz, 500kbps:
過濾器的使用
- 不配置過濾器亦可使用
- 根據(jù)不同位長(zhǎng)模式,每個(gè)過濾器組,32位模式可以配置一個(gè)屏蔽掩碼或兩個(gè)白名單列表,16位模式翻倍
- 標(biāo)準(zhǔn)幀和擴(kuò)展幀的ID長(zhǎng)度分別為11比特和29比特,通過移位操作對(duì)齊其對(duì)應(yīng)的高低位
測(cè)試參考用例
過濾器的初始化
- cube不能配置過濾器,需要手動(dòng)配置,直接添加到生成代碼的自定義區(qū)即可
- 初始化后需要手動(dòng)打開CAN外設(shè)
- 單機(jī)測(cè)試使用了環(huán)回模式
static void MX_CAN_Init(void)
{
/* USER CODE BEGIN CAN_Init 0 */
/* USER CODE END CAN_Init 0 */
/* USER CODE BEGIN CAN_Init 1 */
/* USER CODE END CAN_Init 1 */
hcan.Instance = CAN1;
hcan.Init.Prescaler = 4;
hcan.Init.Mode = CAN_MODE_LOOPBACK;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_9TQ;
hcan.Init.TimeSeg2 = CAN_BS2_8TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;
hcan.Init.AutoWakeUp = DISABLE;
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = DISABLE;
hcan.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN CAN_Init 2 */
//接收所有
CAN_FilterTypeDef can_filterconfig;
can_filterconfig.FilterMode = CAN_FILTERMODE_IDMASK;
can_filterconfig.FilterScale = CAN_FILTERSCALE_32BIT;
can_filterconfig.FilterIdHigh = 0;
can_filterconfig.FilterIdLow = 0;
can_filterconfig.FilterMaskIdHigh = 0;
can_filterconfig.FilterMaskIdLow = 0;
can_filterconfig.FilterBank = 0;
can_filterconfig.FilterFIFOAssignment = CAN_FilterFIFO0;
can_filterconfig.FilterActivation = CAN_FILTER_ENABLE;
can_filterconfig.SlaveStartFilterBank = 14;
HAL_CAN_ConfigFilter(&hcan, &can_filterconfig);
HAL_CAN_Start(&hcan);
/* USER CODE END CAN_Init 2 */
}
發(fā)送和接收
uint8_t can_send_message(CAN_TxHeaderTypeDef TxHeader,uint32_t std_id, uint8_t aData[],uint16_t lengh)
{
uint32_t TxMailBox = CAN_TX_MAILBOX0;
uint8_t FreeTxMailBoxNum = 0;
TxHeader.StdId = std_id; //id由IDE決定類型
TxHeader.ExtId = 0;
TxHeader.DLC = lengh; //數(shù)據(jù)長(zhǎng)度
TxHeader.IDE = CAN_ID_STD; //標(biāo)準(zhǔn)幀/擴(kuò)展幀
TxHeader.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
TxHeader.TransmitGlobalTime = DISABLE;
while(0 == FreeTxMailBoxNum)
{
FreeTxMailBoxNum = HAL_CAN_GetTxMailboxesFreeLevel(&hcan);
}
if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, aData, &TxMailBox) != HAL_OK)
{
/* Transmission request Error */
Error_Handler();
}
return 1;
}
uint8_t can_receive_message(uint8_t *buf)
{
if(HAL_CAN_GetRxFifoFillLevel(&hcan,CAN_RX_FIFO0) == 0)
return 0;
HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &canRxType, buf);
return canRxType.DLC;
}
中斷
四個(gè)中斷源分別對(duì)應(yīng)cube的四個(gè)選項(xiàng):
手動(dòng)中斷開啟函數(shù):文章來源:http://www.zghlxwxcb.cn/news/detail-594801.html
HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING);
中斷回調(diào)函數(shù):文章來源地址http://www.zghlxwxcb.cn/news/detail-594801.html
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if(hcan->Instance == CAN1)
{
HAL_CAN_GetRxMessage(&hcan, CAN_FILTER_FIFO0,&canRxType,canRxbuf);
}
}
到了這里,關(guān)于【通訊協(xié)議備忘錄】stm32的CAN外設(shè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!