yujietian 发表于 2017-5-18 23:26:25

【转】STM32系列第25篇--CAN总线1

简介:
[*]CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986年率先提出。此后,CAN通过ISO11898及ISO11519进行了标准化。现在在欧洲已是汽车网络的标准协议。
[*]CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。
[*]CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。
特点:
[*]多主控制。总线空闲时,所有单元都可发送消息,而两个以上的单元同时开始发送消息时,根据标识符(ID,非地址)决定优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
[*]系统柔软性。连接总线的单元,没有类似“地址”的信息,因此,在总线上添加单元时,已连接的其他单元的软硬件和应用层都不需要做改变。
[*]速度快,距离远。最高1Mbps(距离<40M),最远可达10KM(速率<5Kbps)。
[*]具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
[*]故障封闭功能。CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
[*]连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
物理特征:总线电平=CAN_H的电压-CAN_L的电压
显性电平对应逻辑0=总线电平为2V左右
隐性电平对应逻辑0=总线电平为0V
http://img.blog.csdn.net/20160412212134986显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。帧种类介绍:
帧种类帧作用
数据帧用于发送单元向接收单元传送数据的帧
遥控帧用于接收单元向具有相同 ID 的发送单元请求数据的帧
错误帧用于当检测出错误时向其它单元通知错误的帧
过载帧用于接收单元通知其尚未做好接收准备的帧
间隔帧用于将数据帧及遥控帧与前面的帧分离开来的帧
注:其中,数据帧和遥控帧有标准格式和扩展格式两种格式。
标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID 。STM32 CAN控制器简介:
[*]支持CAN协议2.0A和2.0B主动模式
[*]波特率最高达1Mbps
[*]支持时间触发通信
[*]具有3个发送邮箱
[*]具有3级深度的2个接收FIFO
[*]可变的筛选器组(也称过滤器组,最多28个,F1普通为14个,互联和F4为28个,另外F4有两个can,F1只有一个)
3种模式:
工作模式:
[*]初始化模式(INRQ=1,SLEEP=0)
[*]正常模式(INRQ=0,SLEEP=0)
[*]睡眠模式(SLEEP=1)
测试模式:
[*]静默模式( LBKM=0,SILM=1 )
[*]环回模式( LBKM=1,SILM=0 )
[*]环回静默模式(LBKM=1,SILM=1)
调试模式(不常用)STM32 CAN筛选器位宽和模式配置:CAN的标识符不表示目的地址而是表示发送优先级,接收节点根据标识符的值,来决定是否接收对应消息。
http://img.blog.csdn.net/20160412215247605标识符屏蔽模式:过滤一组标识符
标识符列表模式:过滤一个标识符例:设置筛选器组0工作在:1个32位筛选器-标识符屏蔽模式,然后设置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中存放到CAN_F0R1的值就是期望收到的ID,即(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是设置我们需要必须关心的ID,表示收到的映像,其位和位这16个位的必须和CAN_F0R1中对应的位一模一样,而另外的16个位则不关心,可以一样,也可以不一样,都认为是正确的ID,即收到的映像必须是0XFFxx00xx,才算是正确的(x表示不关心)。波特率设置:TM32F103,设TS1=8、TS2=7、BRP=3,波特率=36000/[(9+8+1)*4]=500Kbps。STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kbps。寄存器:CAN主控制寄存器(CAN_MCR)该寄存器的我们仅介绍下INRQ位,该位用来控制初始化请求。
设置INRQ=0,可使CAN从初始化模式进入正常工作模式。
设置INRQ=1,可使CAN从正常工作模式进入初始化模式。
CAN初始化时,先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器,必须在CAN正常工作之前设置),之后再设置INRQ=0,进入正常工作模式。CAN位时序寄存器(CAN_BTR)设置波特率
CAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R)
CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)
CAN发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x=0~2)
低4位用于设置发送多少个字节,最多为8个字节
CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR) (x=0~2)
CAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)
CAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR) (x=0/1)
CAN接收FIFO邮箱邮箱数据寄存器(CAN_RDLxR/CAN_RDHxR) (x=0/1)
CAN筛选器模式寄存器(CAN_FM1R)(0标识符屏蔽,1标识符列表)
CAN筛选器尺度寄存器(CAN_FS1R)(0双16位,1单32位)
CAN筛选器FIFO关联寄存器(CAN_FFA1R)(0筛选器分到FIFO0,1筛选器分到FIFO1)
CAN筛选器激活寄存器(CAN_FA1R)(0未激活,1激活)
CAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)(F103筛选器只有14个)配置步骤:①配置相关引脚的 复用功能,使能CAN时钟。N的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA11为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX引脚),并使能PA口的时钟(CAN_TX引脚),并使能PA口的时钟②设置CAN工作模式及波特率等。通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。 最后设置INRQ为0,退出初始化模式。③设置滤波器。本例程,我们将使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。

bigfanofloT 发表于 2017-5-19 11:59:28

前来顶帖
页: [1]
查看完整版本: 【转】STM32系列第25篇--CAN总线1