STM32 can发送邮箱与过滤器的匹配

合集下载

STM32 CAN详细配置方法

STM32 CAN详细配置方法

STM32 CAN详细配置方法1、CAN 引脚不用初始就可以工作2、BOUNDRA TE设置查看文件夹相关文件(这个文档不错BAIDU :CAN总线通讯速率设定)3、CAN 要配转换器4、CAN_InitStatus_TypeDef status = CAN_InitStatus_Failed;5、6、 /* Filter Parameters */7、 CAN_FilterNumber_TypeDef CAN_FilterNumber; //CAN过滤器组1 2 3 4 5 //filter 0 1 2 3 4 58、 FunctionalState CAN_FilterActivation; //Filter激活//是否激活CAN Filter9、 CAN_FilterMode_TypeDef CAN_FilterMode; //过虑的方式屏蔽位模式与标识符模式//标识符过滤MODE select10、CAN_FilterScale_TypeDef CAN_FilterScale; //过滤器组位宽度和模式设置// CANfilter scale11、u8 CAN_FilterID1;12、u8 CAN_FilterID2;13、u8 CAN_FilterID3;14、u8 CAN_FilterID4;15、u8 CAN_FilterIDMask1; //如果选择标识、屏蔽,MASK为0不须比较16、u8 CAN_FilterIDMask2; //若全为标识则都要比较17、u8 CAN_FilterIDMask3;18、u8 CAN_FilterIDMask4;19、20、/* Init Parameters*/21、// MCR设置22、CAN_MasterCtrl_TypeDef CAN_MasterCtrl; // CAN Time Triggered Communication mode23、24、CAN_Mode_TypeDef CAN_Mode; //设置运行模式CANMode We can change Mode when here .25、CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth; //同步跳跃宽度1 2 3 4 CAN26、CAN_BitSeg1_TypeDef CAN_BitSeg1; //补偿不同节点的正向漂移27、CAN_BitSeg2_TypeDef CAN_BitSeg2; //补偿不同节点的负向漂移28、//尽量大一点且要是SJW的整数倍29、//100K 为10 000ns30、CAN_ClockSource_TypeDef CAN_ClockSource; //选择类型,是外部还是内部31、u8 CAN_Prescaler; //分频32、33、/* CAN register init */34、CAN_DeInit(); //寄存器初始化35、36、/* CAN init */37、CAN_MasterCtrl=CAN_MasterCtrl_AllDisabled;38、//测试模式,使用静默环回模式39、// CAN Time Triggered Communication mode40、CAN_SynJumpWidth = CAN_SynJumpWidth_1TimeQuantum;41、CAN_BitSeg1 = CAN_BitSeg1_8TimeQuantum;42、CAN_BitSeg2 = CAN_BitSeg2_7TimeQuantum;43、CAN_Prescaler = 1;44、CAN_ClockSource = CAN_ClockSource_Internal; //内部时钟45、46、status =CAN_Init(CAN_MasterCtrl,CAN_Mode,CAN_SynJumpWidth,CAN_BitSeg1,CAN_BitSeg2,CAN_ClockSo urce,CAN_Prescaler);47、48、/* CAN filter init */49、CAN_FilterNumber = 0; //0 1 2 3 4 5FILTER SELECT50、CAN_FilterActivation = ENABLE; //是否激活过滤51、CAN_FilterMode = CAN_FilterMode_IdMask; //FMR Register设置CAN_FilterMode_IdMask52、CAN_FilterScale = CAN_FilterScale_32Bit; //过虑模式8 16 32 16/853、CAN_FilterID1=0x64;54、CAN_FilterID2=0;55、CAN_FilterID3=0;56、CAN_FilterID4=0;57、CAN_FilterIDMask1=0xff; //0;58、CAN_FilterIDMask2=0x0; //0;59、CAN_FilterIDMask3=0x0; //0;60、CAN_FilterIDMask4=0x0; //0;61、62、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);63、}。

STM32_CAN总线使用说明

STM32_CAN总线使用说明
STM32F103***的 CAN 总线使用说明
1. 配置 CAN 时钟、映射、IO 口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
7.查询是否发送完成
i = 0; while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFFF)) //与 2.0 库有异;判断发送数据成功 {
i++; } if(CAN_TransmitStatus(CAN1, TransmitMailbox) == CANTXPENDING) //表示数据正在 发送中。
CAN_FilterInit(&CAN_FilterInitStructure);
5.打开 CAN 接收中断
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
6.编辑发送数据(标识符模式和扩展模式)
TxMessage.StdId=0x10; TxMessage.RTR=CAN_RTR_DATA; TxMessage.IDE=CAN_ID_STD;//(标识符模式)// CAN_ID_EXT (扩展标识符模式) TxMessage.DLC=8; TxMessage.Data[0] =0x01; TxMessage.Data[1] =0x01; TxMessage.Data[2] =0x01; TxMessage.Data[3] =0x01; TxMessage.Data[4] =0x01; TxMessage.Data[5] =0x01; TxMessage.Data[6] =0x01; TxMessage.Data[7] =0x01; CAN_Transmit(CAN1, &TxMessage);

