最近在做一个采集卡项目,用到CAN通信,下面从简单应用的角度做做笔记,供大家批判。
一、CAN工作原理,stm32芯片内集成的发送邮箱,接收FIFO,滤波器等概念
CAN(Controller Area Network)是一种常用于汽车和工业自动化领域的串行通信协议,它具有高可靠性和多主控制的特点。STM32芯片内集成的CAN控制器提供了发送邮箱、接收FIFO和滤波器等功能,以支持CAN通信。
a)发送邮箱:STM32的CAN控制器包含发送邮箱,用于暂存待发送的CAN报文。发送邮箱作为发送缓冲区,发送接收控制器可以根据先来后到或者ID优先级两种方式进行选择发送报文,通过CAN_TX发送到外面的CAN收发器。
b)接收FIFO:接收FIFO(先进先出寄存器,队列)用于存放通过过滤器筛选后的接收到的CAN报文,等待CPU读取处理。STM32的CAN控制器通常有两个接收FIFO,分别为FIFO0和FIFO1,每个FIFO可以配置为接收特定ID的报文。
c)滤波器:STM32的CAN控制器包含多个硬件滤波器,用于筛选接收的CAN报文。滤波器可以设置为接收所有报文或仅接收特定ID的报文。滤波器的配置包括过滤器的模式(屏蔽位模式或标识符列表模式)、位宽(16位或32位)、标识符等。
具体硬件知识可以看看别人的文章,写的都很好,我就不复制粘贴了。
二、配置CAN模块
直接打开cubemx软件去配置
a)配置引脚
代码生成如下:
void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan)
{
if(hcan->Instance==CAN1)
{
/* USER CODE BEGIN CAN1_MspDeInit 0 */
/* USER CODE END CAN1_MspDeInit 0 */
/* Peripheral clock disable */
HAL_RCC_CAN1_CLK_ENABLED--;
if(HAL_RCC_CAN1_CLK_ENABLED==0){
__HAL_RCC_CAN1_CLK_DISABLE();
}
/**CAN1 GPIO Configuration
PA11 ------> CAN1_RX
PA12 ------> CAN1_TX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|