can硬件滤波 stm32cubemx_STM32CubeMX系列教程12:控制器局域网络(CAN)
一.CAN簡(jiǎn)介
CAN是控制器局域網(wǎng)絡(luò)(Controller Area Network, CAN)的簡(jiǎn)稱,是由以研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國(guó)BOSCH公司開(kāi)發(fā)的,是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。
CAN控制器通過(guò)組成總線的2根線(CAN-H和CAN-L)的電位差來(lái)確定總線的電平,信號(hào)是以兩線之間的“差分”電壓形式出現(xiàn),總線電平分為顯性電平和隱性電平。
CAN總線采用兩種互補(bǔ)的邏輯數(shù)值"顯性"和"隱性"。"顯性"數(shù)值表示邏輯"0",而"隱性"表示邏輯"1"。當(dāng)總線上同時(shí)出現(xiàn)“顯性”位和“隱性”位時(shí),最終呈現(xiàn)在總線上的是“顯性”位。
在“隱性”狀態(tài)下,VCAN_H和VCAN_L被固定與平均電壓電平,Vdiff近似為零,此時(shí)VCAN_H和VCAN_L的標(biāo)稱值為2.5V。
“顯性”位以大于最小閥值的差分電壓表示,此時(shí)VCAN_H的標(biāo)稱值為3.5V,VCAN_L的標(biāo)稱值為1.5V。
本實(shí)驗(yàn)采用SN65HVD230芯片作為CAN收發(fā)器,其邏輯電路圖以及管腳圖如下。D為CAN發(fā)送,R為CAN 接收。CAN-H,CAN-L為CAN總線。CAN收發(fā)器即將TTL電平轉(zhuǎn)換為CAN總線電平。
??
在總線空閑時(shí),所有的單元都可開(kāi)始發(fā)送消息(多主控制)。所有的消息都以固定的格式發(fā)送。
二.CAN幀結(jié)構(gòu)
報(bào)文傳輸由以下4個(gè)不同的幀類型所表示和控制:
數(shù)據(jù)幀:數(shù)據(jù)幀攜帶數(shù)據(jù)從發(fā)送器至接收器。
遠(yuǎn)程幀:總線單元發(fā)出遠(yuǎn)程幀,請(qǐng)求發(fā)送具有同一識(shí)別符的數(shù)據(jù)幀。
錯(cuò)誤幀:任何單元檢測(cè)到一總線錯(cuò)誤就發(fā)出錯(cuò)誤幀。
幀間空 :數(shù)據(jù)幀(或遠(yuǎn)程幀)通過(guò)幀間空間與前述的各幀分開(kāi)。
過(guò)載幀:過(guò)載幀用以在先行的和后續(xù)的數(shù)據(jù)幀(或遠(yuǎn)程幀)之間提供一附加的延時(shí)。
1.數(shù)據(jù)幀
數(shù)據(jù)幀由7個(gè)不同的域組成。
(1)幀開(kāi)始(Start?of?Frame)
這個(gè)域表示數(shù)據(jù)幀的開(kāi)始。僅由一個(gè)“顯性”位組成.
(2)仲裁域(Arbitration?Frame)
這個(gè)域表示一個(gè)幀的優(yōu)先級(jí),仲裁場(chǎng)由標(biāo)識(shí)符和遠(yuǎn)程發(fā)送請(qǐng)求位(RTR位)組成。RTR位在數(shù)據(jù)幀中為顯性,在遠(yuǎn)程幀中為隱性。
IDE的全稱是“識(shí)別符擴(kuò)展位(Identifier?Extension?Bit)”,對(duì)于擴(kuò)展格式,IDE位屬于仲裁場(chǎng);對(duì)于標(biāo)準(zhǔn)格式,IDE位屬于控制場(chǎng)。標(biāo)準(zhǔn)格式的IDE位為“顯性”,而擴(kuò)展格式的IDE位為“隱性”。
(3)控制域(Control?Frame):
這個(gè)域表示保留位和數(shù)據(jù)幀長(zhǎng)度代碼(DLC),控制場(chǎng)由6個(gè)位組成,標(biāo)準(zhǔn)格式和擴(kuò)展格式的控制場(chǎng)格式不同。標(biāo)準(zhǔn)格式里的幀包括數(shù)據(jù)長(zhǎng)度代碼、IDE位及保留位r0。擴(kuò)展格式里的幀包括數(shù)據(jù)長(zhǎng)度代碼和兩個(gè)保留位:r1和r0。
(4)數(shù)據(jù)域(Data?Frame):
這是數(shù)據(jù)內(nèi)容,0~8個(gè)字節(jié)的數(shù)據(jù)能被發(fā)送,首先發(fā)送最高有效位。
(5)CRC域(CRC?Frame):
這個(gè)域用于檢查幀的傳輸錯(cuò)誤。
(6)ACK域(CRC?Frame):
是對(duì)幀已經(jīng)被正常接收的一個(gè)證實(shí)。應(yīng)答場(chǎng)長(zhǎng)度為2個(gè)位,包含應(yīng)答間隙(ACK?Slot)和應(yīng)答界定符(ACK?Delimiter)
(7)幀結(jié)束(End?of?Frame):
指示數(shù)據(jù)幀結(jié)束,這個(gè)標(biāo)志序列由7個(gè)“隱性”位組成
2.遠(yuǎn)程幀
作為接收器的節(jié)點(diǎn),可以通過(guò)向相應(yīng)的數(shù)據(jù)源節(jié)點(diǎn)發(fā)送遠(yuǎn)程幀激活該源節(jié)點(diǎn),讓該源節(jié)點(diǎn)把數(shù)據(jù)發(fā)送給接收器。而且都由6個(gè)不同的位場(chǎng)組成:幀起始、仲裁場(chǎng)、控制場(chǎng)、CRC場(chǎng)、應(yīng)答場(chǎng)、幀結(jié)尾。與數(shù)據(jù)幀相反,遠(yuǎn)程幀的遠(yuǎn)程發(fā)送請(qǐng)求位(RTR)是“隱性”的。它沒(méi)有數(shù)據(jù)場(chǎng),數(shù)據(jù)長(zhǎng)度代碼DLC的數(shù)值可以是任意值。
3.錯(cuò)誤幀
錯(cuò)誤幀由兩個(gè)不同的場(chǎng)組成,
(1)?錯(cuò)誤標(biāo)志
主動(dòng)(Active)錯(cuò)誤標(biāo)志。它由6個(gè)連續(xù)顯性位組成。
被動(dòng)(Passive)錯(cuò)誤標(biāo)志。它由6個(gè)連續(xù)隱性位組成。
(2)錯(cuò)誤界定:錯(cuò)誤界定符由8個(gè)隱性位組成。
4.幀間空間
幀間隔是用于分隔數(shù)據(jù)幀和遙控幀的幀。數(shù)據(jù)幀和遙控幀可通過(guò)插入幀間隔將本幀與前面的任何幀(數(shù)據(jù)幀、遙控幀、錯(cuò)誤幀、過(guò)載幀)分開(kāi)。
過(guò)載幀和錯(cuò)誤幀前不能插入幀間隔。
5.過(guò)載幀
過(guò)載幀是用于接收單元通知其尚未完成接收準(zhǔn)備的幀。過(guò)載幀由過(guò)載標(biāo)志和過(guò)載界定符構(gòu)成。
(1)?過(guò)載標(biāo)志?6個(gè)位的顯性位。??過(guò)載標(biāo)志的構(gòu)成與主動(dòng)錯(cuò)誤標(biāo)志的構(gòu)成相同。
(2)?過(guò)載界定符?8個(gè)位的隱性位。??過(guò)載界定符的構(gòu)成與錯(cuò)誤界定符的構(gòu)成相同。
三. ?波特率
CAN控制器只需進(jìn)行少量設(shè)置就可以進(jìn)行通信,其中較難設(shè)置部分就是波特率計(jì)算。CAN總線的波特率是一個(gè)范圍。假如波特率為250KB/s,實(shí)際波特率可能為200~300KB/s.這樣使得CAN總線有很強(qiáng)大容錯(cuò)性。
CAN的底層協(xié)議里將CAN數(shù)據(jù)的每一位時(shí)間(TBit)分為許多時(shí)間段(Tscl),這些時(shí)間段包括:
A.?同步段(SYNC_SEG):位變化應(yīng)該在此時(shí)間段內(nèi)發(fā)生。只有一個(gè)時(shí)間片的固定長(zhǎng)度(1?x?tq)
B.?位段1(BS1):定義采樣點(diǎn)的位置。其持續(xù)長(zhǎng)度可以在?1?到?16?個(gè)時(shí)間片之間調(diào)整
C.?位段2(BS2):定義發(fā)送點(diǎn)的位置。其持續(xù)長(zhǎng)度可以在?1?到?8?個(gè)時(shí)間片之間調(diào)整
D.同步跳轉(zhuǎn)寬度(SJW):定義位段加長(zhǎng)或縮短的上限。它可以在?1?到?4?個(gè)時(shí)間片之間調(diào)整
這個(gè)結(jié)合STM32cubeMX軟件設(shè)置講解一下CAN的波特率設(shè)置。
上面設(shè)置分頻為Prescaler=9, BS1=5, BS2=6, SJW=1
CAN外接是接到APB1上面,設(shè)置系統(tǒng)時(shí)鐘為216MHz時(shí),APB1外設(shè)時(shí)鐘為54MHz.
經(jīng)過(guò)分頻后的頻率為54MHz / 9 =6MHz ?= ~ 166.666ns
CAN波特率為 54MHz / 9 / (SJW+BS1 +BS2 ) = 54MHz /9 /12 = 500KHz = 2000ns
四. 標(biāo)識(shí)符篩選
在CAN通信中接收到信息時(shí),接收器節(jié)點(diǎn)會(huì)根據(jù)標(biāo)識(shí)符的值來(lái)判斷信息是否需要,若不需要?jiǎng)t丟棄信息。
五.新建工程
復(fù)制串口printf的工程,修改文件夾名。擊STM32F746I.ioc打開(kāi)STM32cubeMX的工程文件重新配置,開(kāi)啟CAN1,CAN2,管腳配置如下。
CAN1,CNA2只需配置時(shí)間參數(shù),波特率為500KHz,其他為默認(rèn)不作修改。
生成報(bào)告以及代碼,編譯程序。在can.c文件中可以看到CAN初始化函數(shù)。在stm327xx_hal_can.h文件后面可以看到CAN操作函數(shù)。
在main.c文件前面添加變量,sFilterConfig為CAN濾波器結(jié)構(gòu)體變量,TxMessage,RxMessage分別存儲(chǔ)CAN發(fā)送和接收的消息。
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
CAN_FilterConfTypeDef sFilterConfig;
static CanTxMsgTypeDef TxMessage;
static CanRxMsgTypeDef RxMessage;
/* USER CODE END PV */
在main函數(shù)中,初始化發(fā)送消息郵箱,設(shè)置為標(biāo)準(zhǔn)數(shù)據(jù)幀,數(shù)據(jù)長(zhǎng)度為8個(gè)字節(jié),數(shù)據(jù)為“CAN Test"。設(shè)置濾波器。
/* USER CODE BEGIN 2 */
hcan2.pTxMsg = &TxMessage;
hcan1.pRxMsg = &RxMessage;
printf("**** This is CAN test program ****\r\n\r\n");
/*##-1- Configure CAN2 Transmission Massage #####################################*/
hcan2.pTxMsg->StdId = 0x123;
hcan2.pTxMsg->RTR = CAN_RTR_DATA;
hcan2.pTxMsg->IDE = CAN_ID_STD;
hcan2.pTxMsg->DLC = 8;
hcan2.pTxMsg->Data[0] = 'C';
hcan2.pTxMsg->Data[1] = 'A';
hcan2.pTxMsg->Data[2] = 'N';
hcan2.pTxMsg->Data[3] = ' ';
hcan2.pTxMsg->Data[4] = 'T';
hcan2.pTxMsg->Data[5] = 'e';
hcan2.pTxMsg->Data[6] = 's';
hcan2.pTxMsg->Data[7] = 't';
/*##-2- Configure the CAN1 Filter ###########################################*/
sFilterConfig.FilterNumber = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = 0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.BankNumber = 14;
HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);
/* USER CODE END 2 */
在while循環(huán)中添加應(yīng)用程序,CAN2發(fā)送信息給CAN1接收,正確接收到信息后打印輸出。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/*##-3- Start the CAN2 Transmission process #####################################*/
if(HAL_CAN_Transmit(&hcan2, 10) != HAL_OK)
{
/* Transmition Error */
Error_Handler();
}
if(HAL_CAN_GetState(&hcan2) != HAL_CAN_STATE_READY)
{
Error_Handler();
}
/*##-4- Start the CAN1 Reception process ########################################*/
if(HAL_CAN_Receive(&hcan1, CAN_FIFO0,10) != HAL_OK)
{
/* Reception Error */
Error_Handler();
}
if(HAL_CAN_GetState(&hcan1) != HAL_CAN_STATE_READY)
{
Error_Handler();
}
printf("StdId : %x\r\n",hcan1.pRxMsg->StdId);
printf("RxMsg : %s",hcan1.pRxMsg->Data);
printf("\r\n\r\n");
HAL_Delay(1000);
}
/* USER CODE END 3 */
編譯程序并下載到開(kāi)發(fā)板。將兩個(gè)?SN65HVD230?CAN?Board模塊分別連接到板上的?CAN1?和?CAN2?接口。?用杜邦線連接兩個(gè)?CAN?模塊(CANL?->?CANL,?CANH?->?CANH)。打開(kāi)串口調(diào)試助手,設(shè)置波特率為115200,按下復(fù)位串口助手上面會(huì)顯示如下信息。
總結(jié)
以上是生活随笔為你收集整理的can硬件滤波 stm32cubemx_STM32CubeMX系列教程12:控制器局域网络(CAN)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 带负荷测试要求二次最小电流_检修状态下二
- 下一篇: 万分之二用百分之怎么表示_万分之几用百分