STM8S can 過(guò)濾總結(jié)
學(xué)點(diǎn)東西不容易,花了6小時(shí)終于明白了過(guò)濾,關(guān)鍵是沒(méi)有找到合適的范例 。
STM8S提供了6個(gè)32位的過(guò)濾寄存器,我們暫以只討論32位的地址過(guò)濾。
這6個(gè)32位的過(guò)濾,可以選用列表方式,即6個(gè)寄存器組設(shè)置的標(biāo)識(shí)符才可不被CAN丟棄,但這似乎很少這樣通訊,一般我們會(huì)選用電腦網(wǎng)卡類似的遮罩方式 192.168.1.1 / 255.255.255.0 如此就限制了只有同網(wǎng)段的包才可被接收,下面我們重點(diǎn)來(lái)討論這個(gè)問(wèn)題 。
6個(gè)32位過(guò)濾寄存器(我們可以把它當(dāng)成32位的,這樣更易表述些,實(shí)際上是4個(gè)8位的),可以兩兩組合成帶有遮罩過(guò)濾的3個(gè)組,我們只討論其中一組即可。
在發(fā)送數(shù)據(jù)時(shí),標(biāo)識(shí)包格式如下:
而過(guò)濾寄存器的格式如下,也就是說(shuō)接收和發(fā)送的標(biāo)識(shí)符的ID排列結(jié)構(gòu)是不一致的,STM庫(kù)一貫較好,在此處表現(xiàn)很欠佳,所以讓我折騰了6個(gè)小時(shí),正是這一原因,所以很估計(jì)多CAN初學(xué)者可能都在此處遇到麻煩了吧
通常我們?cè)诔绦蛑羞@樣寫
發(fā)送:
Tx_Id = 0x12345678;//29bit
Tx_IDE = CAN_Id_Extended;//CAN_Id_Standard;
Tx_RTR = CAN_RTR_Data;
Tx_DLC = 2;
Tx_Data[0] = tx_count++;
Tx_Data[1] = ~Tx_Data[0];
// CHECK_MAIL();
status = CAN_Transmit(Tx_Id,Tx_IDE,Tx_RTR,Tx_DLC,Tx_Data);
而接收過(guò)濾就很易出錯(cuò):如下
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_32Bit;
CAN_FilterID1=0x91;//假如我們只想收到0X12345678標(biāo)識(shí)符前8bit相同的標(biāo)識(shí)頭的包,這里要填上0X12就大錯(cuò)了,因?yàn)槭瞻l(fā)的標(biāo)識(shí)符是不對(duì)齊的,所以接收包的ID向左移3位,第一字節(jié)就成了0X91,其它位同理
CAN_FilterID2=0x00;
CAN_FilterID3=0x00;
CAN_FilterID4=0x00;
CAN_FilterIDMask1=0xff;
CAN_FilterIDMask2=0;
CAN_FilterIDMask3=0;
CAN_FilterIDMask4=0;
CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,
CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3,
CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2,
CAN_FilterIDMask3, CAN_FilterIDMask4);





