参考的为野火的教程(开发板是指南者,只能做回环测试,但是没关系,主要是记录can协议的用法和can外设,canopen协议写完了can协议再说。
一、理论部分
1 can协议的介绍
首先介绍一下can、如图,只是介绍一下背景。
![](https://img-blog.csdnimg.cn/90c9b8f7fe0c424ba1779da4b6590de8.png)
2、can物理层
和iic和spi这些不一样,can是异步通讯,然后最后通过转换转换为差分信号,但是和modbus不一样,他不是直接通过串口转差分就能用了,使用的不是串口协议,而是做了一些处理,最后形成了can协议,然后can分为开环和闭环两种下面会讲到
![](https://img-blog.csdnimg.cn/b5a94462e7044e48b9826da84afa5988.png)
1)闭环通讯
一般使用闭环总线:速度快 1M,左右必须接一个120欧的电阻形成闭环,这个不管你有几个设备只用在左右两个设备接入就行了。
![](https://img-blog.csdnimg.cn/e2e3cacdcb9b478fb9f0d03eecdc4c57.png)
2)开环通讯
在总线上加上两个2.2千欧的电阻就行,但是速度比较慢,只有125kbps最快但是距离长,可能can协议本来就是车机用的比较多,所以赶紧拉长线的工业用的可能是modbus比较多。
![](https://img-blog.csdnimg.cn/6bf58a047f764a389b5474e3d147125a.png)
3 通讯节点
can不对设备编码,而是对数据编码(以前学的iic、spi、modbus都是设备进行编码),所以节点数不受限制。
can也需要一个收发器:协议归协议、我们还是需要收发器将TTL电平转换为差分信号输出,或者将收到的差分信号转为ttl电平读回来。转换规则后面再说。
![](https://img-blog.csdnimg.cn/c34a7cd4a9f047e58c7d2f6fa2ac4138.png)
4 什么是差分信号
差分在模拟电子技术中叫的是差模信号,主要就是 减小噪声(也就是干扰)具体就是信号取这两根线的差值(并且由于这两根线挨的很近所以两根线基本上会一起收到干扰信号会一起发生变化)
从图中可以看出差分信号是由两个信号的差决定的
![](https://img-blog.csdnimg.cn/7f9f2a82c23647eeacdfcadf23c98d06.png)
这是具体的优点描述,可以看一下,和我刚刚说的差不多,只不过很具体。
![](https://img-blog.csdnimg.cn/8c4d6cf8fc724ff9be098853e7d33281.png)
5 can协议中的差分信号
很明显就是压差为0(can为隐性电平)压差为2v 为显性电平 (高速情况下,低速看表同理
![](https://img-blog.csdnimg.cn/3603f6778a6f4523b51e3cf83a47006d.png)
在can协议中,显性电平会更具有优先级,先发起通讯的设备优先级更高,但是如果是同一时间发起的那就需要靠电平判断优先级了(这个优先级在后面ID号和决定ID是否为扩展的那一位有使用到![](https://img-blog.csdnimg.cn/928bd6d444db499fa3852e61d092749c.png)
can是半双工,收发数据得分时进行,并且同一时刻只能有一个发送(前面的判断优先级,如果仲裁结束,优先级低的设备就会自己变为接收,仲裁完之后获得发送权的信息才能发送)
![](https://img-blog.csdnimg.cn/ff11c4cd5b2643c08ef649627c4c38bc.png)
5 协议层
1) 波特率及位时序
异步通讯没有时钟线,都会像串口一样有一个波特率,根据每个设备的波特率来协调设备的传输,
在设备传输的过程中可能会有干扰和误差,即使两个设备都是9600这种波特率,可能也会有一个变为9601之类的,这时候数据接收就会可能错位(设备采集数据大多是固定的采样点)在串口中也通过一些硬件的方式来规避采样点错位了,这个我在串口章节有写,stm32f103系列USART串口收发(单字节_stm32 usart 接收_是小刘不是刘的博客-CSDN博客
串口也会有检测起始帧之类的操作通过多次采集数据来判断是否真的是起始位到来,以此来规避出现错位的可能,can也有在can里面叫做位同步可能这里要麻烦一点。
![](https://img-blog.csdnimg.cn/c0802fcf32a94d8cb9fff2ac3eba3926.png)
2)每一位的时序分解图
can把每一位分为了4个段,SS、PTS、PBS1、PBS2在位里会有一个时间单位叫tq,SS固定1tq,PTS、PBS1、PBS2不固定可以自己配置,采样将会在PBS1结束后采集。
![](https://img-blog.csdnimg.cn/2f53fdf6812f4a33bafdabcfe345c3a2.png)
SS(这4个介绍很抽象不会理解,后面会说具体对齐方式)
叫做同步段,主要是检测跳变沿是否在这个SS段内,如果在这个SS段内就不进行任何的操作,否则就会做一些处理。(固定1tq
![](https://img-blog.csdnimg.cn/97ad27f52dfb4f62acd62464a162ef77.png)
PTS
1-8tq,补偿网络物理延时时间
![](https://img-blog.csdnimg.cn/e9bb786060044d76ad84e45f8f2a0b52.png)
PBS1
补偿边沿阶段的误差
![](https://img-blog.csdnimg.cn/ba765a81a5a84c319400e8492177bf35.png)
PBS2
补偿边沿阶段误差
![](https://img-blog.csdnimg.cn/bb8991b7f73a4081880c1a597371087a.png)
通讯的波特率
![](https://img-blog.csdnimg.cn/10c637c3d0e448bd8801a0aecce187df.png)
同步的过程
前面光写这几个名词很抽象,这里会具体介绍
![](https://img-blog.csdnimg.cn/49014b7ef3ab400dbfa7c76a8f5c5bd6.png)
1、硬同步
总线出现了起始帧,但是没有包含在ss内,这个时候字节硬同步
![](https://img-blog.csdnimg.cn/a582252cf2534120b16181fc09e85e16.png)
二 stm32的can外设
![](https://img-blog.csdnimg.cn/9803547db76a4e9b999cd9241460a53b.png)
先鸽几天把dma和adc dac写完再写modbus和can