STM32CAN滤波器、滤波屏蔽器设置详解

STM32CAN滤波器、滤波屏蔽器设置详解

STM32 CAN 过滤器、滤波屏蔽器配置总结下面容为:一、在STM32互联型产品中,CAN1和CAN2分享28个过滤器组,其它STM32F103xx系列产品中有14个过滤器组,用以对接收到的帧进行过滤。

1、过滤器组每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。

这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上"过"一下,能通过的报文是有效报文,收进相关联FIFO(FIFO1或FIFO2),不能通过的是无效报文(不是发给"我"的报文),直接丢弃。

(标准CAN的标志位长度是11位。

扩展格式CAN的标志位长度是29。

CAN2.0A协议规定CAN控制器必须有一个11位的标识符。

CAN2.0B协议中规定CAN控制器的标示符长度可以是11位或29位。

STM32同时支持CAN2.0A/CAN2.0B 协议。

)每组过滤器组有两种工作模式:标识符列表模式和标识符屏蔽位模式。

标识符屏蔽位模式:可过滤出一组标识符。

此时,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。

标识符列表模式:可过滤出一个标识。

此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。

注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐起。

所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。

按工作模式和宽度,一个过滤器组可以变成以下几中形式之一:(1) 1个32位的屏蔽位模式的过滤器。

STM32单片机对CAN过滤器的设置方法

STM32单片机对CAN过滤器的设置方法
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
3、对标准远程帧过滤:(只接收标准远程帧)
CAN_FilterInitStructure.CAN_FilterIdHigh=((STD_ID《《21)
&0xFFFF0000)》》16;
CAN_FilterInitStructure.CAN_FilterIdLow=((STD_ID《《21)|(0x0))
符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
1、对扩展数据帧进行过滤:(只接收扩展数据帧)
CAN_FilterInitStructure.CAN_FilterIdHigh=(EXT_ID》》13)&0xFFFF;
帧,不接受扩展数据帧
(0x06))&0xFFFF;
//这里设置|0x02(0b0010)就是为了IDE=0,RTR=1
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFE0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0006;//只接受标准数据
CAN_FilterInitStructure.CAN_FilterIdLow=((EXT_ID《《3)|(0x04))
&0xFFFF;
//这里设置|0x04(0b0100)就是为了IDE=1,RTR=0,
//这里也可以写为(EXT_ID《《3)
|CAN_ID_EXT|CAN_RTR_ROMOTE,效果一样,下同
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;

STM32的CAN总线的标识符过滤器组使用注意事项

STM32的CAN总线的标识符过滤器组使用注意事项

STM32的CAN总线的标识符过滤器组使用注意事项CAN 总线的标识符过滤器很重要。

1. 标识符过滤器是用于接收的,发送的时候无需设置过滤器,这点一定要整明白。

根据发送端发送来的帧数据,通过标识符过滤器就可以设置仅接收需要接收的帧数据有效降低CPU 多余的处理时间。

2 什么是标识符?标识符主要包括如下,也可以简单的理解仅包含ID 号,但是在这里下面这些都是要包含的。

比如:数据帧和遥控帧,标识符就包含在其中,所以发送端发帧数据给接收端后,接收端就可以通过硬件标识符过滤器进行筛选,节省了CPU 时间:3. 下面就是最重要的,STM32 的CAN 总线标识符滤波器组包含两种实现方法:屏蔽位模式和标识符列表模式,这两种方式怎么理解呢,重点看下面的截图:书面上解释屏蔽位模式和标识符列表模式的区别屏蔽位模式在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照必须匹配或不用关心处理。

标识符列表模式在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。

因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2 个标识符寄存器。

接收报文标识符的每一位都必须跟过滤器标识符相同。

===================================标识符的列表模式比较好理解,就是指的所有的过滤器寄存器位全部用于过滤,简单的说就是发送端发送的标识符所有的位必须跟接收端的滤波器寄存器定义一样。

有一个位定义不一样,拒收此消息。

比STM32F103 有14 个过滤器组,如果采用两个16 位的过滤器形式,那么就可以固定识别出14 * 4 = 56 个不同的标识符,实际使用中也够用了。

为什么是乘以4,注意看上面的截图,4 个16 位过滤器--标识符列表===================================屏蔽位模式要稍麻烦一些,我们以2 个16 位过滤器---标识符屏蔽为例进行。

STM32CAN发送接收的简单测试

STM32CAN发送接收的简单测试

STM32CAN发送接收的简单测试can接⼝相对是⼀种常⽤的串⾏接⼝,但是不像spi、i2c、uart等接⼝都有主从的关系,can可以任何⼀个节点主动发送数据,并且假如出现总线冲突会有硬件来处理。

can和rs485⼜有些类似,都是把ttl信号转换成了差分信号。

所以在stm32 使⽤can的时候会有⼀个can收发器。

STM32 CAN 发送的简单测试从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。

所以假如我们要测试can的发送,是不是只接can tx脚就可以了?我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样⾏不通的。

因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对⽐,是不是⼀致就知道总线有没有冲突。

