STM32 的CAN 通信实现(代码+图示) 1.CAN 是控制器局域网络(Controller Area Network, CAN)的简称 (理论知识不做讲解了,太多了) 2.芯片选用:TJA1050 差分信号输入, 这里的显性电平CANH 和CANL 压差是2V 左右,逻辑上表示“0” 两线之间没有压差CANH 和CANL 都是2.5V 左右,表示逻辑“1” (二)实现代码 1. /* 配置 CAN 模块*/ CAN_Config(); void CAN_Config(void) { CAN_GPIO_Config(); //此处用PB8/PB9 CAN_NVIC_Config(); CAN_Mode_Config(); CAN_Filter_Config(); } 2 .对于 CAN_NVIC_Config(); 看下 CAN 的中断分类 static void CAN_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /*中断设置*/ NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;//CAN1 RX0中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 3.CAN_Mode_Config(); //CAN 不像 I2C 那样有片选,他背身有许多协议,也要进行选择,所以对应代码的结构体也多(集体可看CAN 手册) 4.CAN_Filter_Config(); 过滤器程序 看下 CAN 的主要框图(M3 里面的 CAN) M3 里面有三个发送邮箱,把要发送的数据打包成报文,然后把它发送到CAN 网络总线上; 接收器 先经过滤器,M3 里面有14 个过滤器,过滤的时候是根据报文的ID 来过滤的,ID相同的话,才能过去(相当于一个闸门) 接收到数据后(这里有两个FIFO ,0、1 ),我们的实验用的是 放到FIFO 的Mailbox 0; 代码写法根基三部分: 1.Tx Mailboxes 2.Acceptance Filters 3.Receive FIFO STM32 的 ID 过滤方式有两种,一种为标识符列表模式,它把要接收报文 的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接 收,可以理解为白名单管理。(说白了就是有一个标志位相同,然后就联通了) 另一种称为标识符屏蔽模式,它把可接收报文 ID 的某几位作为列表,这几 位被称为屏蔽位,可以把它理解成关键字搜索,只要屏蔽位(关键字)相同,就 符合要求。即这种模式只要求...