新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM8 CAN總線的IdMask模式的講解

STM8 CAN總線的IdMask模式的講解

作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò) 收藏
前言

在CAN協(xié)議里,報(bào)文的標(biāo)識(shí)符不代表節(jié)點(diǎn)的地址,而是跟報(bào)文的內(nèi)容相關(guān)的。因此,發(fā)送者以廣播的形式把報(bào)文發(fā)送給所有的接收者。節(jié)點(diǎn)在接收?qǐng)?bào)文時(shí)根據(jù)標(biāo)識(shí)符的值決定軟件是否需要該報(bào)文;如果需要,就拷貝到RAM里;如果不需要,報(bào)文就被丟棄且無(wú)需軟件的干預(yù)。為滿足這一需求,BeCAN為應(yīng)用程序提供了個(gè)可配置的、位寬可變的6個(gè)(0-5)過(guò)濾器組,用于只接收那些軟件需要的報(bào)文。硬件過(guò)濾的做法節(jié)省了CPU開(kāi)銷,否則就必須由軟件進(jìn)行過(guò)濾,從而占用一定的CPU資源。

本文引用地址:http://m.butianyuan.cn/article/201611/316128.htm


一、IdMask模式
首先,需要明白IdMask的作用:
舉個(gè)例子吧,過(guò)濾器長(zhǎng)度為32位,模式為屏蔽模式,假如我要發(fā)送的標(biāo)示符為0x1314;那過(guò)濾器設(shè)置如下
1、過(guò)濾器完全無(wú)效 接收到的標(biāo)示符全部通過(guò)
0x1314 二進(jìn)制碼: 00000000 0000 0000 0001 0011 0001 0100
CAN_Filter xxxx xxxx xxxx xxxx xxxx xxxxxxxx xxxx
CAN_FilterMask 0000 0000 0000 0000 00000000 0000 0000
因?yàn)?CAN_FilterMask屏蔽寄存器所有位都是0 ,對(duì)應(yīng)標(biāo)識(shí)符全為“不關(guān)心”,也就是接收到數(shù)據(jù)的ID(標(biāo)識(shí)符)不用與 CAN_Filter寄存器的任何一位進(jìn)行匹配。
2、過(guò)濾器完全有效 接收到的標(biāo)識(shí)符要跟據(jù)CAN_FilterMask寄存器指定需要匹配的位進(jìn)行與CAN_Filter比較。
部分匹配 :
0x1314 二進(jìn)制碼: 00000000 0000 0000 0001 0011 0001 0100
CAN_Filter xxxx xxxx xxxx xxxx xxxx xxx1 xxxx xxxx
CAN_FilterMask 0000 0000 0000 0000 0000 0001 0000 0000
CAN_FilterMask 寄存器指定接收到的標(biāo)示符要與第8位進(jìn)行匹配,其他位不管。也就是說(shuō)接收到的標(biāo)示符第8位必須為1,否則報(bào)文就會(huì)被丟棄。

全部匹配:
0x1314 二進(jìn)制碼: 00000000 0000 0000 0001 0011 0001 0100
CAN_Filter 0000 0000 0000 0000 0000 0011 0001 0100
CAN_FilterMask 1111 1111 1111 1111 1111 1111 1111 1111
這種情況最為嚴(yán)格,接收到的標(biāo)示符必須每一位都得與過(guò)濾器中的標(biāo)示符的每一位進(jìn)行匹配,有一位不對(duì)報(bào)文就會(huì)被丟棄。(這個(gè)標(biāo)示符匹配的工作是CAN 模塊內(nèi)部硬件自動(dòng)完成的)


二、IdMask庫(kù)代碼
本程序中,使用的軟件代碼是:
軟件:
STM8S_StdPeriph_LibProjectSTM8S_StdPeriph_ExamplesCANCAN_Networking路徑下面的代碼。
硬件:
STM8/128 EVAL板子,上面的MCU為STM8S208MBT6B ;
程序里面打開(kāi)了接收的中斷:


為了能夠更有效的操作實(shí)踐這一功能,我使用了如上圖的CAN總線的分析儀器USB-CAN200 以及它的上位機(jī).
在這里需要說(shuō)明一點(diǎn),將R0+與R0-相短接,則內(nèi)部的120歐姆的電阻會(huì)被接入總線,不需要畫(huà)蛇添足,在R0+與R0-之間自己再找一個(gè)120歐姆的電阻外部接上!!


在接收中斷里面已經(jīng)有現(xiàn)成的標(biāo)準(zhǔn)楨結(jié)構(gòu),所以設(shè)置好Idfliter或者Idmask就可以。

