1.CAN最大的优点是可以实现多机通信,适合工业控制组网的应用,有专门的PCI板卡可以将CAN连接的PC机上,对网络监控
2.CAN总线出了电源线之外就是CANH和CANL两个线,CAN对总线上点评的解析靠这两根线同时完成,即时
CAN总线上的电平分为隐形和现行两种。
3.CAN总线的最大通信速率,就是波特率,小于等于1Mbps
4.它的荣从能力较强,可以设置仲裁错误,自动重发等等高级操作。
5.CAN网络中多机通信主要是通过标示符来分辨主从两节点的。主机发总报文后,在总线上的所有CAN从机都能接收到报文,每个CAN模都配置有自己的过滤器组,他们最网络上的报文ID进行过滤,保存需要的报文到邮箱里面。非过滤规则的报文将会自动丢弃,不会存入邮箱。
下面介绍CAN的数
据帧和标示符:
标示符和屏蔽位过滤组:
每次发送数据之前都要先将数据信息写入到一个空的发送邮箱的寄存器中,包括标识福寄存器和数据寄存器,时间戳数据长度寄存器,一帧数据的组成如下:
分为扩展帧和标准帧两种,他们的区别主要在于标示符的长度。扩展帧中标示符ID程度有29为,标准帧中标示符长度只有11位。发送邮箱标示符寄存器如下:
不论选择那种模式,都会保存在这个寄存器中。IDE是标示符类型的选择位,置1选择扩展RTR是帧类型,分数据帧和远程帧,最后一位是发送请求。
根据上面的寄存器,在初始化过滤器组的时候应该注意一下移位操作。
过滤器组配置分为来那个中模式,其一、就是屏蔽位模式,其二、标示符列表模式。首先共有27个过滤器组,F103有14个,而每个过滤器组有两个标示符过滤的寄存器,可配置成16或32位。
屏蔽位模式下面,两个寄存器一个用来装期望得到标示符,一个用来装屏蔽位配置,屏蔽位类似于掩码的概念,屏蔽位置0的对应期望得到的标示符的该位在过滤时候不关心,置1的时候则要求该位要与对应的期望得到的标示符中的该位一致。另一种列表模式则要求,收到的报文的标示符必须与期望值完全一致。
CanFilter_Init.CAN_FilterNumber = 0; //过滤器组使能
CanFilter_Init.CAN_FilterMode = CAN_FilterMode_IdMask;
// CanFilter_Init.CAN_FilterMode = CAN_FilterMode_IdList;
CanFilter_Init.CAN_FilterScale = CAN_FilterScale_32bit;
// CanFilter_Init.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;
CanFilter_Init.CAN_FilterIdHigh=(uint16_t)(ExCAN_ID>>13);
CanFilter_Init.CAN_FilterIdLow= (uint16_t)(ExCAN_ID<<3)|CAN_Id_Extended|CAN_RTR_DATA;
CanFilter_Init.CAN_FilterMaskIdHigh = 0x0000ffff;
CanFilter_Init.CAN_FilterMaskIdLow = 0x0000ffff<<3|0x04;
// CanFilter_Init.CAN_FilterIdHigh=(0x00000021<<(21-16));
// CanFilter_Init.CAN_FilterIdLow= (0x00000021<<21);
// CanFilter_Init.CAN_FilterMaskIdHigh = 0x0000ffff<<(21-16);
// CanFilter_Init.CAN_FilterMaskIdLow = 0x0000ffff<<21;
CanFilter_Init.CAN_FilterActivation=ENABLE; //激活过滤器
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInit(&CanFilter_Init);
配置时候的麻烦在于,使用库函数时,由于对于IDH和IDHmask的处理是取低16位然后左移16位就直接赋值给了过滤器组的FIR寄存器;IDL和IDLmask也是直接取低16位然后赋值给了FIR,所以对于某个报文的ID需要做一位处理之后才能得到需要赋值给寄存器的数值。如果是扩展标示符,应该先将扩展ID左移3位得到在寄存器中的位置,然后将它分别移位得到高16和低16然后赋值,所以取高16位应先左移3位在右移16位合起来左移(3-16)是右移13位,而低16位是左移3位后直接取低16。MASK位也同理。如果出了想过滤ID还想过滤寄存器低三位一般是IDE,那么取得低16位之后再或上CAN_Id_Extended就行了,IDmask对应的或上第三位的屏蔽位,就是0x04.
同理对于标准帧模式下的设置一样应该先左移21位,然后分别取出低16位。
其中CanFilter_Init.CAN_FilterNumber是初始化FAR寄存器激活某个过滤器组。
CanFilter_Init.CAN_FilterMode是初始化FM1R模式选择。
CAN_FilterInitStructure.CAN_FilterFIFOAssignment设置过滤完后关联的FIFO。
至此基本可以完成过滤器组的初始化了!
波特率设置:
波特率是每个位的时间的倒数,在STM32中每一位的时长分为三段,在STM32中这些为的时长是可编程的:
设置每个段的时长,时长是实常数乘以时间单位,时间单位是CAN所使用的时钟基准,即它所挂载的系统时钟的分频,而单位时间也是可编程的
BPR是对应的时间单元的编程位:tq= (BRP[9:0]+1) x tpclk
TS1和TS2就是是段1和时段2的长度的编程位:tBS2= t CAN x (TS2[2:0] + 1)。。
用库函数编程:
//CANµÄ²¨ÌØÂÊÉèÖÃ
Can_Init.CAN_Mode= CAN_Mode_LoopBack;
Can_Init.CAN_SJW=CAN_SJW_1tq;
Can_Init.CAN_BS1=CAN_BS1_8tq;
Can_Init.CAN_BS2=CAN_BS2_7tq;
Can_Init.CAN_Prescaler=5;
CAN_Init(CAN1, &Can_Init);
至此波特率设置完成。
CAN1主控制配置如下:
//CANµÄÖ÷¿ØÖƼĴæÆ÷
Can_Init.CAN_TTCM = DISABLE;
Can_Init.CAN_ABOM=DISABLE;
Can_Init.CAN_AWUM=DISABLE;
Can_Init.CAN_NART=ENABLE;
Can_Init.CAN_RFLM=DISABLE;
Can_Init.CAN_TXFP=DISABLE;
可以按照CAN_InitTypeDef的内容进行配置。
中断配置:
按照STM32的中断配置方式将对应外设的中断使能,然后将对应外设中断连接的系统中断通道使能,设置中断优先级即可。
在STM32中外设的某些中断是共用一个中断通道的,而这些中断的先后顺序要等到进入对应中断通道的服务函数之后软件设置中断的先后顺序。
一般使用的就是发送或者FIFO邮箱接收报文的中断。使用接收中断的配置如下:
//ʹÄÜCAN1µÄFIFO0ÖжÏFIFO0£¬ÏûÏ¢¹ÒºÅÖжÏ
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
//ÖжÏÓÅÏȼ¶µÄ·Ö×é
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//NVIC³õʼ»¯ÖжÏ
nvic.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 0x02;
nvic.NVIC_IRQChannelSubPriority = 0x02;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
中断函数,和中断向量名可以在启动文件startup_stm32f10x_hd.s查到。
而中断的定义可以在stm32f10x.h中查到。