CAN通信詳細(xì)介紹
CAN( Area )通信是一種串行總線(xiàn)技術(shù),被廣泛應(yīng)用在車(chē)載電子、工業(yè)自動(dòng)化、醫(yī)療設(shè)備、家庭自動(dòng)化等領(lǐng)域。
CAN通信網(wǎng)絡(luò)由一組相互聯(lián)系的節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)可以接收和發(fā)送數(shù)據(jù)。所有節(jié)點(diǎn)共享一條總線(xiàn)進(jìn)行數(shù)據(jù)傳輸,并通過(guò)唯一的編號(hào)(稱(chēng)為幀ID)來(lái)識(shí)別數(shù)據(jù)幀。
CAN通信的特點(diǎn)是具有高度的容錯(cuò)性和高效率。它可以支持多種不同的設(shè)備和應(yīng)用程序,并且能夠在具有高干擾水平的環(huán)境中正常工作。
CAN通信使用兩種類(lèi)型的幀來(lái)傳輸數(shù)據(jù):數(shù)據(jù)幀和遠(yuǎn)程幀。數(shù)據(jù)幀用于在節(jié)點(diǎn)之間傳輸數(shù)據(jù),遠(yuǎn)程幀用于請(qǐng)求其他節(jié)點(diǎn)發(fā)送特定的數(shù)據(jù)。
在STM32的HAL庫(kù)下,可以用如下的代碼初始化CAN通信。
/**
* @brief CAN篩選器
*/
HAL_StatusTypeDef Can_Filter_Init(void)
{
/*** CAN1 ***/

CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterActivation = ENABLE; // 激活過(guò)濾器
sFilterConfig.FilterBank = 0; // 配置主CAN篩選器組編號(hào)
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 配置工作模式為列表模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; // 配置篩選器的尺度為16位長(zhǎng)
sFilterConfig.FilterIdHigh = 0x0000; // CAN_FxR1寄存器
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000; // CAN_FxR2寄存器
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; // 篩選器接篩選報(bào)文關(guān)聯(lián)到FIFO0

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

// if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK) { // 開(kāi)啟CAN1的FIFO1接收中斷
// Error_Handler();
// }
對(duì)于STM32的第二個(gè)CAN,也采用同樣的配置方式。但注意CAN2的.和.必須選擇有效的ip篩選器列表,即CAN過(guò)濾器組編號(hào)和CAN2的起始過(guò)濾器與上面的不同。
/*** 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; // 設(shè)置從CAN過(guò)濾器組編號(hào)
sFilterConfig2.SlaveStartFilterBank = 14; // 設(shè)置CAN2的起始過(guò)濾器組
if (HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig2) != HAL_OK) {

Error_Handler();
}
if (HAL_CAN_Start(&hcan2) != HAL_OK) { // 開(kāi)啟CAN2
Error_Handler();
}
if (HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { // 開(kāi)啟CAN2的FIFO0接收中斷
Error_Handler();
}
return HAL_OK;
}
CAN通信網(wǎng)絡(luò)還支持多種高級(jí)功能,如網(wǎng)絡(luò)管理、錯(cuò)誤檢測(cè)和糾正等。它還具有自適應(yīng)性必須選擇有效的ip篩選器列表,可以根據(jù)網(wǎng)絡(luò)中的負(fù)載和性能需求自動(dòng)調(diào)整通信速率。
友情鏈接: 餐飲加盟
地址:北京市海淀區(qū) 電話(huà):010- 郵箱:@126.com
備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有