也就是上面的 這一段函數(shù);
按照剛才的理解,
如果我的擴(kuò)展id是0x12345678 ;想只接收0x12xxxxxx的標(biāo)識(shí)符號(hào),那么是否填入
CAN_FilterID1 = 0x12 ;
CAN_FilterIDMask = 0xFF
就可以了呢? 本以為是這樣,結(jié)果通過(guò)上位機(jī)發(fā)出去之后,led板上的符號(hào)并沒(méi)有變化;說(shuō)明并沒(méi)有接收到。這是為什么呢?



三、分析

所以對(duì)于擴(kuò)展的ID號(hào)碼它有29位,但是程序中設(shè)計(jì)的過(guò)濾器位32位,所以:
如果假設(shè)擴(kuò)展id為0x12345678(0001,0010,0011,0100,0101,0110,0111,1000)

所以擴(kuò)展id的順序填入如上圖所示意,這兒假設(shè):
RTR位我們?cè)O(shè)置為0表示數(shù)據(jù)幀,IDE位設(shè)置為1表示擴(kuò)展ID,因?yàn)槲覀兊腎D是29位的,所以RTR = 0; IDE = 1;
再來(lái)看我們參考手冊(cè)中,定義的 :


將上面數(shù)據(jù)中的標(biāo)示符號(hào)位再填入到過(guò)濾器中:

所以可以看到顏色的順序已經(jīng)被打亂了,
如果要關(guān)心到具體的某一個(gè)比特位置;如果要過(guò)濾器讓它只接收0x12xxxxxx的標(biāo)識(shí)符號(hào);
這時(shí)候要根據(jù)它實(shí)際在identifier中的位置去修改idmask ; 前八個(gè)比特,對(duì)應(yīng)的就是黃色和綠色的部分,
所以其他的顏色,可以都填0表示不需要關(guān)心,則這里填入:1 1 1 1 ,1 xx x,我們這里填入0xF8 ;
即:
CAN_FilterID1=0x91;
CAN_FilterID2=0x00;
CAN_FilterID3=0x00;
CAN_FilterID4=0x00;
CAN_FilterIDMask1=0xF8; //0
CAN_FilterIDMask2=0x00; //0
CAN_FilterIDMask3=0x00; //0x0
CAN_FilterIDMask4=0x00; //
同理,對(duì)于下面的配置是只接收標(biāo)準(zhǔn)id=0x321(0011,0010,0001)的ID(也是32位過(guò)濾器),
因?yàn)橐彩菙?shù)據(jù)幀,所以RTR = 0,標(biāo)準(zhǔn)的id,所以IDE= 0 ;所以填入到:

CAN_FilterID1=0x64;
CAN_FilterID2=0x20;
CAN_FilterID3=0x00;
CAN_FilterID4=0x00;
CAN_FilterIDMask1=0xFF; //0
CAN_FilterIDMask2=0xE0; //0
CAN_FilterIDMask3=0x0; //0x0
CAN_FilterIDMask4=0x0; //
如下圖,測(cè)試通過(guò)


四、附錄
在CAN規(guī)范中并未定義代表邏輯電平的物理狀態(tài)(例如電壓),iCAN網(wǎng)絡(luò)使用符合ISO11898-2標(biāo)準(zhǔn)的電平信號(hào),一般來(lái)講,CAN總線為“隱性”(邏輯1)時(shí),CAN_H和CAN_L的電平為2.5V(電位差為0V);CAN總線為“顯性”(邏輯0)時(shí),CAN_H和CAN_L的電平分別是3.5V和1.5V(電位差為2.5V)。

識(shí)別符
識(shí)別符—標(biāo)準(zhǔn)格式 識(shí)別符的長(zhǎng)度為11 位,相當(dāng)于擴(kuò)展格式的基本ID(Base ID)。這些位按ID-28 到ID-18 的順序發(fā)送。最低位是ID-18。7 個(gè)最高位(ID-28- ID-22)必須不能全是“隱性”。

識(shí)別符—擴(kuò)展格式 和標(biāo)準(zhǔn)格式形成對(duì)比,擴(kuò)展格式由29 位組成。其格式包含兩個(gè)部分:11 位基本ID、18 位擴(kuò)展ID。

基本ID:基本ID 包括11 位。它按ID-28 到ID-18 的順序發(fā)送。它相當(dāng)于標(biāo)準(zhǔn)識(shí)別符的格式?;綢D定義擴(kuò)展幀的基本優(yōu)先權(quán)。

