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