作为无人机方面做嵌入式编写的飞控总结1-基本协议驱动介绍2-can编程小结

1.can协议-物理层

   (1) 与 I2C、SPI等具有时钟信号的同步通讯方式不同,CAN通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有 CAN_High和 CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯(485通讯也是差分信号,提高抗干扰)。



如图:控制器与收发器之间通过CAN_Tx 及 CAN_Rx信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low信号线相连;

其中 CAN_Tx 及 CAN_Rx使用普通的类似 TTL逻辑信号,而 CAN_High及CAN_Low 是一对差分信号线;

(2)CAN通讯节点:由一个 CAN控制器及 CAN收发器组成;CAN总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。

当 CAN节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和 CAN_Low 线输出到 CAN 总线网络。

接收数据:通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的 CAN_High及 CAN_Low信号转化成普通的逻辑电平信号,通过 CAN_Rx输出到控制器中;

 (3)CAN 收发器:ttl到232的电平转换会有一个MAX232,TTL到485会有一个MAX485,同样,ttl和can也有一个转换芯片:TJA1050;

如图:


(4)差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差
分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线

的电压差值来表示逻辑 0和逻辑 1。

相对于单信号线传输的方式,使用差分信号传输具有如下优点:

            1)抗干扰能力强     2)有效抑制它对外部的电磁干扰     3)时序定位精确

由于差分信号线具有这些优点,所以在 USB协议、485协议、以太网协议及 CAN协议的物理层中,都使用了差分信号传输。

(5)逻辑电平:以高速 CAN 协议为例,当表示逻辑 1时(隐性电平),CAN_High和 CAN_Low线上的电压均为 2.5v,即它们的电压差 V H -V L =0V;而表示逻辑 0 时(显性电平),CAN_High 的电平为 3.5V,CAN_Low线的电平为 1.5V,即它们的电压差为 V H -V L =2V;例如,当 CAN 收发器从 CAN_Tx线接收到来自 CAN 控制器的低电平信号时(逻辑 0),它会使 CAN_High输出 3.5V,同时 CAN_Low输出 1.5V,从而输出显性电平表示逻辑 0。其他的还有显性逻辑。还有低速的显性和隐性逻辑;逻辑差表如下:

    [在 CAN 总线中,必须使它处于隐性电平(逻辑 1)或显性电平(逻辑 0)中的其中一个状态。假如有两个 CAN通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线的“线与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先的意味。]


===============以上是物理层,以下是协议层=================

2 协议层(数据段和位时序)

(1)7个数据段和两者格式

 SPI 通讯中,片选、时钟信号、数据输入及数据输出这 4 个信号都有单独的信号线;

 I2C 协议包含有时钟信号及数据信号 2条信号线,  异步串口包含接收与发送 2 条信号线;

这些协议包含的信号都比 CAN协议要丰富,它们能轻易进行数据同步或区分数据传输方向。而 CAN使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?答案是                                                                    

答案是是对数据、操作命令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文

报文的处理:在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了;当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN的―数据帧‖。为了更有效地控制通讯,CAN一共规定了 5种类型的帧,它们的类型及用途说明如表


帧起始,这个比较简单,标准帧和扩展帧都是由 1 个位的显性电平表示帧起始



数据段,两者是一样的;

CRC段两者是一样的;

ACK段两者是一样的;

帧结束,这个段也比较简单,标准帧和扩展帧在这个段格式一样,由 7 个位的隐性位组成;

(2)位时序


采样点:采样点,是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。根据这个位时序,我们就可以计算 CAN 通信的波特率了


总线控制权: 在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程,如图


3can的发送和接收过程

CAN 发送流程为:程序选择 1 个空置的邮箱(TME=1)=〉设置标识符(ID),数据长度和发送数据=〉设置 CAN_TIxR 的 TXRQ 位为 1,请求发送=〉邮箱挂号(等待成为最高优先级)=〉预定发送(等待总线空闲)=〉发送=〉邮箱空置。 

 下图中,还包含了很多其他处理,终止发送(ABRQ=1)和发送失败处理等。通过这个流程图,我们大致了解了 CAN 的发送流程,后面的数据发送,我们基本就是按照此流程来走。


CAN接收流程

        CAN 接收到的有效报文,被存储在 3 级邮箱深度的 FIFO 中。FIFO 完全由硬件来管理,从而节省了 CPU 的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取 FIFO输出邮箱,来读取 FIFO 中最先收到的报文。这里的有效报文是指那些正确被接收的(直到 EOF都没有错误)且通过了标识符过滤的报文。前面我们知道 CAN 的接收有 2 个 FIFO,我们每个滤波器组都可以设置其关联的 FIFO,通过 CAN_FFA1R 的设置,可以将滤波器组关联到FIFO0/FIFO1。


4关于程序配置的说明

波特率计算, CAN 波特率的计算公式,我们只需要知道 BS1 和 BS2 的设置,以及 APB1的时钟频率(一般为 42Mhz),就可以方便的计算出波特率。比如设置 TS1=6、TS2=5 和 BRP=5,在 APB1 频率为 42Mhz 的条件下,即可得到 CAN 通信的波特率=42000/[(7+6+1)*6]=500Kbps;


首先,来看 CAN 的主控制寄存器(CAN_MCR):INRQ 位:清 0可使 CAN 从初始化模式进入正常工作模式;置 1 可使 CAN 从正常工作模式进入初始化模式

第二个,介绍 CAN 位时序寄存器(CAN_BTR),该寄存器用于设置分频、Tbs1、Tbs2以及 Tsjw 等非常重要的参数,直接决定了 CAN 的波特率。另外该寄存器还可以设置 CAN 的工作模式:环回模式和静默模式

第三个,我们介绍 CAN 发送邮箱标识符寄存器(CAN_TIxR)(x=0~3);该寄存器主要用来设置标识符(包括扩展标识符),另外还可以设置帧类型

第四个,我们介绍 CAN 发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x=0~2),该寄存器我们本章仅用来设置数据长度,即最低 4 个位

第五个,是 CAN 发送邮箱低字节数据寄存器 (CAN_TDLxR) (x=0~2)

第六个, CAN 接收 FIFO 邮箱标识符寄存器 (CAN_RIxR) (x=0/1)

第七个, CAN 过滤器模式寄存器(CAN_FM1R)

第八个, CAN 过滤器位宽寄存器(CAN_FS1R)

第九个,我们介绍 CAN 过滤器 FIFO 关联寄存器(CAN_FFA1R)

第十个,我们介绍 CAN 过滤器激活寄存器(CAN_FA1R)

最后,我们介绍 CAN 的过滤器组 i 的寄存器 x(CAN_FiRx)(i=0~27;x=1/2)

5代码配置 

1 )配置相关引脚的复用功能 (AF9) ) ,使能 CAN 

2 )设置 CAN  工作模式 及波特率等        3 ) 设置滤波器 。    4 )发送接受消息    5 )CAN  状态获取

6.测试程序




猜你喜欢

转载自blog.csdn.net/xiaoxilang/article/details/80406634