HAL库进行CAN通讯的程序编写说明1
- 关于CAN 关于CAN的基本知识网上的资料很多,此篇文章只是针对快速应用,让新手对使用CAN有一个基本的了解,如有不对的地方请指正,因为我也是首次应用。 对于CAN,我们需要了解以下的一些概念:
-
CAN的帧 我们只需要知道在CAN中常用到的帧:远程帧与数据帧,设置时与RTR这个参数有关。 对于CAN,CAN是用差分信号进行通讯的,就和串口通讯一样,CAN进行通讯时采用帧的结构,这个帧会包含帧起始,仲裁段等,这一类的资料很多,我在这里也不赘述,只讲实用的。我们在通讯过程中经常会用到的就是远程帧和数据帧。 远程帧:它与数据帧不同的就是没有数据段,主要用于发送单元向接收单元进行取值、广播等操作,会包含ID信息。我们在操作远程帧时首先要设置好能让接收单元收数据的ID,配置好远程帧的标志位就可以进行发送了。 数据帧:数据帧是包含数据段的,这个数据段可以是发送单元对接受单元的具体设置,也可以是接收单元响应发送单元的具体数据或操作。在发送时也是要设置好能让接收单元接收到的ID。 举个例子:假设A为主节点,B为从节点,主节点每10ms会向从节点进行取数操作,此时我们A可以使用远程帧进行取数,B在收到A节点的远程帧后将相应的数据通过数据帧发送给A节点。而假设A节点通过USB与上位机进行连接,假设此时A节点收到上位机下发的设置系数命令时,A节点可以通过数据帧将设置的系数发送给B节点。 具体的应用就看实际项目的需求,唯一需要注意的是对于ID的设置。 CAN的波特率 CAN的波特率部分网上资料也很多,我只讲我自己所用的方法。 波特率 = APB时钟/CAN分频系数/(传说中的SS+PTS+PBS1+PBS2+SJW) 在使用HAL库时,这一部分就显得很简单了。举个例子吧。 APB1采用24MHz的晶振频率,CAN的分频系数是3,对于SS+PTS+PBS1+PBS2+SJW也就是 1(这是固定的,SS)+ 7(PTS + PBS1)+ 2(PBS2) = 10,所以波特率 = 24000000/3/10 = 800000,也就是1/1250ns,这就是Time for one bit这个自动会计算出来的参数。 CAN的ID 对于CAN的ID,有两个地方的概念需要说明。一个是发送帧时的ID,这个ID号是用来被接收单元进行滤波的ID号,也就是说我们在发送远程帧或者数据帧时肯定会设置一个ID,这个ID是发出去让别人去过滤的即判断是否需要进行接收,也就是StdId或者ExtId。而我们在设置CAN时会需要设置一个过滤器,这个过滤器中需要设置屏蔽码、验证码或者列表ID,这个设置完后就会按所设的ID值在每次接收到CAN数据时进行判断是否需要接收,如果不是过滤器设置下的ID就自动丢弃,不进入中断进行接收,也就是过滤别人发过来的ID是否需要进行接收。 CAN的帧格式 这个帧格式分为标准帧和扩展帧。区别主要在于ID设置时的位数,一个只有11位,一个扩展为18位。使用哪一种需要根据实际情况。一般标准帧也够用了。设置时与IDE这个参数有关。
