日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

can硬件滤波 stm32cubemx_STM32CubeMX系列教程12:控制器局域网络(CAN)

發(fā)布時間:2025/3/19 编程问答 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 can硬件滤波 stm32cubemx_STM32CubeMX系列教程12:控制器局域网络(CAN) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一.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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。