赞
踩
CAN是Controller Area Network的缩写(以下称为CAN)是ISO国际标准化的串行通信协议。
由德国电气商博世公司在1986年率先提出。
此后,CAN通过ISO1 1 898及IS011519进行了标准化。现在在欧洲已是汽车网络的标准协议。
CAN协议经过ISO标准化后有两个标准: ISO1 1 898标准和ISO11519- 2标准。其中ISO1 1898是针对通信速率为125Kbps~1 Mbps的高速通信标准,而ISO1 1519-2是针对通信速率为125Kbps以下的低速通信标准。
CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、,医疗设备、工业设备等方面。
同时具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误( 错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
故障封闭功能。CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线_上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
连接节点多。CAN总线是可同时连接多个单元的总线。可连接的单元总数理论.上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
一次最多只能发送8个字节的数据,这是由CAN协议规定的。多于8个的需要第二次再发送,或者做一个上层的连续多数据发送的函数。
过滤器组
过滤器:可由硬件判断报文中的标识符,过滤掉标识符不匹配的报文。STM32F103系列单片机中的CAN总线控制器提供了14个过滤器组。过滤器是由硬件实现的,只有与过滤器匹配的报文才需要软件处理。
这里仅仅做8位的比较,实际情况是16位或者32位的比较。
FIFO: 表面的意思是“先入先出”,是指有层级深度的接收邮箱。STM32F103系列单片机.上有2个FIFO邮箱,每个FIFO有3层深度。与过滤器匹配的报文会被放入FIFO邮箱。
CAN总线是基于相同波特率通信的,所以设备接入前要知道总线上的波特率是多少。
波特率=(pclk1/((1 +8+7)*9))= 36Mhz/16/9= 250Kbits
具体的修改参数值可在下面修改波特率:
//设置模式和波特率
//波特率=(pclk1/((1+8+7)*9)) = 36Mhz/16/9 = 250Kbits设定了一个时间单位的长度9
#define tsjw CAN_SJW_1tq //设置项目(1~4)
#define tbs1 CAN_BS1_8tq //设置项目(1~16)
#define tbs2 CAN_BS2_7tq //设置项目(1~8)
#define brp 9 //设置项目
过滤器函数的设置如下:
//设置过滤器
CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; //32位ID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。