0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CAN電氣特性屬性

智能汽車電子與軟件 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 2023-10-09 16:10 ? 次閱讀

CAN 電氣屬性

CAN 總線使用兩根線來連接各個單元:CAN_H 和 CAN_L,CAN 控制器通過判斷這兩根線上的電位差來得到總線電平,CAN總線電平分為顯性電平和隱性電平兩種。

顯性電平表示邏輯“0”,此時 CAN_H 電平比 CAN_L 高,分別為 3.5V 和 1.5V,電位差為2V。隱形電平表示邏輯“1”,此時 CAN_H 和 CAN_L 電壓都為 2.5V 左右,電位差為 0V。CAN總線就通過顯性和隱形電平的變化來將具體的數(shù)據(jù)發(fā)送出去,如圖所示:

27e69f9e-6676-11ee-939d-92fbcf53809c.png

CAN 總線上沒有節(jié)點傳輸數(shù)據(jù)的時候一直處于隱性狀態(tài),也就是說總線空閑狀態(tài)的時候一直處于隱性。CAN 網(wǎng)絡(luò)中的所有單元都通過 CAN_H 和CAN_L 這兩根線連接在一起,如圖所示:

27f49568-6676-11ee-939d-92fbcf53809c.png

途中所有的 CAN 節(jié)點單元都采用 CAN_H 和 CAN_L 這兩根線連接在一起,CAN_H 接CAN_H、CAN_L 接 CAN_L,CAN總線兩端要各接一個 120Ω的端接電阻,用于匹配總線阻抗,吸收信號反射及回撥,提高數(shù)據(jù)通信的抗干擾能力以及可靠性。

CAN 總線傳輸速度可達 1Mbps/S,最新的 CAN-FD 最高速度可達 5Mbps/S,甚至更高,感興趣的可以自行查閱相關(guān)資料。CAN傳輸速度和總線距離有關(guān),總線距離越短,傳輸速度越快。

uint32_tFilterScale;/*設(shè)置篩選器的尺度*/
uint32_tFilterActivation;/*是否使能本篩選器*/
uint32_tSlaveStartFilterBank;
}CAN_FilterTypeDef;

這些結(jié)構(gòu)體成員都是“41.2.14 驗收篩選器”小節(jié)介紹的內(nèi)容,可對比閱讀,各個結(jié)構(gòu)體成員的介紹如下:

(1) FilterIdHigh

FilterIdHigh 成員用于存儲要篩選的 ID,若篩選器工作在 32 位模式,它存儲的是所篩選 ID 的高 16 位;若篩選器工作在 16 位模式,它存儲的就是一個完整的要篩選的 ID。

(2) FilterIdLow

類似地,F(xiàn)ilterIdLow 成員也是用于存儲要篩選的 ID,若篩選器工作在 32 位模式,它存儲的是所篩選 ID 的低 16 位;若篩選器工作在 16 位模式,它存儲的就是一個完整的要篩選的 ID。

(3) FilterMaskIdHigh

FilterMaskIdHigh 存儲的內(nèi)容分兩種情況,當(dāng)篩選器工作在標(biāo)識符列表模式時,它的功能與 FilterIdHigh 相同,都是存儲要篩選的 ID;而當(dāng)篩選器工作在掩碼模式時,它存儲的是 FilterIdHigh 成員對應(yīng)的掩碼,與 FilterIdLow 組成一組篩選器。

(4) FilterMaskIdLow

類似地, FilterMaskIdLow 存儲的內(nèi)容也分兩種情況,當(dāng)篩選器工作在標(biāo)識符列表模式時,它的功能與 FilterIdLow 相同,都是存儲要篩選的 ID;而當(dāng)篩選器工作在掩碼模式時,它存儲的是 FilterIdLow 成員對應(yīng)的掩碼,與 FilterIdLow 組成一組篩選器。上面四個結(jié)構(gòu)體的存儲的內(nèi)容很容易讓人糊涂,請結(jié)合前面的圖 39_0_15 和下面的表 39?7 理解,如果還搞不清楚,再結(jié)合庫函數(shù) FilterInit 的源碼來分析。

表不同模式下各結(jié)構(gòu)體成員的內(nèi)容

2803dc58-6676-11ee-939d-92fbcf53809c.png

對這些結(jié)構(gòu)體成員賦值的時候,還要注意寄存器位的映射,即注意哪部分代表 STID,哪部分代表 EXID 以及 IDE、RTR 位。

(5) FilterFIFOAssignment

