學點東西不容易,花了6小時終于明白了過濾,關(guān)鍵是沒有找到合適的范例 。
STM8S提供了6個32位的過濾寄存器,我們暫以只討論32位的地址過濾。
這6個32位的過濾,可以選用列表方式,即6個寄存器組設(shè)置的標識符才可不被CAN丟棄,但這似乎很少這樣通訊,一般我們會選用電腦網(wǎng)卡類似的遮罩方式 192.168.1.1 / 255.255.255.0 如此就限制了只有同網(wǎng)段的包才可被接收,下面我們重點來討論這個問題 。
6個32位過濾寄存器(我們可以把它當成32位的,這樣更易表述些,實際上是4個8位的),可以兩兩組合成帶有遮罩過濾的3個組,我們只討論其中一組即可。
在發(fā)送數(shù)據(jù)時,標識包格式如下:
而過濾寄存器的格式如下,也就是說接收和發(fā)送的標識符的ID排列結(jié)構(gòu)是不一致的,STM庫一貫較好,在此處表現(xiàn)很欠佳,所以讓我折騰了6個小時,正是這一原因,所以很估計多CAN初學者可能都在此處遇到麻煩了吧
通常我們在程序中這樣寫
發(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);
而接收過濾就很易出錯:如下
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_32Bit;
CAN_FilterID1=0x91;//假如我們只想收到0X12345678標識符前8bit相同的標識頭的包,這里要填上0X12就大錯了,因為收發(fā)的標識符是不對齊的,所以接收包的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);