1766|0

241

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【上海航芯 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再发送出来:

  • /* Private variables ---------------------------------------------------------*/
  • CAN_HandleTypeDef CAN_Handle;
  • /* Private variables ---------------------------------------------------------*/
  • CanTxRxMsg CAN_RxMessage;
  • /* Private function prototypes -----------------------------------------------*/
  • /* Private functions ---------------------------------------------------------*/
  • /* Exported variables --------------------------------------------------------*/
  • /* Exported function prototypes ----------------------------------------------*/
  • /*******************************************************************************
  • * [url=home.php?mod=space&uid=159083]@brief[/url] * @param
  • * @retval
  • * [url=home.php?mod=space&uid=1020061]@attention[/url] *******************************************************************************/
  • void CAN_ReceiveIT_Callback(CAN_HandleTypeDef *hcan)
  • {
  • HAL_CAN_Transmit(&CAN_Handle, &CAN_RxMessage);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • 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; //Extended Id:ID28...ID0
  • CAN_Filter.CAN_FilterId2 = 0x0100<<18; //Standard Id:ID28...ID18,so need (ID<<18)
  • /* if want receive all data,please set the CAN_FilterMaskId = 0xFFFFFFFF*/
  • CAN_Filter.CAN_FilterMaskId1 = 0x0000FFFF; //only receive CAN id=0x18FExxxx(only care 0x18FExxxx)
  • CAN_Filter.CAN_FilterMaskId2 = 0x001FFFFF; //only receive CAN id=0x100 ( care ID28...ID18)
  • HAL_CAN_ConfigFilter(&CAN_Handle, &CAN_Filter);
  • HAL_CAN_Receive_IT(&CAN_Handle, &CAN_RxMessage);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void CAN1_IRQHandler(void)
  • {
  • HAL_CAN_IRQHandler(&CAN_Handle);
  • }

 

在上面的程序中,我们看到并没有对PA11和PA12这两个GPIO进行配置,这是因为在官方的HAL库中已经有一个虚函数了实现了这一功能,并且配置了中断功能:

  • /*********************************************************************************
  • * Function : HAL_CAN_MspInit
  • * Description : Initialize the CAN MSP.
  • * Input : hcan : pointer to a CAN_HandleTypeDef structure that contains
  • * the configuration information for CAN module
  • * Output :
  • * Author : CWT Data : 2020年
  • **********************************************************************************/
  • __weak void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
  • {
  • /* NOTE : This function should not be modified, when the callback is needed,
  • the HAL_UART_MspInit can be implemented in the user file
  • */
  • /* For Example */
  • /* Enable CAN clock */
  • System_Module_Enable(EN_CAN1);
  • GPIO_InitTypeDef GPIO_InitStructure;
  • /* Initialization GPIO */
  • /* PA11:Rx */ /* PA12:Tx */
  • 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工具发送测试数据,测试数据包含了标准帧和扩展帧:

软件工程:

CoreBoard.zip (371.3 KB, 下载次数: 6)

 

续:在收到开发板后,才开始做CAN收发模块,期间耽搁了些时间

点赞 关注
个人签名We are a team and we work as a team !
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 15

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表