本成員用于設(shè)置當(dāng)報文通過篩選器的匹配后,該報文會被存儲到哪一個接收 FIFO,它的可選值為 FIFO0 或 FIFO1(宏 CAN_FILTER_FIFO0/1)。

(6) FilterBank

本成員用于設(shè)置篩選器的編號,即本過濾器結(jié)構(gòu)體配置的是哪一組篩選器,CAN 一共有 28 個篩選器,所以它的可輸入參數(shù)范圍為 0-27。

(7) FilterMode

本 成 員 用 于 設(shè) 置 篩 選 器 的 工 作 模 式, 可 以 設(shè) 置 為 列 表 模 式 (宏CAN_FILTERMODE_IDLIST) 及掩碼模式 (宏 CAN_FILTERMODE_IDMASK)。

(8) FilterScale

本成員用于設(shè)置篩選器的尺度,可以設(shè)置為 32 位長 (宏 CAN_FILTERSCALE_32BIT)及 16 位長 (宏 CAN_FILTERSCALE_16BIT)。

(9) FilterActivation

本成員用于設(shè)置是否激活這個篩選器 (宏 ENABLE/DISABLE)。

三、CAN Cubemx配置

我們通過問題來熟悉下cubemx配置,你熟悉了這些問題基本就知道怎么配置了!

問題:Parameter Settings分別都是設(shè)置什么的?答案:如圖

28105eba-6676-11ee-939d-92fbcf53809c.png

問題:怎么配置波特率呢?

答案:用我上面貼的工具(CAN波特率計算 f103AHP1_36M f407AHP1_42M 采樣點軟件有說明.rar)直接配置,舉兩個個例子

例子1:我們要配置成500KHz,那么我們這樣配置

2862349c-6676-11ee-939d-92fbcf53809c.png287ad52e-6676-11ee-939d-92fbcf53809c.png

我們用采集點為80%,所以BS1為4tq,BS2為2tq,分頻系數(shù)為12,代進公式Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)=42M/(4+2+1)/12=500kHz

例子2:我們要配置成1M Hz,那么我們這樣配置

288a4bbc-6676-11ee-939d-92fbcf53809c.png

我們用采集點為75%,所以BS1為3tq,BS2為2tq,分頻系數(shù)為7,代進公式Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)=42M/(3+2+1)/7=1MHz

2895733e-6676-11ee-939d-92fbcf53809c.png

問題:Basic Parameter分別是啥意思呢?

28a20ab8-6676-11ee-939d-92fbcf53809c.png

Timer Triggered Communication Mode:否使用時間觸發(fā)功能 (ENABLE/DISABLE),時間觸發(fā)功能在某些CAN 標(biāo)準(zhǔn)中會使用到。

Automatic Bus-Off Management:用于設(shè)置是否使用自動離線管理功能 (ENABLE/DISABLE),使用自動離線管理可以在出錯時離線后適時自動恢復(fù),不需要軟件干預(yù)。

Automatic Wake-Up Mode:用于設(shè)置是否使用自動喚醒功能 (ENABLE/DISABLE),使能自動喚醒功能后它會在監(jiān)測到總線活動后自動喚醒。

Automatic Retransmission:用于設(shè)置是否使用自動重傳功能 (ENABLE/DISABLE),使用自動重傳功能時,會一直發(fā)送報文直到成功為止。

Receive Fifo Locked Mode:用于設(shè)置是否使用鎖定接收 FIFO(ENABLE/DISABLE),鎖定接收 FIFO 后,若FIFO 溢出時會丟棄新數(shù)據(jù),否則在 FIFO 溢出時以新數(shù)據(jù)覆蓋舊數(shù)據(jù)。

Transmit Fifo Priority:用于設(shè)置發(fā)送報文的優(yōu)先級判定方法 (ENABLE/DISABLE),使能時,以報文存入發(fā)送郵箱的先后順序來發(fā)送,否則按照報文 ID 的優(yōu)先級來發(fā)送。配置完這些結(jié)構(gòu)體成員后,我們調(diào)用庫函數(shù) HAL_CAN_Init 即可把這些參數(shù)寫入到 CAN 控制寄存器中,實現(xiàn) CAN 的初始化

問題:為啥CAN分為RX0,RX1中斷呢?

28aeec1a-6676-11ee-939d-92fbcf53809c.png

