目录
- 概述
-
- 具体原理
-
- 优先级的判断
-
- 关于ID 以及掩码模式
- 波特率
- 实战例子
概述
CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO国际标准化的串行通信协议。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统 被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很 多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需 要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进 行了标准化,现在在欧洲已是汽车 络的标准协议。 现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
优先级的判断
说到通信协议的时候,一定会出现,两个数据同时需要CAN进行传输的情况,这个时候就需要来对两个数据进行优先级判断,看谁先发谁后发
#include "can.h"#include "led.h"#include "delay.h"#include "usart.h" //CAN初始化//tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq//tbs2:时间段2的时间单元. 范围:CAN_BS2_1tq~CAN_BS2_8tq;//tbs1:时间段1的时间单元. 范围:CAN_BS1_1tq ~CAN_BS1_16tq//brp :波特率分频器.范围:1~1024; tq=(brp)*tpclk1//波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);//mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//则波特率为:36M/((8+9+1)*4)=500Kbps//返回值:0,初始化OK;// 其他,初始化失败; u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode){ GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure;#if CAN_RX0_INT_ENABLE NVIC_InitTypeDef NVIC_InitStructure;#endif //使能PORTA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能CAN1时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //复用推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //初始化IO GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //上拉输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //初始化IO GPIO_Init(GPIOA, &GPIO_InitStructure); //CAN单元设置 CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式 CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理 CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位) CAN_InitStructure.CAN_NART=ENABLE; //禁止 文自动传送 CAN_InitStructure.CAN_RFLM=DISABLE; // 文不锁定,新的覆盖旧的 CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由 文标识符决定 CAN_InitStructure.CAN_Mode= mode; //模式设置: mode:0,普通模式;1,回环模式; //设置波特率 CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq CAN_InitStructure.CAN_BS2=tbs2; //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~ CAN_BS2_8tq CAN_InitStructure.CAN_Prescaler=brp; //分频系数(Fdiv)为brp+1 CAN_Init(CAN1, &CAN_InitStructure); //初始化CAN1 //过滤器初始化,掩码模式 CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽位模式,设置为掩码模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 //过滤器配置,能通过的标准ID CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; //32位ID CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //屏蔽器配置,接收到的ID 需要严格检测的位,否则不能通过 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00fF;//32位MASK 0表示此位不关心 CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructur
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!