Ⅰ 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的过滤、哪些位不用考虑。参考以太网的子网掩码。