答案:STM32有2個3級深度的接收緩沖區(qū):FIFO0和FIFO1,每個FIFO都可以存放3個完整的報文,它們完全由硬件來管理。如果是來自FIFO0的接收中斷,則用CAN1_RX0_IRQn中斷來處理。如果是來自FIFO1的接收中斷,則用CAN1_RX1_IRQn中斷來處理,如圖:28bb64a4-6676-11ee-939d-92fbcf53809c.png

問題:CAN SCE中斷時什么?

28dcc6da-6676-11ee-939d-92fbcf53809c.png

答案:status chanege error,錯誤和狀態(tài)變化中斷!

四、CAN分析工具的使用

下面我們會用到CAN分析工具,還是比較好用的,此部分使用作為自己使用

https://www.zhcxgd.com/h-col-112.html

五、實驗

1.Normal模式測試500K 波特率(定時發(fā)送,輪詢接收)

1.1 CubeMx配置

28ed1b16-6676-11ee-939d-92fbcf53809c.png28febb1e-6676-11ee-939d-92fbcf53809c.png

1.2 設(shè)置Filter過濾,我們只使能FIFO0,并且不過濾任何消息

uint8_tbsp_can1_filter_config(void)
{
CAN_FilterTypeDeffilter={0};
filter.FilterActivation=ENABLE;
filter.FilterMode=CAN_FILTERMODE_IDMASK;
filter.FilterScale=CAN_FILTERSCALE_32BIT;
filter.FilterBank=0;
filter.FilterFIFOAssignment=CAN_FILTER_FIFO0;
filter.FilterIdLow=0;
filter.FilterIdHigh=0;
filter.FilterMaskIdLow=0;
filter.FilterMaskIdHigh=0;
HAL_CAN_ConfigFilter(&hcan1,&filter);
returnBSP_CAN_OK;
}

1.3 開啟CAN(注意,默認Cubemx生成的代碼并沒有can start)

HAL_CAN_Start(&hcan1);

1.4 編寫發(fā)送函數(shù)

我們開出了幾個參數(shù),id_type是擴展幀還是標(biāo)準(zhǔn)幀,basic_id標(biāo)準(zhǔn)幀ID(在標(biāo)準(zhǔn)幀中有效),ex_id擴展幀ID(在擴展幀中有效),data要發(fā)送的數(shù)據(jù),data_len要發(fā)送的數(shù)據(jù)長度

