点击上方蓝字谈思实验室
获取更多汽车网络安全资讯
1. CAN协议
1.1 CAN协议简介
1.2 CAN物理层
遵循ISO11898标准的高速、短距离闭环网络,总线最大长度为40m,通信速度最高为 1Mbps,总线的两端各要求有一个120欧的电阻
是遵循ISO11519-2标准的低速、远距离开环网络,最大传输距离为1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个2.2千欧的电阻
1.3 CAN协议层
⏩ 位时序分解:为了实现位同步,CAN协议把每一个数据位的时序分解成SS段、PTS段、PBS1段、PBS2段,这四段的长度加起来即为一个CAN数据位的长度。分解后最小的时间单位是Tq,一个完整的位由8~25个Tq组成
例如,假设上图中的 1Tq=1us,而每个数据位由 19 个 Tq 组成,则传输一位数据需要时间 T1bit=19us,从而每秒可以传输的数据位个数为:1x10次方/19 = 52631.6 (bps)。这个每秒可传输的数据位的个数即为通讯中的波特率。
⏩ 同步过程:波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,此时就要用到数据位内的SS、PTS、PBS1及PBS2段了。根据对段的应用方式差异, CAN的数据同步分为硬同步和重新同步。其中硬同步只是当存在帧起始信号时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题
硬同步:CAN节点通过总线发送数据时,会发送一个帧起始信号。而挂载到CAN总线上的节点在不发送数据时,会时刻检测总线上的信号。如下图,当总线出现帧起始信号时,节点检测到总线的帧起始信号不在节点内部时序的 SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的 SS 段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了
重新同步:前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步。与硬同步方式相似的是它们都使用 SS 段来进行检测,同步的目的都是使节点内的 SS 段把跳变沿包含起来。重新同步分为超前和滞后两种情况,以总线跳变沿与 SS 段的相对位置进行区分。
-- 相位超前:节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2Tq,这时控制器在下一个位时序中的 PBS1 段增加 2Tq 的时间长度,使得节点与总线时序重新同步
-- 相位滞后:节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长度,获得同步
⏩ 报文种类及结构:对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。CAN一共规定了5种类型的帧
数据帧的结构:数据帧是在CAN通讯中最主要、最复杂的报文,它的结构如下图
其他报文结构
2. CAN控制器
STM32有两组CAN控制器,其中CAN1是主设备,框图中的存储访问控制器是由CAN1控制的,CAN2无法直接访问存储区域,所以使用CAN2的时候必须使能CAN1外设的时钟。框图中主要包含CAN控制内核、发送邮箱、接收FIFO以及验收筛选器,下面对框图中的各个部分进行介绍
2.1 CAN控制内核
INRQ位:用来控制初始化请求,在CAN初始化时,先设置该位为1,进行初始化,之后再设置该位为0,让CAN进入正常工作模式
CAN波特率的计算公式:只需要知道BS1和BS2的设置,以及APB1的时钟频率,就可以方便的计算出波特率。比如设置TS1=9、TS2=5和BRP=6,在APB1频率为45Mhz的条件下,即可得到CAN通信的波特率=45000/6/(5+9+1)=500Kbps
2.2 CAN发送邮箱
当使用CAN外设发送报文时,需要把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可把数据发送出去。其中标识符寄存器CAN_TIxR中的STDID寄存器位比较特别。我们知道CAN的标准标识符的总位数为11位,而扩展标识符的总位数为29位的。当报文使用扩展标识符的时候,标识符寄存器CAN_TIxR中的STDID[10:0]等效于EXTID[18:28]位,它与EXTID[17:0]共同组成完整的29位扩展标识符
⏩ 发送邮箱标识符寄存器CAN_TIxR
⏩ 发送邮箱低字节数据寄存器CAN_TDLxR
⏩ 发送邮箱高字节数据寄存器CAN_TDHxR
2.3 CAN接收FIFO
⏩ 接收FIFO邮箱数据长度和时间戳寄存器CAN_RDTxR
⏩ 接收FIFO邮箱低字节数据寄存器CAN_RDLxR
⏩ 接收FIFO邮箱高字节数据寄存器CAN_RDHxR
2.4 CAN验收筛选器
根据筛选ID长度来分类有有以下两种:
检查 STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位,共 31 位
检查 STDID[10:0]、RTR、IDE 和 EXTID[17:15],共 16 位
根据过滤的方法分为以下两种模式:
标识符列表模式,它把要接收报文的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
掩码模式,它把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码 (关键字) 相同,就符合要求,报文就会被保存到接收 FIFO
通过配置筛选模式寄存器CAN_FM1R的FBMx位可以设置筛选器工作在哪个模式。通过配置筛选尺度寄存器CAN_FS1R的FSCx位可以设置筛选器工作在哪个尺度。不同的尺度和不同的过滤方法可使筛选器工作在图 的 4 种状态
⏩ 过滤器尺度寄存器CAN_FS1R
⏩ 过滤器FIFO分配寄存器CAN_FFA1R
⏩ 过滤器激活寄存器CAN_FA1R
⏩ 过滤器组i的寄存器x CAN_FiRx
来源:一口Linux