擴(kuò)展ID:擴(kuò)展ID 18 位。它按ID-17 到ID-0 順序發(fā)送。 標(biāo)準(zhǔn)幀里,識(shí)別符其后是RTR 位。 RTR 位(標(biāo)準(zhǔn)格式以及擴(kuò)展格式) RTR 的全稱為“遠(yuǎn)程發(fā)送請(qǐng)求位(RemoteTransmission Request BIT)”。 RTR 位在數(shù)據(jù)幀里必須為“顯性”,而在遠(yuǎn)程幀里必須為“隱性” 。

擴(kuò)展格式里,基本ID 首先發(fā)送,其次是IDE 位和SRR 位。擴(kuò)展ID 的發(fā)送位與SRR 位之后。
SRR 位(擴(kuò)展格式)
SRR 的全稱是“替代遠(yuǎn)程請(qǐng)求位(SubstituteRemote Request BIT)”。
SRR 是一隱性位。它在擴(kuò)展格式的標(biāo)準(zhǔn)幀RTR 位位置,因此代替標(biāo)準(zhǔn)幀的RTR 位。
標(biāo)準(zhǔn)幀與擴(kuò)展幀的沖突是通過(guò)標(biāo)準(zhǔn)幀優(yōu)先于擴(kuò)展幀這一途徑得以解決,擴(kuò)展幀的基本ID(參見(jiàn)以下的“擴(kuò)展識(shí)別符”)如同標(biāo)準(zhǔn)幀的識(shí)別符。
IDE 位(擴(kuò)展格式) IDE 的全稱是“識(shí)別符擴(kuò)展位(IdentifierExtension Bit)”
IDE 位屬于:
- 擴(kuò)展格式的仲裁場(chǎng)
- 標(biāo)準(zhǔn)格式的控制場(chǎng)
標(biāo)準(zhǔn)格式里的IDE位為“顯性(邏輯0)”,而擴(kuò)展格式里的IDE位為“隱性”。

在標(biāo)識(shí)符列表模式下,屏蔽寄存器當(dāng)作標(biāo)識(shí)符寄存器用。因此,使用2個(gè)標(biāo)識(shí)符來(lái)代替上面的標(biāo)識(shí)符加屏蔽位的方式。接收?qǐng)?bào)文標(biāo)識(shí)的每一位都必須跟過(guò)濾器標(biāo)識(shí)符相同。
設(shè)置過(guò)濾器0只接收ID為0x1828A0EF和0x1828A0EE的數(shù)據(jù)幀。(工作在標(biāo)識(shí)符列表模式)
首先我們把這兩個(gè)ID寫(xiě)成二進(jìn)制:
0x1828A0EF: 00011000001010001010000011101111
0x1828A0EE: 00011000001010001010000011101110
然后我們將0x1828A0EF二進(jìn)制的格數(shù)據(jù)組成如上圖mapping所示的格式
Cna_fxr1:1100 0001 0xc1
Cna_fxr2:01001001 0x49 //這里有個(gè)RTR位我們?cè)O(shè)置為0表示數(shù)據(jù)幀,IDE位設(shè)置為1表示擴(kuò)展ID,
Cna_fxr3:0100 0001 0x41
Cna_fxr4:1101 1110 0xDE
這時(shí)我們工作在標(biāo)識(shí)符列表模式,identifier/Mask的寄存器相當(dāng)于identifier使用。
再將0x1828A0EE二進(jìn)制的格數(shù)據(jù)組成如上圖mapping所示的格式
Cna_fxr5:1100 0001 0xc1
Cna_fxr6:01001001 0x49 //這里有個(gè)RTR位我們?cè)O(shè)置為0表示數(shù)據(jù)幀,IDE設(shè)置為1表示擴(kuò)展ID
Cna_fxr7:0100 0001 0x41
Cna_fxr8:1101 1100 0xDC
以下是用庫(kù)函數(shù)配置的程序小片段:
CAN_FilterNumber =CAN_FilterNumber_0;
//注意這是的模式是跟IdMask例不一樣的

CAN_FilterMode =CAN_FilterMode_IdList;
CAN_FilterScale =CAN_FilterScale_32Bit;
CAN_FilterID1=0xc1;
CAN_FilterID2=0x49;
CAN_FilterID3=0x41;
CAN_FilterID4=0xde;
CAN_FilterIDMask1=0xc1;
CAN_FilterIDMask2=0x49;
CAN_FilterIDMask3=0x41;
CAN_FilterIDMask4=0xdc;
相信看到這里你對(duì)這兩種工作模式都會(huì)有了一定的了解。好了,到此例子就介紹完了,算是拋磚引玉。8位、16位的位寬是相似的,跟上面的分析一樣。



關(guān)鍵詞: STM8CAN總線IdMask模

評(píng)論


技術(shù)專區(qū)

關(guān)閉