所以在正常情况(这⾥意味着⾮正常情况下也可以)下can rx不接就到这发送出去的数据⽆法收到从⽽硬件⾃动判断为发送失败。

所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。

硬件上就这些主要注意点,接下来就主要是软件的配置了。

⼀般stm32 配置can有以下⼏⼤步骤:can的初始化(cubemx直接可以⽣成代码)can的启动can滤波器的设置(⽤来接收的,发送的时候可以不⽤配置它)can执⾏发送数据请求我们只测试can的发送,所以就只⽤关系1、2、4步骤就可以了。

第⼀步,配置stm32cubemxSTM32 CAN 发送的简单测试如上图所⽰,最关键主要配置如下三个参数,分频数我这⾥配置48,下⾯的time Quantum值就会⾃动计算出来。

因为can时钟是48mhz经过48分频后,⼀个单位时间就是1us=1000ns。

因为我想要100k波特率,然后填写下⾯的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。

那么具体波特率该怎么计算还是要看看官⽅⼿册的描述:STM32 CAN 发送的简单测试根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。

STM32之CAN ---CAN ID过滤器分析

STM32之CAN ---CAN ID过滤器分析

前言在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。

因此,发送者以广播的形式把报文发送给所有的接收者。

节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。

为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。

硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。

每个过滤器组x 由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

为了让大家了解STM32的bxCAN的接收过滤机制,首先大家需要了解几个概念。

2 几个重要的概念2.1 过滤器组STM32总共提供14个过滤器组来处理CAN接收过滤问题,每个过滤器组包含两个32位寄存器CAN_FxR0和CAN_FxR1组成,在设置为屏蔽位模式下,其中一个作为标识符寄存器,另一个作为屏蔽码寄存器。

过滤器组中的每个过滤器,编号(叫做过滤器号)从0开始,到某个最大数值(这时最大值并非13,而是取决于14个过滤器组的模式和位宽的设置,当全部配置为位宽为16,且为标识符列表模式时,最大编号为14*4-1=55)。

2.2 过滤器的过滤模式STM32提供两种过滤模式供用户设置:屏蔽位模式和标识符列表模式。

2.2.1 屏蔽位模式为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。

在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。

2.2.2 标识符列表模式为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。

在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。

因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。

接收报文标识符的每一位都必须跟过滤器标识符相同。

2.3 过滤器的位宽每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。

关于STM32的CAN的过滤问题

关于STM32的CAN的过滤问题

关于STM32的CAN过滤问题在使用CAN接收时,一般都是使用如下图模式:过滤器长度是32位,然后过滤模式有两种,一种list过滤,一种mask过滤,list过滤就是过滤出你要的唯一的那个ID,而mask过滤可以滤出满足条件的一组ID,比如,在list模式下,你期望收到的ID是0x12345678,那么只要它收到0x12345678了才能触发接收中断或者接收函数才能收到数据,如果在mask模式下,你还得多设置一个mask寄存器,例如设置为0xFFFF0000,则只要收到的ID是符合0x1234xxxx 的就行了一般的CAN过滤器初始化如下图注意:在上图模式中,MaskId寄存器全为0,所以收到的ID全都不检查(或者说不理会它的所有位是否符合要求),这样,STM32的CAN将会收到所有ID 现在描述一下我在调试过滤器时发现的一个很容易犯错的地方:首先,注意上图中的四个16位的寄存器等价于下图中两个32位的寄存器这两个32位的寄存器,一个装的是mask,一个是list,它们的结构是一样的,前半部分是ID,后半部分是3个控制位。

现假设CAN接收端期望接收到的ID 为0x123456xx,思路为:list随便填一个符合0x123456xx格式的数,然后mask的高16位设为0xFFFF,低16位设为0xFF00,这样它不就会检查每个ID是不是符合0x123456xx了吗,那么设置如下:认真查看一下手册,你会发现这样做是错的,请仔细看下图:CAN发送端发来的ID当然是0x12345678,但是接收端收到此ID后,在过滤器中,它先把该ID封装成上图中的“CAN接收”帧,可见,它加了3个控制位进去了,这样一来,mask不理会的地方变成了ID的低5位和3个控制位,明显跟需要的“不理会的是ID的低8位”不符,要明白:stm32 CAN接收过滤时,ID要左移3位再在低3位添加3个控制位变成一个32位的帧再拿去跟mask 比较的,所以mask也应该左移3位才对:补充说明:可以这样更简单地理解:一个CAN帧有32位的帧头,再加上32位的帧体,在ST给的库函数中,CAN 发送时必须先设置好ID,假设这个ID是扩展ID,29位,那么设置的这个ID 开头3位必然是0,ST的库函数把这个ID左移3位以后再发出去的,接收时再右移3位所以你看起来并不感觉到ID有动过,但是如果你要使用CAN过滤的话就必须考虑这些中间环节了,因为CAN接收到的第一手ID等于CAN发送时的ID左移3位(低3位插入了IDE、RTR等3个位),所以你的CAN过滤的mask和id两个量基于的应该是CAN发送时的ID左移3位,这是库函数带来的一个麻烦,用寄存器编程则没有这个问题。

