Ⅰ 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;
}
Ⅱ stm32can匯流排通信的問題
過濾器寄存器是一個32位的變數,在STM32F103系列普通型號中低14位(位13:0)有效,位27:14隻在互聯型產品中有效,其他位為保留位。
Ⅲ stm32 can 報文過濾器編號的用法
濾波器就是過濾地址和報文的,比如你可以對郵箱0設置濾波器讓它只接受數據幀和指定地址為xxx的。如果讓某個郵箱具有多個地址,比如需要設置地址和廣播地址,那就需要設置2個濾波器。
Ⅳ 什麼是CAN通信
1can是兩根線,
2can線上有兩個狀態,
a隱性狀態,兩線電壓2.5V,表示位為1。
b顯性狀態,兩線電壓:低1.5V,高3.5V,壓差2V;表示位為0;
3以上2里的電壓叫差分線路,為的是增加抗干擾性能,同時在高與低兩根線上並入120歐姆電阻,防止信號震盪。
4以上只是電路的硬體解釋,下面以長城上的烽火台舉個例子。
5第一個檯子,冒煙了,在131個時間單位里(一個報文131個位,也就是一個數據幀131個位),其他的檯子,就會記錄44個時間單位里,有沒有冒煙結果是131個0與1組成的數字:100110010101100101100101(這里一共是131個哈,我沒具體計數)。
6如果有兩個檯子在冒煙,先冒煙a的不要停,接著冒煙。後冒煙的b停下來,接收a發出的信號。
7兩個檯子同時冒煙,在前11個冒煙記數里,誰不冒煙(狀態為0,顯性電平,壓差2V)發送的多,誰的優先順序就高,就不會停,而其它的1-N個就會停下來 改為接收。
8在一個131時間里,一個發出,其它的所有檯子都會收到並記錄這一串數字,然後根據領導的指示(或是軍部的密碼本)進行信息處理,如果能找到匹配密碼的信息就把8個位元組(一個131的幀有8*8位的數據內容,其它的131-64=67個位不是數據的)存下來,裝進箱子里,A級文件裝進第一個密碼箱,B級文件裝在第二個密碼箱,每個箱子有三個格子,只能收三個文件。
9在131個時間里收到的數據串,前11個是ID,就是編號。12位是擴展位,可以在擴展28個位。
10一個131(叫報文,叫幀),有這樣幾個段,仲裁段(就是ID段,前面5678里提到的密碼本就是在這一段做比對),數據段(8位元組*8位),應答段,結束段。
11仲裁里數據叫標識符,用來匹配密碼本(叫篩選器,叫識別器,叫過濾器)。
12每個can硬體有多個識別器,每個烽火台有多個密碼本。兩本是一個組。
13每組密碼本的方式,
a一本指定檢測位的,一本指定位的狀態。比如第一本指定只看第3與5位,第二本指定3位與5位為0。那麼只有這一種信息才能存後面的8個字(64位)
b一本指定密碼A,一本指定密碼B。
c與d記不清了。
14密碼本有11位,使用的時候用不了那麼多個(11位為0-7ff,0-2046)所以可以前三個位是烽火台的編號,最後兩位是功能碼(比如信息緊急程度,或數據類型:int char bit),也就是說,仲裁段可以對密碼,與可以當數據段來使用。
15應答段只有兩位,具體的忘了。
16結束段有7位隱性電平,好像是這樣的。
Ⅳ STM32 CAN 過濾器設置
看手冊里有關該模式過濾寄存器的每位含義,最低三位是IDE RTR和 0,前面高位是標識符
Ⅵ CAN匯流排通信 標識符的設置
1.can協議中有規定,在某幾位發送目的站的地址,目的站可以通過對這幾位進行選擇,自行決定是否接受該消息,是自己變成設定的
2.一般CAN通信晶元都可以在寄存器里設定自己需要接受的標識符等
A要和B通信,A要指導B的標識符,然後發出去,B發現標識符正確接受,C和D讀完標識符後選擇丟棄。C D節點選擇不同的標識符即可。你的想法是對的。
要實現CAN通信,選擇一個合適的can控制晶元和驅動晶元即可
Ⅶ STM32裡面的CAN,過濾器的設置有什麼用(答案好,有追加)
CAN匯流排傳復送到數據是基於消息制而不是地址的,每個消息用不同的編號表達(2.0A用11位、2.0B用29位)。在CAN上進行簡單傳送而自定義傳送協議時,要把所有需要傳送的命令列出,然後根據傳送的緊急程度(優先順序)從高到低進行排序,然後把最高優先順序的設定一個最低的編號、以此類推...最低優先順序的設定最高的編號。因為CAN物理上是不分主從,所以當有幾個站點同時發送而發生碰撞時,編號最低的將優先傳送。
從匯流排上接收消息:每個站點可能只對所有協議中的幾個消息感興趣,CAN初始化時,在過濾器中設置本站點需要接收的消息編號,這樣一旦匯流排上有需要的消息將會自動接收,並產生中斷,通知CPU收到新消息,CPU在中斷程序中接收、處理。
發送消息到匯流排上:CAN初始化時設置本站點將來需要發送的消息編號,當運行過程中需要發送消息時,填入相關數據,設置相關消息對象發送。
CAN控制器內部一般設有32個消息對象,分成2組,分別各用一組寄存器來操作。一般一組用來接收過濾,另一組用來發送。
Ⅷ CAN通訊中,標識符屏蔽模式,如果設置接收ID為一組,對應網路內所有節點都會收到,ACK如何應答
CAN通訊中,標識符屏蔽模式,如果設置接收ID為一組,對應網路內所有節點都會收到,ACK如何應答?
ACK應答是所有節點都發送嗎?會不會出現發送數據無法接收的情況。或者ACK發送報錯。
Ⅸ 在can中接收過濾器id和發送函數id設置成不一樣能通信嗎
不可能啊,是不是哪地方沒有設定對啊,
我用的51+sja1000—+82C250一切正常啊
你把掩碼和屏蔽碼對照晶元說明書好好 實驗一下,應該不會有問題的
祝運
Ⅹ PIC單片機CAN如何定義過濾器的計算
……你是不是沒有搞明白什麼叫做「過濾」啊……你給的條件並不夠。要麼回給出你預期有答效的ID范圍,要麼給出你想要過濾掉的ID范圍……
過濾器就是設定哪些位參與對報文ID的過濾、哪些位不用考慮。參考乙太網的子網掩碼。