uint8_tbsp_can1_send_msg(uint32_tid_type,uint32_tbasic_id,uint32_tex_id,uint8_t*data,uint32_tdata_len)
{
uint8_tindex=0;
uint32_t*msg_box;
uint8_tsend_buf[8]={0};
CAN_TxHeaderTypeDefsend_msg_hdr;
send_msg_hdr.StdId=basic_id;
send_msg_hdr.ExtId=ex_id;
send_msg_hdr.IDE=id_type;
send_msg_hdr.RTR=CAN_RTR_DATA;
send_msg_hdr.DLC=data_len;
send_msg_hdr.TransmitGlobalTime=DISABLE;
for(index=0;indexreturnBSP_CAN_OK;
}

我們在main函數(shù)中1s發(fā)送一幀,標(biāo)準(zhǔn)幀跟擴展幀交叉調(diào)用,代碼如下:

send_data[0]++;
send_data[1]++;
send_data[2]++;
send_data[3]++;
send_data[4]++;
send_data[5]++;
send_data[6]++;
send_data[7]++;
if(id_type_std==1)
{
bsp_can1_send_msg(CAN_ID_STD,1,2,send_data,8);
id_type_std=0;
}
else
{
bsp_can1_send_msg(CAN_ID_EXT,1,2,send_data,8);
id_type_std=1;
}
HAL_Delay(1000);

我們通過CAN協(xié)議分析儀來抓下結(jié)果

290c3334-6676-11ee-939d-92fbcf53809c.png

1.5 編寫輪詢接收函數(shù)

uint8_tbsp_can1_polling_recv_msg(uint32_t*basic_id,uint32_t*ex_id,uint8_t*data,uint32_t*data_len)
{
uint8_tindex=0;
uint8_trecv_data[8];
CAN_RxHeaderTypeDefheader;

while(HAL_CAN_GetRxFifoFillLevel(&hcan1,CAN_RX_FIFO0)!=0)
{
if(__HAL_CAN_GET_FLAG(&hcan1,CAN_FLAG_FOV0)!=RESET)
printf("[CAN]FIFO0overrun!
");

HAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&header,recv_data);
if(header.IDE==CAN_ID_STD)
{
printf("StdIdID:%d
",header.StdId);
}
else
{
printf("ExtIdID:%d
",header.ExtId);
}
printf("CANIDE:0x%x
",header.IDE);
printf("CANRTR:0x%x
",header.RTR);
printf("CANDLC:0x%x
",header.DLC);
printf("RECVDATA:");
for(index=0;indexprintf("0x%x",recv_data[index]);
}
printf("
");
}
}

實驗一總結(jié):

1.沒用調(diào)用HAL_CAN_Start(&hcan1);使能CAN

2.沒有編寫Filter函數(shù),我開始自認為不設(shè)置就默認不過濾,現(xiàn)在看來是我想多了,其實想想也合理,你如果不過濾分配FIFO,STM32怎么決定把收到的放到哪個FIFO中

待提升:

1.目前只用到FIFO0,待把FIFO1使用起來2.Normal模式測試500K 波特率(定時發(fā)送,中斷接收)

2.1 CubeMx配置

291b00f8-6676-11ee-939d-92fbcf53809c.png292c78ce-6676-11ee-939d-92fbcf53809c.png

步驟2,3,4跟polling完全一致,我們來直接說下中斷怎么用(主要是使能notifity就行了)

staticvoidMX_CAN1_Init(void)
{
/*USERCODEBEGINCAN1_Init0*/
/*USERCODEENDCAN1_Init0*/
/*USERCODEBEGINCAN1_Init1*/
/*USERCODEENDCAN1_Init1*/
hcan1.Instance=CAN1;
hcan1.Init.Prescaler=12;
hcan1.Init.Mode=CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth=CAN_SJW_1TQ;
hcan1.Init.TimeSeg1=CAN_BS1_4TQ;
hcan1.Init.TimeSeg2=CAN_BS2_2TQ;
hcan1.Init.TimeTriggeredMode=DISABLE;
hcan1.Init.AutoBusOff=ENABLE;
hcan1.Init.AutoWakeUp=ENABLE;
hcan1.Init.AutoRetransmission=DISABLE;
hcan1.Init.ReceiveFifoLocked=DISABLE;
hcan1.Init.TransmitFifoPriority=DISABLE;
if(HAL_CAN_Init(&hcan1)!=HAL_OK)
{
Error_Handler();
}
/*USERCODEBEGINCAN1_Init2*/
bsp_can1_filter_config();
HAL_CAN_Start(&hcan1);
HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);
/*USERCODEENDCAN1_Init2*/
}

下面我們來編寫下中斷函數(shù)


														

voidHAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef*hcan) { uint8_tindex=0; uint8_trecv_data[8]; CAN_RxHeaderTypeDefheader; HAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&header,recv_data); if(header.IDE==CAN_ID_STD) { printf("StdIdID:%d ",header.StdId); } else { printf("ExtIdID:%d ",header.ExtId); } printf("CANIDE:0x%x ",header.IDE); printf("CANRTR:0x%x ",header.RTR); printf("CANDLC:0x%x ",header.DLC); printf("RECVDATA:"); for(index=0;indexprintf("0x%x",recv_data[index]); } printf(" ");


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • CAN
    CAN
    +關(guān)注

    關(guān)注

    57

    文章

    2663

    瀏覽量

    462433
  • 電氣
    +關(guān)注

    關(guān)注

    18

    文章

    1131

    瀏覽量

    52659
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2817

    瀏覽量

    87698

原文標(biāo)題:CAN電氣特性屬性

文章出處:【微信號:智能汽車電子與軟件,微信公眾號:智能汽車電子與軟件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    CAN網(wǎng)絡(luò)的特性阻抗及終端阻抗

    首先CAN網(wǎng)絡(luò)里用到傳輸線,線材的特性阻抗為120歐姆。關(guān)于這跟線下面的問題來討論,另外要說明的是在CAN網(wǎng)絡(luò)里的設(shè)備,即CAN收發(fā)器,這種器件的輸出阻抗很低,輸入阻抗是比較高的
    發(fā)表于 04-27 10:24 ?5141次閱讀
    <b class='flag-5'>CAN</b>網(wǎng)絡(luò)的<b class='flag-5'>特性</b>阻抗及終端阻抗

    USB的電氣特性

    USB電氣特性(縮寫)  USB技術(shù)       
    發(fā)表于 06-17 10:34

    光伏測量: 太陽能電池的電氣特性測試

    本書將簡述太陽能電池的電氣測量,集中討論太陽光電池的屬性和如何進行IV參數(shù)的測試,以及對在選擇太陽能半導(dǎo)體,材料時,如何用IV/CV的方法來研究材料的特性。•太陽能電池的效率
    發(fā)表于 04-07 14:34

    什么是CAN總線?CAN有哪些特性?

    什么是CAN總線?CAN總線是如何發(fā)展的?CAN總線是如何工作的?CAN有哪些特性?Philips制造的
    發(fā)表于 05-20 06:16

    CAN總線物理結(jié)構(gòu)與特性

    產(chǎn)品的開發(fā),CAN總線的穩(wěn)定性是毋庸置疑的。CAN總線物理結(jié)構(gòu)與特性CAN總線網(wǎng)絡(luò)CAN總線網(wǎng)絡(luò)主要掛在
    發(fā)表于 07-27 07:40

    CAN總線具有哪些特性參數(shù)應(yīng)用?

    CAN總線具有哪些特性參數(shù)應(yīng)用?
    發(fā)表于 10-11 06:31

    樹莓派的GPIO口有哪些電氣特性

    GPIO口是如何去定義的?樹莓派的GPIO口有哪些電氣特性
    發(fā)表于 11-08 07:30

    NUC1XX+電氣特性

    NUC1XX+電氣特性
    發(fā)表于 10-13 14:40 ?5次下載
    NUC1XX+<b class='flag-5'>電氣</b><b class='flag-5'>特性</b>

    CAN網(wǎng)絡(luò)-其特性阻抗及終端阻抗

    CAN網(wǎng)絡(luò)阻抗 問題的開始是由CAN網(wǎng)絡(luò)開始的,如下圖是一個CAN的網(wǎng)絡(luò)的基本模型,兩端是120歐姆的電阻, can網(wǎng)絡(luò)用的線材的特性阻抗是
    發(fā)表于 12-07 11:27 ?845次閱讀
     <b class='flag-5'>CAN</b>網(wǎng)絡(luò)-其<b class='flag-5'>特性</b>阻抗及終端阻抗

    CAN無線通訊模塊的特性及作用

    can無線通訊模塊泛指各種能夠進行無線通訊的CAN轉(zhuǎn)換網(wǎng)關(guān),常見的有CAN轉(zhuǎn)WiFi網(wǎng)關(guān),CAN轉(zhuǎn)4G網(wǎng)關(guān)以及CAN轉(zhuǎn)藍牙網(wǎng)關(guān)等等。那么,什
    的頭像 發(fā)表于 03-16 13:33 ?4455次閱讀

    CAN電氣特性屬性

    CAN 電氣屬性 CAN 總線使用兩根線來連接各個單元:CAN_H 和 CAN_L,
    的頭像 發(fā)表于 07-25 10:30 ?970次閱讀
    <b class='flag-5'>CAN</b><b class='flag-5'>電氣</b><b class='flag-5'>特性</b><b class='flag-5'>屬性</b>

    AN13423:使用CAN2CAN CAN2ETH ETH2CAN LLCE S32G應(yīng)用注意的特性

    電子發(fā)燒友網(wǎng)站提供《AN13423:使用CAN2CAN CAN2ETH ETH2CAN LLCE S32G應(yīng)用注意的特性.pdf》資料免費下載
    發(fā)表于 08-16 18:23 ?9次下載
    AN13423:使用<b class='flag-5'>CAN2CAN</b> <b class='flag-5'>CAN</b>2ETH ETH2<b class='flag-5'>CAN</b> LLCE S32G應(yīng)用注意的<b class='flag-5'>特性</b>

    基于ARM和CAN總線的電氣信號采集節(jié)點的設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于ARM和CAN總線的電氣信號采集節(jié)點的設(shè)計.pdf》資料免費下載
    發(fā)表于 10-13 11:31 ?1次下載
    基于ARM和<b class='flag-5'>CAN</b>總線的<b class='flag-5'>電氣</b>信號采集節(jié)點的設(shè)計

    高速CAN總線和低速CAN總線的特性

    高速CAN總線和低速CAN總線的特性 高速CAN總線和低速CAN總線是兩種常見的CAN總線類型。
    的頭像 發(fā)表于 01-31 14:09 ?2127次閱讀

    什么是CAN總線協(xié)議?它有哪些特性和應(yīng)用?

    、實時性強、抗干擾能力強等優(yōu)點,逐漸發(fā)展成為現(xiàn)代工業(yè)通信的重要標(biāo)準(zhǔn)之一。本文將對CAN總線協(xié)議的基本概念、特性、工作原理、應(yīng)用領(lǐng)域等方面進行詳細介紹。
    的頭像 發(fā)表于 05-27 16:32 ?824次閱讀