1. CAN匯流排里邊的報文過濾功能是什麼
標識符就是確定報文發送優先順序的,CAN匯流排是一種串列匯流排,匯流排上一次只能傳輸一則報文信息,如果同時有多個節點需要在匯流排上發送報文,通過標識符決定哪個先發送。
2. CAN集線器報文過濾功能是如何實現的,原理是什麼
CAN報文通過驗收濾波後,我想讀取CAN報文的標識位,是不是和讀取數據域的方法一樣?
答:一樣的。
通過對標識位的分配實現CAN協議的設計,那麼對不同的CAN報文的分別是通過驗收濾波功能實現,還是需要讀取標識位 再進行判斷?
答:為了與其它CAN設備的兼容,簡易不要採用對標識位的分配實現CAN協議的方法,建議利用數據部分進行協議的封包和解包,也就是說把協議控制放到數據部分。這樣有利於與其他CAN設備兼容,而且可以直接利用SJA1000的驗收濾波來進行節點的判斷,減輕單片機的運算負擔。這也是CAN控制器的設計初衷啊。
3. STM32裡面的CAN,過濾器的設置有什麼用(答案好,有追加)
CAN匯流排傳復送到數據是基於消息制而不是地址的,每個消息用不同的編號表達(2.0A用11位、2.0B用29位)。在CAN上進行簡單傳送而自定義傳送協議時,要把所有需要傳送的命令列出,然後根據傳送的緊急程度(優先順序)從高到低進行排序,然後把最高優先順序的設定一個最低的編號、以此類推...最低優先順序的設定最高的編號。因為CAN物理上是不分主從,所以當有幾個站點同時發送而發生碰撞時,編號最低的將優先傳送。
從匯流排上接收消息:每個站點可能只對所有協議中的幾個消息感興趣,CAN初始化時,在過濾器中設置本站點需要接收的消息編號,這樣一旦匯流排上有需要的消息將會自動接收,並產生中斷,通知CPU收到新消息,CPU在中斷程序中接收、處理。
發送消息到匯流排上:CAN初始化時設置本站點將來需要發送的消息編號,當運行過程中需要發送消息時,填入相關數據,設置相關消息對象發送。
CAN控制器內部一般設有32個消息對象,分成2組,分別各用一組寄存器來操作。一般一組用來接收過濾,另一組用來發送。
4. CAN多節點通信怎麼設置過濾和屏蔽器
int sja1000T_set_FILTER(FILTER *filter,CANDEV *chip)
{
unsigned char reg;
int i;
int code,mask;
code=filter->code;
mask=filter->mask;
if (filter->flag&MSGFLAG_EXTENDED)
sja1000T_extended_mask(chip,code,mask);
else
sja1000T_standard_mask(chip,code,mask);
}
/****************************************/
int sja1000T_extended_mask(CANDEV *chip, unsigned long code, unsigned long mask)
{
int i;
if (sja1000T_enable_configuration(chip))
return -ENODEV;
code <<= 3;
mask <<= 3;
/*AMR3 : BIT0=1 BIT1=1 BIT3(RTR)=1*/
mask|=0x7;
for(i=SJA_PeliCAN_AC_LEN; --i>=0;) {
can_write_reg(chip,code&0xff,SJAACR0+i);
can_write_reg(chip,mask&0xff,SJAAMR0+i);
code >>= 8;
mask >>= 8;
}
for(i=SJA_PeliCAN_AC_LEN; --i>=0;) {
can_read_reg(chip,SJAACR0+i);
can_read_reg(chip,SJAAMR0+i);
}
if(sja1000T_disable_configuration(chip))
return -ENODEV;
return 0;
}
/*************************************************/
int sja1000T_standard_mask(CANDEV *chip, unsigned long code,unsigned long mask)
{
int i;
if (sja1000T_enable_configuration(chip))
return -ENODEV;
code <<= 21;
mask <<= 21;
/*AMR2,3 :0xffff
AMR 1:BIT4~BIT0 :0X1F
*/
mask|=0x1fffff;
DEBUGMSG("standard code to 0x%lx\n",(unsigned long)code);
DEBUGMSG(" standard mask to 0x%lx\n",(unsigned long)mask);
for(i=SJA_PeliCAN_AC_LEN; --i>=0;) {
can_write_reg(chip,code&0xff,SJAACR0+i);
can_write_reg(chip,mask&0xff,SJAAMR0+i);
code >>= 8;
mask >>= 8;
}
for(i=SJA_PeliCAN_AC_LEN; --i>=0;) {
can_read_reg(chip,SJAACR0+i);
can_read_reg(chip,SJAAMR0+i);
}
if(sja1000T_disable_configuration(chip))
return -ENODEV;
return 0;
return -ENOSYS;
}
5. 在can中接收過濾器id和發送函數id設置成不一樣能通信嗎
不可能啊,是不是哪地方沒有設定對啊,
我用的51+sja1000—+82C250一切正常啊
你把掩碼和屏蔽碼對照晶元說明書好好 實驗一下,應該不會有問題的
祝運
6. 用串口模擬CAN匯流排報文的接收,如何判斷一條完整報文已經接收完
不清楚你的接收端是什麼,如果是單片機,查看一下CAN接收寄存器標志位,如果是PC,直接看接收到的是不是8位元組就可以了
7. 兩個can設備,其中一個設置了過濾模式,另一個發送id不匹配的報文,請
CAN匯流排ID是包含在報文幀中的. 1、主要用作CAN匯流排的仲裁使用, 所以一般來說網路上的每個節點(向匯流排上發送)的ID應該有所不同. ID值越低
8. stm32 can 報文過濾器編號的用法
濾波器就是過濾地址和報文的,比如你可以對郵箱0設置濾波器讓它只接受數據幀和指定地址為xxx的。如果讓某個郵箱具有多個地址,比如需要設置地址和廣播地址,那就需要設置2個濾波器。
9. CAN匯流排 節點之間通信 如何確認接收信息 +20
首先,要明確你要的應答是什麼,是正確接收某個報文,還是某個節點向另一節點請求報文
一、正確接收報文:
CAN報文包含一個ID場的部分,每個報文在匯流排上廣播,節點收到報文後比較ID,如果是該節點應該接受的報文ID,該節點則完成接受;
二、請求報文:
CAN報文內在ID場前有一個1bit長度遠程幀場,0表示為普通幀,1表示為遠程幀,當A節點希望B節點向它發送某個報文時,A節點向匯流排廣播遠程幀,遠程幀無數據場,匯流排上節點同樣也是比較報文的ID場,當B節點比對ID場發現該遠程幀是向它請求時,B節點發送該遠程幀請求的幀,A通過第一點中的方法接受收
PS:CAN匯流排報文的CRC校驗場後面會有一個ACK應答場,發送報文的節點發出的ACK(1Bit)為「1」,正確應答的節點(報文數據校驗通過正確)會將匯流排上的這個ACK位電平拉成「0」,表示正確應答。
若A節點廣播報文後,發現該報文的ACK始終為「1」,則其收發器將從緩存中自動重發該幀,直到有節點正確接受ACK為「0」或者A節點離線
希望對你有幫助,還有不完整或不理解的可以追加提問或者M我
10. STM32 CAN 過濾器設置
看手冊里有關該模式過濾寄存器的每位含義,最低三位是IDE RTR和 0,前面高位是標識符