【上海航芯 ACM32F070开发板+触控功能评估板】04.CAN通讯测试
[复制链接]
ACM32F070系列MCU带有1路CAN控制器,它是一种异步的半双工通讯,主要特性如下所示:
支持 CAN2.0,包括 CAN2.0A 和 CAN2.0B。
支持 11 比特和 29 比特的识别符。
支持最低 125K 波特率和 1M 波特率。
64 字节的接收 FIFO。
支持热拔插。
支持接收器滤波。
Single-Shot 传输选项。
支持只监听模式。
可以接收自己的信息。
支持自测模式。
支持 CAN 总线错误的中断。
记录仲裁失败后的 bit 位置。
读写错误计数器。
可编程的错误上限警告。
通过 BOSCH CAN2.0 测试。
在测试CAN通讯时,我们需要准备一下硬件环境:
ACM32F070RBT7 CoreBoard开发板
广成的USBCAN-II Pro调试工具 & 配套的上位机软件ECanTools
CAN收发模块
CAN收发模块是自己设计的,从画原理图、PCB、到打样、焊接;这个CAN收发模块具备支持3.3V和5.0V两种电平的CAN引脚电压,因为有些MCU是宽工作电压的,这样一块CAN收发模块就可以做到都兼容啦……
原理图:
PCB的3D效果:
我们参考官方的CAN示例程序,配置PA11和PA12为CAN复用功能引脚,通过中断的方式接收CAN数据,然后再将收到的数据通过CAN再发送出来:
-
- CAN_HandleTypeDef CAN_Handle;
-
-
-
- CanTxRxMsg CAN_RxMessage;
-
-
-
-
-
-
-
-
-
-
-
- void CAN_ReceiveIT_Callback(CAN_HandleTypeDef *hcan)
- {
- HAL_CAN_Transmit(&CAN_Handle, &CAN_RxMessage);
- }
-
-
-
- void CAN_Init(void)
- {
- CAN_FilterInitTypeDef CAN_Filter;
-
- CAN_Handle.Instance = CAN1;
- CAN_Handle.Init.CAN_Mode = CAN_Mode_Normal;
- CAN_Handle.Init.CAN_SJW = CAN_SJW_1tq;
- CAN_Handle.Init.CAN_BRP = 7;
- CAN_Handle.Init.CAN_TSEG1 = CAN_TSEG1_3tq;
- CAN_Handle.Init.CAN_TSEG2 = CAN_TSEG2_4tq;
- CAN_Handle.Init.CAN_BOR = CAN_BOR_ENABLE;
- CAN_Handle.CAN_ReceiveIT_Callback = CAN_ReceiveIT_Callback;
- HAL_CAN_Init(&CAN_Handle);
-
- CAN_Filter.CAN_FilterMode = CAN_FilterMode_Dual;
- CAN_Filter.CAN_FilterId1 = 0x18FE0000;
- CAN_Filter.CAN_FilterId2 = 0x0100<<18;
-
- CAN_Filter.CAN_FilterMaskId1 = 0x0000FFFF;
- CAN_Filter.CAN_FilterMaskId2 = 0x001FFFFF;
- HAL_CAN_ConfigFilter(&CAN_Handle, &CAN_Filter);
-
- HAL_CAN_Receive_IT(&CAN_Handle, &CAN_RxMessage);
- }
-
-
-
- void CAN1_IRQHandler(void)
- {
- HAL_CAN_IRQHandler(&CAN_Handle);
- }
在上面的程序中,我们看到并没有对PA11和PA12这两个GPIO进行配置,这是因为在官方的HAL库中已经有一个虚函数了实现了这一功能,并且配置了中断功能:
-
-
- __weak void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
- {
-
-
-
-
-
- System_Module_Enable(EN_CAN1);
- GPIO_InitTypeDef GPIO_InitStructure;
-
-
- GPIO_InitStructure.Pin = GPIO_PIN_11|GPIO_PIN_12;
- GPIO_InitStructure.Alternate=GPIO_FUNCTION_5;
- GPIO_InitStructure.Pull=GPIO_PULLUP;
- GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- NVIC_ClearPendingIRQ(CAN1_IRQn);
- NVIC_SetPriority(CAN1_IRQn, 3);
- NVIC_EnableIRQ(CAN1_IRQn);
-
- }
完成代码后,我们将编译无误的程序下载到开发板,复位运行:通过UART打印消息,通过ECanTools工具发送测试数据,测试数据包含了标准帧和扩展帧:
软件工程:
续:在收到开发板后,才开始做CAN收发模块,期间耽搁了些时间
|