STM32——CAN总线过滤器设置

STM32——CAN总线过滤器设置

STM32——CAN总线过滤器设置
STM32CAN控制器每个筛选器组由两个32位的寄存器组成。

根据所需位宽的不同,各个筛选器可配置成16位或32位模式(如下图,当FSCx=1为32位模式,FSCx=0时为16位模式)。

同时,筛选器的模式可配置成掩码模式和列表模式(FBMx=0为掩码模式,FBMx=1为列表模式)。

掩码模式:对报⽂ID的每⼀位可选择必须相同和不管它。

列表模式:只给出接收的ID,其它的⼀概不接收。

下⾯将这四种情况分别介绍⼀下:
1、1个32位筛选器——掩码模式
第⼀个筛选器写⼊报⽂ID,第⼆个筛选器规定对应的每个位是检查它(置1)还是不管它(置0)。

例如,第⼀个筛选器设置为0x0000,这时候如果第⼆个筛选器设置0xFFFF,就意味着对每个位都检查,即只接收ID是0x0000的报⽂。

如果第⼆个筛选器设置0xFFFE,就是对最后⼀位不管,这时候0x0001和0x0000都可以被接收啦。

2、2个32位筛选器——列表模式
第⼀个筛选器写⼊报⽂ID,第⼆个也写标准的报⽂ID。

此时只接收ID为这俩的报⽂。

例如,第⼀个筛选器设置0x0000,第⼆个筛选器设置0x0001。

此时只能接收ID为0x0000和0x0001的报⽂了。

3、2个16位筛选器——掩码模式
和第⼀种情况差不多,只不过位宽减⼩到了16位,只⽀持标准ID格式,但是可以筛选的ID数增⼤到了两个。

4、4个16位筛选器——列表模式
拆分成的4个16位筛选器允许写⼊4个标准ID,只接收这4个ID的报⽂。

STM32CAN滤波器、滤波屏蔽器设置详解

