和spi/IIC不同,can发送和接数据都是通过两条线完成,形成差分信号进行传输和接收。
另外和IIC不同,不是通过对目标节点进行地址编码,而是对内容进行编码,所以理论上节点数不受限制。
由于物理层比较简洁(不像spi由片选/时钟信号/数据输入/数据输出,四个信号,串口接收发送两个信号 iic有时钟信号/数据信号两条信号线,CAN使用两条差分信号线只能表示一个信号),因此需要协议较为复杂,对数据、操作命令和同步信号等打包在一起,形成报文。
在cubemax中进行配置
- 选芯片型号,配置时钟等一些常规的准备工作。
- 勾选can,并配置参数,因为只有一个板子,所以选择回环模式(发送的数据直接发送到总线和输入,不能接收总线输入的数据,一般用于调试。此外还有正常模式,静默模式,回环静默模式)
需要配置的参数有
Prescaler(for Time Quantum): 预分频系数,可以控制tq(时间量子)的时间长度,将Prescaler调为1可以看到Time Quantum的最小值。
Time quanta in bit segment 1:pbs1段有几个tq(time quantum),can通讯一个数据位包括了四部分 ss段,pts段,pbs1段,pbs2段,采样点一般在pbs1和pbs2段之间,can将pts段和bs1段合在一起统称pbs1
Time quanta in bit segment 2:pbs2段有几个tq(time quantum)
Time for one Bit:一个数据位的时间
Baud rate:波特率
Test mode:测试模式,分为正常模式,回环模式,静默模式,回环静默模式
3.勾选串口,方便调试CAN,修改文件名,生成文件。
4.在生成的代码的can.c文件中写数据发送和数据接收两个函数,并且在can.h中声明一下,方便main函数调用
并且在MX_CAN_Init的用户修改部分里添加筛选器的代码,这里将屏蔽码的低三位置1,表示接收所有标识符低三位为1的帧。
5.在main函数中加入以下代码,将id(标识符)设置成低三位为1的,每次发送数据的时候发八个,但生命的数组里只有两个数据,缺少的六个自动用0补齐,循环接收发送的数据。
6.最终实验结果
接收到的数据为