CAN通信詳細介紹
CAN( Area )通信是一種串行總線技術,被廣泛應用在車載電子、工業自動化、醫療設備、家庭自動化等領域。
CAN通信網絡由一組相互聯系的節點組成,每個節點可以接收和發送數據。所有節點共享一條總線進行數據傳輸,并通過唯一的編號(稱為幀ID)來識別數據幀。
CAN通信的特點是具有高度的容錯性和高效率。它可以支持多種不同的設備和應用程序,并且能夠在具有高干擾水平的環境中正常工作。
CAN通信使用兩種類型的幀來傳輸數據:數據幀和遠程幀。數據幀用于在節點之間傳輸數據,遠程幀用于請求其他節點發送特定的數據。
在STM32的HAL庫下,可以用如下的代碼初始化CAN通信。
/**
* @brief CAN篩選器
*/
HAL_StatusTypeDef Can_Filter_Init(void)
{
/*** CAN1 ***/

CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterActivation = ENABLE; // 激活過濾器
sFilterConfig.FilterBank = 0; // 配置主CAN篩選器組編號
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 配置工作模式為列表模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; // 配置篩選器的尺度為16位長
sFilterConfig.FilterIdHigh = 0x0000; // CAN_FxR1寄存器
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000; // CAN_FxR2寄存器
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; // 篩選器接篩選報文關聯到FIFO0

if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK) { // 配置CAN1接收篩選過濾器
Error_Handler();
}
if (HAL_CAN_Start(&hcan1) != HAL_OK) { // 開啟CAN1
Error_Handler();
}
if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { // 開啟CAN1的FIFO0接收中斷
Error_Handler();
}

// if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK) { // 開啟CAN1的FIFO1接收中斷
// Error_Handler();
// }
對于STM32的第二個CAN,也采用同樣的配置方式。但注意CAN2的.和.必須選擇有效的ip篩選器列表,即CAN過濾器組編號和CAN2的起始過濾器與上面的不同。
/*** CAN2 ***/
CAN_FilterTypeDef sFilterConfig2;
sFilterConfig2.FilterActivation = ENABLE;
sFilterConfig2.FilterBank = 0;
sFilterConfig2.FilterMode = CAN_FILTERMODE_IDMASK;

sFilterConfig2.FilterScale = CAN_FILTERSCALE_16BIT;
sFilterConfig2.FilterIdHigh = 0x0000;
sFilterConfig2.FilterIdLow = 0x0000;
sFilterConfig2.FilterMaskIdHigh = 0x0000;
sFilterConfig2.FilterMaskIdLow = 0x0000;
sFilterConfig2.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig2.FilterBank = 14; // 設置從CAN過濾器組編號
sFilterConfig2.SlaveStartFilterBank = 14; // 設置CAN2的起始過濾器組
if (HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig2) != HAL_OK) {

Error_Handler();
}
if (HAL_CAN_Start(&hcan2) != HAL_OK) { // 開啟CAN2
Error_Handler();
}
if (HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { // 開啟CAN2的FIFO0接收中斷
Error_Handler();
}
return HAL_OK;
}
CAN通信網絡還支持多種高級功能,如網絡管理、錯誤檢測和糾正等。它還具有自適應性必須選擇有效的ip篩選器列表,可以根據網絡中的負載和性能需求自動調整通信速率。