STM32CAN滤波器、滤波屏蔽器设置详解
匹配
CAN_FiIterI nitStructure.CAN_FiIterMaSkIdLOW= OXFFFF;//完
全匹配
CAN_FiIterI nitStructure.CAN_FiIterFIFOASSig nmen t=CAN_FIFO0;
〃使用FIFOO
CAN_FiIterI nitStructure.CAN_FiIterACtiVatiO n=ENABLE;//使能过
滤器
CAN_FiIterI nit(&CAN_FiIterI nitStructure);
CAN_ITCOnfig(CAN1,CAN_IT_FMP0|CAN_IT_EPV, ENABLE);
}
/*CAN发送函数*/
Un Sig ned Char CAN1_Se ndData(void)
{
Can TXMSg TXMeSSage;
CAN _ln itStructure.CAN_NART=ENABLE;〃ENABLE;报文自动重传
CAN」nitStructure.CAN_RFLM=DISABLE;〃接收溢出时,FlFO未锁定
CAN」n itStructure.CAN_TXFP=DISABLE;〃发送的优先级由标示符的
大小决定
CAN」n itStructure.CAN_Mode=CAN_Mode_Normal;〃正常模式下
(1)位宽为32位的过滤器,优先级高于位宽为16位的过滤器。
(2)对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式。
(3)位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优 先级高。
按这样的顺序,报文能通过的第一个过滤器,就是该报文的过滤器编号,被 存入接收邮箱中。

STM32CAN滤波器配置总结

STM32CAN滤波器配置总结

STM32CAN滤波器配置总结STM32 CAN滤波器配置总结经过一段时间的学习,终于把Can通信调通了。

今天花费点时间总结下CAN通信各参数配置注意事项和方法,以便下回查阅。

这里采用分别介绍查询发送、中断接收和中断发送、中断接收两种方式。

第一步,初始化各端口与寄存器,这里只介绍CAN_Configuration代码如下:CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;/* CAN register init */CAN_DeInit();CAN_StructInit(&CAN_InitStructure);/* CAN cell init */CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;// 正常模式CAN_InitStructure.CAN_SJW=CAN_SJW_2tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=8; //36MHz/(1+8+7)*9 =250Kb/sCAN_Init(&CAN_InitStructure);/* CAN filter init */初始化滤波器CAN_FilterInitStructure.CAN_FilterNumber=0; //选择过滤器0 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_I dMask;//标识符屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32 bit;//32位过滤器CAN_FilterInitStructure.CAN_FilterIdHigh =tempid ;//接收板的CAN地址CAN_FilterInitStructure.CAN_FilterIdLow =0x0004;//选择扩展标识符(见手册CAN_RIxR)CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xffff;//接收板的地址要和tempid一致CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0004;//下面有介绍CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIF O0; //选择FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能过滤器CAN_FilterInit(&CAN_FilterInitStructure); //进入初始化函数/* CAN FIFO0 message pending interrupt enable */CAN_ITConfig(CAN_IT_FMP0, ENABLE); //FIFO0 消息挂号中断屏蔽CAN_ITConfig(CAN_IT_TME, ENABLE); //发送邮箱空中断屏蔽CAN_ITConfig(CAN_IT_BOF, ENABLE); //离线中断允许第二步,在嵌套向量中断控制中设置下,代码如下:NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM/* Set the Vector T able base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else /* VECT_TAB_FLASH *//* Set the Vector T able base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endif/* Enable CAN RX0 interrupt IRQ channel */ //接收中断NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN_RX0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//发送中断,如果是查询方式发送的话,下面代码不要NVIC_InitStructure.NVIC_IRQChannel=USB_HP_CAN_TX_IRQ Channel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢先中断优先NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应中断优先NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);第三步,编写发送子函数CanTxMsg TxMessage; //定义数据结构类型变量u8 TransmitMailbox = 0;u16 i = 0;TxMessage.ExtId=(tempid << 13); //tempId 为接受板地址,应用过程中要左移13位TxMessage.IDE=CAN_ID_EXT;//使用扩展帧TxMessage.RTR=CAN_RTR_DATA;//发送数据帧TxMessage.DLC= 1; //设置发送数据的长度TxMessage.Data[0] = SendData;//赋值待发送TransmitMailbox = CAN_Transmit(&TxMessage);//开始发送数据i = 0;//通过检查CANTXOK位来确认发送是否成功while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF)){i++;}第四步,编写中断接收函数,注:下面代码在stm32f10x_it.c中编写Void USB_LP_CAN_RX0_IRQHandler(void){CanRxMsg can_rx_one_frame; //定义接收数据变量CAN_Receive(CAN_FIFO0,&can_rx_one_frame);//接收数据函数Receive_data = can_rx_one_frame.Data[0];//接收到的数据转存给变量Receive_dataCAN_FIFORelease(CAN_FIFO0);// 释放一 FIFO0}。

STM32的CAN总线使用指南

STM32的CAN总线使用指南

CAN基本知识:CAN协议的特点:1、多主机控制。

在总线空闲时,所有单元都可以发送消息,若两个以上同时开始发送消息,根据标识符来决定优先级。

优先级高的先发送。

2、系统的若软性。

与总线相连的单元没有类似地址的信息。

因此在总线上增加单元时,应用层程序基本不需要改变。

3、通信速度快,通信距离远。

最高1Mbps(距离小于40M),最远可达10Km(速率低于5Kbps)。

4、具有错误检测、错误通知和错误恢复功能。

所有单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元,正在发送消息的单元一旦检测出错误,会强制结束当前的发送。

前置结束发送的单元会不断反复地重新发送该消息直到发送成功。

5、故障封闭功能。

CAN可以判断出错误的类型是总线上的数据错误还是持续的数据错误。

由此功能,当总线上发生持续数据错误时,可以将引起此故障的单元从总线上隔离出去。

6、连接节点多。

CAN总线是可同时连接多个单元的总线。

可连接的单元总数理论上是没有限制的。

单实际上受到时间延迟和电气负载的限制。

降低通信速度,可连接单元增加。

反之,反之。

STM32的CAN 时间特性(有关波特率):与CAN2.0B的协议内容相比,STM32的CAN时间特性稍微有些区别。

STM32把传播时间段和相位缓冲段1合并了,因此STM32的CAN一个位只有3段:同步段(SYNC_SEG)、时间段1(BS1)和时间段2(BS2)。

STM的BS1段可以设置为1-16个时间单元,刚好等于传播时间段和相位缓冲段1之和。

波特率=1/正常的位时间正常的位时间=1×tq+tbs1+tbs2其中:tbps1=tq×(TS1[3:0]+1)tbps2=tq×(TS2[3:0]+1)tq=(BRP[9:0]+1)×tpclktq是一个时间单元tpclk是APB时钟的时间周期因此,我们只需要知道BS1和BS2的设置,以及APB1的时钟频率(一般为36MHz),就可以方便的计算出波特率。

stm32之CAN发送、接收详解

stm32之CAN发送、接收详解

stm32之CAN发送、接收详解CAN接收报⽂并过滤之标识符过滤:(重点、难点) 在CAN协议⾥,报⽂的标识符不代表节点的地址,⽽是跟报⽂的内容相关的。

因此,发送者以⼴播的形式把报⽂发送给所有的接收者。

节点在接收报⽂时-根据标识符的值-决定软件是否需要该报⽂;如果需要,就拷贝到SRAM⾥;如果不需要,报⽂就被丢弃且⽆需软件的⼲预。

为满⾜这⼀需求,bxCAN为应⽤程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报⽂。

硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从⽽占⽤⼀定的CPU开销。

每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

这两个寄存器⽤途在下⾯有⼤⽤处;可变的位宽:  每个过滤器组的位宽都可以独⽴配置,以满⾜应⽤程序的不同需求。

根据位宽的不同,每个过滤器组可提供: 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位===⽤于扩展ID(28位)和标准ID(11位) 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位====只⽤于标准ID 可参见图126 此外过滤器可配置为,屏蔽位模式和标识符列表模式。

屏蔽位模式 在屏蔽位模式下,标识符寄存器和屏蔽寄存器⼀起,指定报⽂标识符的任何⼀位,应该按照“必须匹配”或“不⽤关⼼”处理。

标识符列表模式 在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器⽤。

因此,不是采⽤1个标识符加1个屏蔽位的⽅式,⽽是使⽤2个标识符寄存器。

接收报⽂标识符的每⼀位都必须 跟过滤器标识符相同。

BxCAN过滤器的编号 在stm32中,过滤器编号⽤于加速CPU对收到报⽂的处理。

当受到⼀个有效报⽂时,BxCAN会将收到的报⽂以及它所通过的过滤器编号,⼀起存⼊邮箱中。

当CPU处理时,可以根据过滤器编号,快速地知道该报⽂的⽤途,从⽽做出处理。

03--STM32之CAN---发送管理分析

03--STM32之CAN---发送管理分析

STM32之CAN---发送管理分析1 CAN发送邮箱STM32共有三个CAN发送邮箱,在检测到总线空闲时交发送,但需要注意的是,有可能会发送失败,有可能因为仲裁失败从而导致失败,也有可能是其它错误,原则上bxCAN将自动重发,但bxCAN也可以配置不自动重发。

正因为如此,发送邮箱中有可能同时存在多个需要发送的报文,一旦出现这种情况,那么发送邮箱中的多个报文又将是谁先发送谁后发送呢?有两种模式:ID模式和FIFO模式。

ID模式由报文的ID值决定,即ID值越小,优先级越高,另一种FIFO模式,顾名思义,即为消息队列方式,谁先到谁先发送,此种模式下三个邮箱与接收FIFO类似。

下图是发送邮箱的状态图:图1由上图可知,发送邮箱共有四种状态,空状态,挂号状态,预定发送状态(scheduled),发送状态。

发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。

TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。

TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。

一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。

一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。

一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。

如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’。

2 发送优先级如之前所述,如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。

此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。

STM32CAN滤波器、滤波屏蔽器设置详解

STM32CAN滤波器、滤波屏蔽器设置详解

STM32 CAN 过滤器、滤波屏蔽器配置总结下面容为:一、在STM32互联型产品中,CAN1和CAN2分享28个过滤器组,其它STM32F103xx系列产品中有14个过滤器组,用以对接收到的帧进行过滤。

1、过滤器组每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。

这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上"过"一下,能通过的报文是有效报文,收进相关联FIFO(FIFO1或FIFO2),不能通过的是无效报文(不是发给"我"的报文),直接丢弃。

(标准CAN的标志位长度是11位。

扩展格式CAN的标志位长度是29。

CAN2.0A协议规定CAN控制器必须有一个11位的标识符。

CAN2.0B协议中规定CAN控制器的标示符长度可以是11位或29位。

STM32同时支持CAN2.0A/CAN2.0B协议。

)每组过滤器组有两种工作模式:标识符列表模式和标识符屏蔽位模式。

标识符屏蔽位模式:可过滤出一组标识符。

此时,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。

标识符列表模式:可过滤出一个标识。

此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。

注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐起。

所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。

按工作模式和宽度,一个过滤器组可以变成以下几中形式之一:(1) 1个32位的屏蔽位模式的过滤器。

STM32的CAN过滤器详解

STM32的CAN过滤器详解

STM32的CAN过滤器详解STM32普通型芯片的CAN有14组过滤器组,互联型有28组过滤器组.一般我们用的都是普通型的,所以在本文中可以说STM32有14组过滤器组.根据配置,每1组过滤器组可以有1个,2个或4个过滤器.这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上"过"一下,能通过的报文是有效报文,收进FIFO中,不能通过的是无效报文(不是发给"我"的报文),直接丢弃.所有的过滤器是并联的,即,一个报文只要通过了一个过滤器,就是算是有效的.每组过滤器组有两种工作模式: 标识符列表模式,标识符屏蔽位模式.在标识符列表模式下,收到报文的标识符必须与过滤器的值完全相等,才能通过.在标识符屏蔽位模式下,可以指定标识符的哪些位为何值时,就算通过.这其实就是限定了处于某一范围的标识符能够通过.在一组过滤器中,整组的过滤器都使用同一种工作模式.另外,每组过滤器中的过滤器宽度是可变的,可以是32位或16位.由工作模式和宽度,一个过滤器组可以变成以下几中形式之一:(1) 1个32位的屏蔽位模式的过滤器.(2) 2个32位的列表模式的过滤器.(3) 2个16位的屏蔽位模式的过滤器.(4) 4个16位的列表模式的过滤器.所有的过滤器是并联的,即,一个报文只要通过了一个过滤器,就是算是有效的.每组过滤器组有两个32位的寄存器用于存储过滤用的"标准值",分别是FxR1,FxR2.在32位的屏蔽位模式下:有1个过滤器,FxR2用于指定需要关心哪些位,FxR1用于指定这些位的标准值.在32位的列表模式下:有两个过滤器.FxR1指定过滤器0的标准值,收到报文的标识符只有跟FxR1完全相同时,才算通过.FxR2指定过滤器1的标准值.在16位的屏蔽位模式下:有2个过滤器.FxR1配置过滤器0,其中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值.FxR2配置过滤器1,其中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值.在16位的列表模式下:有4个过滤器.FxR1的[15-0]位配置过滤器0,FxR1的[31-16]位配置过滤器1.FxR2的[15-0]位配置过滤器2,FxR2的[31-16]位配置过滤器3.STM32的CAN有两个FIFO,分别是FIFO0,FIFO1.为了便于区分,下面FIFO0写作FIFO_0,FIFO1写作FIFO_1.每组过滤器组必须关联且只能关联一个FIFO.复位默认都关联到FIFO_0.所谓"关联",是指假如收到的报文从某个过滤器通过了,那么该报文会被存到该过滤器相连的FIFO.从另一方面来说,每个FIFO都关联了一串的过滤器组,两个FIFO刚好瓜分了所有的过滤器组每当收到一个报文,CAN就将这个报文先与FIFO_0关联的过滤器比较,如果被匹配,就将此报文放入FIFO_0中.如果不匹配,再将报文与FIFO_1关联的过滤器比较,如果被匹配,些报文就放入FIFO_1中.如果还是不匹配,此报文就被丢弃.每个FIFO的所有过滤器都是并联的,只要通过了其中任何一个过滤器,该报文就有效.如果一个报文既符合FIFO_0的规定,又符合FIFO_1的规定,显然,根据操作顺序,它只会放到FIFO_0中.每个FIFO中只有激活了的过滤器才起作用,换句话说,如果一个FIFO有20个过滤器,但是只激话了5个,那么比较报文时,只拿这5个过滤器作比较.一般要用到某个过滤器时,在初始化阶段就直接将它激活.需要注意的是,每个FIFO必须至少激活一个过滤器,它才有可能收到报文.如果一个过滤器都没有激活,那么是所有报文都报废的.一般的,如果不想用复杂的过滤功能,FIFO可以只激活一组过滤器组,且将它设置成32位的屏蔽位模式,两个标准值寄存器(FxR1,FxR2)都设置成0.这样所有报文均能通过.STM32 CAN中,另一个较难理解的就是过滤器编号.过滤器编号用于加速CPU对收到报文的处理.收到一个有效报文时, CAN会将收到的报文, 以及它所通过的过滤器编号, 一起存入接收邮箱中,CPU在处理时,可以根据过滤器编号,快速的知道该报文的用途,从而作出处理.不用过滤器编号其实也是可以的, 这时候CPU就要分析所收报文的标识符, 从而知道报文的用途.由于标识符所含的信息较多,处理起来就慢一点了.STM32使用以下规则对过滤器编号:(1) FIFO_0和FIFO_1的过滤器分别独立编号,均从0开始按顺序编号.(2) 所有关联同一个FIFO的过滤器,不管有没有被激活,均统一进行编号.(3) 编号从0开始,按过滤器组的编号从小到大,按顺序排列.(4) 在同一过滤器组内,按寄存器从小到大编号.FxR1配置的过滤器编号小,FxR2配置的过滤编号大.(5) 同一个寄存器内,按位序从小到大编号. [15-0]位配置的过滤器编号小,[31-16]位配置的过滤器编号大.(6) 过滤器编号是弹性的. 当更改了设置时,每个过滤器的编号都会改变.但是在设置不变的情况下,各个过滤器的编号是相对稳定的.这样,每个过滤器在自己在FIFO中都有编号.在FIFO_0中,编号从0 -- (M-1), 其中M为它的过滤器总数.在FIFO_1中,编号从0 -- (N-1), 其中N为它的过滤器总数.一个FIFO如果有很多的过滤器, 可能会有一条报文, 在几个过滤器上均能通过,这时候, 这条报文算是从哪儿过来的呢?STM32在使用过滤器时,按以下顺序进行过滤(1) 位宽为32位的过滤器,优先级高于位宽为16位的过滤器(2) 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式(3) 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高按这样的顺序,报文能通过的第一个过滤器,就是该报文的过滤器编号,被存入接收邮箱中。

stm32cubemx can 过滤 例子

stm32cubemx can 过滤 例子

【主题:STM32CubeMX CAN 过滤示例】在进行STM32CubeMX CAN 过滤示例的讨论之前,首先要了解CAN(Controller Area Network)总线的基本概念。

CAN总线是一种现代化的控制系统网络通信协议,广泛应用于汽车、工业控制、航空航天等领域。

它具有高速、实时性好、抗干扰、可靠性高等优点,因此受到广泛关注和应用。

STM32作为一类嵌入式微控制器,具有丰富的外设资源,其中就包括CAN控制器。

在STM32CubeMX中,提供了丰富的示例和库函数,方便开发者快速上手CAN通信。

在CAN通信中,消息过滤是一个重要的概念。

消息过滤可以帮助系统在繁忙的总线上筛选出需要的信息,减轻系统负担。

对于STM32CubeMX中的CAN过滤示例,在实际应用中非常常见。

该示例可以帮助开发者了解如何在CAN总线通信中进行消息过滤,从而提高系统的效率和可靠性。

在这个示例中,我们可以看到STM32CubeMX提供了丰富的CAN 过滤配置选项。

开发者可以根据自己的实际需求,针对性地配置过滤器,使系统能够精确地接收和处理需要的CAN消息。

这对于复杂的控制系统来说尤为重要,因为系统往往需要与多个节点进行通信,而每个节点发送的消息可能都不尽相同。

在实际的开发过程中,我们可以通过修改CAN过滤器的设置,来观察系统的实际表现。

通过对比不同设置下系统的接收消息数量和类型,我们可以更好地理解消息过滤器的作用和原理。

这对于初学者来说非常有益,因为通过实际调试可以更好地理解抽象的概念。

对于有经验的开发者来说,这也是一个更好地了解STM32CubeMX CAN过滤器配置选项的机会。

STM32CubeMX中的CAN过滤示例为开发者提供了一个很好的学习和实践评台。

通过这个示例,开发者能够更好地理解CAN消息过滤的概念和原理,同时也能够熟悉STM32CubeMX的使用方法。

在实际项目中,这些知识和经验必将大有裨益。

通过对STM32CubeMX CAN过滤示例的深入学习和实践,我们可以更好地理解CAN通信中的消息过滤概念和原理,提高系统的可靠性和效率。

03--STM32之CAN---发送管理分析

03--STM32之CAN---发送管理分析

STM32之CAN---发送管理分析1 CAN发送邮箱STM32共有三个CAN发送邮箱,在检测到总线空闲时交发送,但需要注意的是,有可能会发送失败,有可能因为仲裁失败从而导致失败,也有可能是其它错误,原则上bxCAN将自动重发,但bxCAN也可以配置不自动重发。

正因为如此,发送邮箱中有可能同时存在多个需要发送的报文,一旦出现这种情况,那么发送邮箱中的多个报文又将是谁先发送谁后发送呢?有两种模式:ID模式和FIFO模式。

ID模式由报文的ID值决定,即ID值越小,优先级越高,另一种FIFO模式,顾名思义,即为消息队列方式,谁先到谁先发送,此种模式下三个邮箱与接收FIFO类似。

下图是发送邮箱的状态图:图1由上图可知,发送邮箱共有四种状态,空状态,挂号状态,预定发送状态(scheduled),发送状态。

发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。

TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。

TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。

一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。

一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。

一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。

如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’。

2 发送优先级如之前所述,如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。

此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。

STM32之CAN---CANID过滤器分析

STM32之CAN---CANID过滤器分析

、八、,刖言在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。

因此,发送者以广播的形式把报文发送给所有的接收者。

节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到 SRAM里;如果不需要,报文就被丢弃且无需软件的干预。

为满足这一需求,bxCAN为应用程序提供了 14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。

硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。

每个过滤器组 x由2个32位寄存器,CAN_FxRO 和CAN_FxR1 组成。

为了让大家了解STM32的bxCAN的接收过滤机制,首先大家需要了解几个概念。

2几个重要的概念2.1过滤器组STM32总共提供14个过滤器组来处理 CAN接收过滤问题,每个过滤器组包含两个 32位寄存器CAN_FxR0和 CAN_FxR1组成,在设置为屏蔽位模式下,其中一个作为标识符寄存器,另一个作为屏蔽码寄存器。

过滤器组中的每个过滤器,编号(叫做过滤器号)从0开始,到某个最大数值(这时最大值并非 13,而是取决于14个过滤器组的模式和位宽的设置,当全部配置为位宽为16,且为标识符列表模式时,最大编号为14*4-1=55 )。

2.2过滤器的过滤模式STM32提供两种过滤模式供用户设置:屏蔽位模式和标识符列表模式。

2.2.1屏蔽位模式为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。

在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照必须匹配”或不用关心”处理。

2.2.2标识符列表模式为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。

在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。

因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。

接收报文标识符的每一位都必须跟过滤器标识符相同。

2.3过滤器的位宽每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

各位大侠:
最近在搞CAN(STM32F105)。

阅读的资料为:ST官方的固件库说明和用户手册,固件库版本V3.5。

关于过滤器的设计:
官方例程中:接收的CAN1配置成如下:
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x6420;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
发送端CAN2配置成如下,
TxMessage.StdId = 0x321;
TxMessage.ExtId = 0x01;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 1;
1问:TxMessage.StdId = 0x321是如何与CAN1的过滤器配成对的?
例程中又将CAN2接收端配置为
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x2460;
而CAN1发送配置不变。

2问:这就奇怪了,TxMessage.StdId = 0x321又是如何与CAN2的过滤器配成对的?
LZ需要看STM32的reference manual,看中文的也可以。

关键要看CAN的 Filter的数据结构,如下:
发送端CAN2配置成如下,
TxMessage.StdId = 0x321;
TxMessage.IDE = CAN_ID_STD;
说明发送端使用的是标准ID【11位】,为 011 0010 0001【低位对齐到bit0】根据上图Filter的数据结构,接收端FilterIdHigh【高16位】应该为:0110 0100 0010 0000 【STID对齐到bit15】,即对应于接收端CAN_FilterIdHigh = 0x6420;。

相关文档
最新文档