我只有一个STM32F429的开发板,所以这次我就做个回环测试.
1.先了解一下有关CAN的一些标准库,结构体
1.CAN初始化结构体---CAN_InitTypeDef
2.CAN发送及接收结构体--- CanTxMsg(发送结构体) CanRxMsg(接收结构体)
3.CAN筛选器结构体 --- CAN_FilterInitTypeDef
2.代码编写 以及我其中遇到的一些问题
//1.初始化GPIO
//2.初始化CAN的工作模式
//3.初始化接收FIFO
//4.初始化筛选器
//5.编写中断服务函数
这就是程序的大纲,下面我们一个一个来分析
1.初始化GPIO
这里我们板子上使用的PB9 PB8 来当作CAN的Tx Rx 使用它的复用功能
这里就是要注意我们复用功能要连接IO口到它的CAN_Tx 和 CAN_Rx
2.初始化CAN的工作模式
这里有几个要注意的
(1) 时钟开启 别弄错了 我们这是外设 使用的是APB1
(2) CAN的通讯速率我们就配置成 1Mbps
计算过程就是 SS段+BS1+BS2 = 9Tq
5分频就是 = 45Mhz /5 = 9Mhz
波特率 = 9Tq/9Mhz = 1Mbps
(3)我们使用的是CAN1
3.初始化筛选器
这里注意的如下:
(1) 一定要使能筛选器 ,不要以为我们不使能筛选器 什么数据都可以都可以接受到,其实是不使能筛选器,我们啥都接受不到了, 我第一次也被坑了
(2)就是配置这个ID和掩码
我们上面是使用ID列表模式 ,筛选器的尺度,我们使用的是32位
因为是小端模式 低位在前 ,所以我们是左移三位, 跳过了IDE RTR 0 这三位,
IDE是判断是否是 扩展帧还是 数据帧 RTR是判断是数据帧 还是 遥控帧
(我们这边是有宏定义的 直接把那几个位 或 上去就好了)
接着与上0xFFFF0000 取出 这高16位 向右移动16位 取出来 保存在 寄存器 最高位
低16位的操作也差不多 就是我们 相与上0x0000FFFF 但是不用右移
(3)就是我们这里使用的是CAN1 他们公用的是同一个过滤器
(4)最后使能CAN FIFO0 通信中断
4.中断的编写
配置一下中断源 我们配置成CAN1的接收FIFO 0
5.发送和接收函数的编写
首先先初始化 Tx 和Rx的结构体
如果触发CAN1 FIFO0的中断 我们就把can_rx_flag 置 1
并且使用CAN_Receive 把接收的数据存进 can_rx_msg这个结构体中
在while函数中 我们使用一个按键 函数 按下就发送数据 这里我们配置成数据帧 和扩展帧
最后现象