1685|4

47

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

上海航芯 ACM32F070开发板+触控功能评估板评测 - 第六篇 CAN错误处理 [复制链接]

 

本评测实验对CAN模块通信错误处理机制进行测试。

 

CAN通用规范中规定每个CAN控制器中有一个发送错误计数器和一个接收错误计数器。根据计数值不同,节点会处于不同的错误状态,并根据计数值的变化进行状态转换

 

 

测试方案设计:

每次按下板上的用户按键,CAN模块就发出一帧标准帧数据。

每次发送后,串口打印出TX Error Count。

通过断开CANH连接,使发送失败,引起TX Error Count变化。

当总线进行Error Passive状态时,触发中断,打印状态。

检查Bus off状态,当总线进入Bus off状态时,打印状态。

 

测试代码基于SDK中CAN例程开发。

    GPIOC_Handle.Pin       = GPIO_PIN_13;
	GPIOC_Handle.Mode      = GPIO_MODE_IT_FALLING;
	GPIOC_Handle.Alternate = GPIO_FUNCTION_0;

	HAL_GPIO_Init(GPIOC, &GPIOC_Handle);

	/* RTC access enable */
	System_Enable_Disable_RTC_Domain_Access(FUNC_ENABLE);
	
	__HAL_RTC_PC13_SEL(0);  // GPIO function     
	__HAL_RTC_PC13_PULL_UP_ENABLE();
	__HAL_RTC_PC13_DIGIT();

	/* Clear Pending Interrupt */
	NVIC_ClearPendingIRQ(GPIOCD_IRQn);
	
	/* Enable External Interrupt */
	NVIC_EnableIRQ(GPIOCD_IRQn);
           HAL_CAN_Receive_IT(&CAN_Handle,&CAN_RxMessage);
            while(1)
            {
                if(gu8_CAN_ReceiveFlag==1)
                {
                    #ifdef CAN_LOG_ENABLE
                    CAN_PrintfReceive();  
                    #endif 
                    
                    CAN_TxMessage=CAN_RxMessage;
                    
                    gu8_CAN_ReceiveFlag=0;
                }
				
				if(gu32_GPIOIRQ_Flag){
					gu32_GPIOIRQ_Flag = false;
					//printf("BTN pressed!");
					/* Get the IDE */
					CAN_TxMessage.IDE = CAN_Id_Standard;
					/* Get the RTR */
					CAN_TxMessage.RTR = 0;
					/* Get the DLC */
					CAN_TxMessage.DLC = 8;
					CAN_TxMessage.StdId = 0x100;
					CAN_TxMessage.Data[0] = 0x30;
					CAN_TxMessage.Data[1] = 0x31;
					CAN_TxMessage.Data[2] = 0x32;
					CAN_TxMessage.Data[3] = 0x33;
					CAN_TxMessage.Data[4] = 0x34;
					CAN_TxMessage.Data[5] = 0x35;
					CAN_TxMessage.Data[6] = 0x36;
					CAN_TxMessage.Data[7] = 0x37;
			
					
					HAL_CAN_Transmit(&CAN_Handle,&CAN_TxMessage);//send can frame from receive 
					System_Delay_MS(5);
					count = HAL_CAN_GetTransmitErrorCounter(&CAN_Handle);
					status = CAN_Handle.Instance->SR;
					errcode = CAN_Handle.Instance->ECC;
					printf("Trigger a transmisstion, TX Error counter: %d \r\n", (uint8_t)count);

					if((status & 0x80) == 0x80){
						printf("CAN Bus Off!\r\n");
					}
				}
            }

 

测试结果

  1. 进入Error Passive

出现一次发送失败,TX Error Count变成128,触发Error Passive中断,表示进入Error Passive状态。

 

 

  1. Error passive状态下,

每发送失败一次,TX Error count 增加6

每成功发送一次帧数据,TX Error count数字减1.

当TX Error count由128减到127时候,再一次触发了Error Passive中断。这一次应该表示退出Error Passive状态。

 

  1. 进入Bus off

当把CANH和CANL短接在一起时,TX erro count从0直接跳到255,并进入Bus off状态。

记得TX erro count > 255时, 才进入Bus off的。此处等于255时,就进入了。有点奇怪。

CAN Bus off时,CAN模块实际上处于Reset模式下,需要重新使能才能恢复通信。

 

 

 

综上结果,测试中看到TX Error Count为255时,CAN总线进入Bus off状态。这一点有点奇怪,不知道是不是还符合CAN标准。

最新回复

这测试非常用心呀,学习了!  详情 回复 发表于 2022-12-1 17:56
点赞 关注
 
 

回复
举报

6450

帖子

9

TA的资源

版主

沙发
 

一般都是那种器件会用到CAN通信呢,或者是哪类,还没有用到过这种器件呢

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

CAN总线主要是用在汽车上,另外在工业自动化、船舶、医疗设备、工业设备等方面也广泛应用。是应用最广泛的现场总线保准之一。本论坛上也有很多CAN的文章,有时间可以看一下。

从底层深度理解CAN总线 - 嵌入式系统 - 电子工程世界-论坛 (eeworld.com.cn)

Loto实践干货(3) 测量CAN总线通讯数据 - 测试/测量 - 电子工程世界-论坛 (eeworld.com.cn)

 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
你好,因为TXERR寄存器的最大值是255,当错误累计到超过255之后,进入bus off状态,之后TXERR寄存器的值会变为127,之后检查到没有恢复正常状态,会继续加8到255,超过255后,再次回到127
 
 
 

回复

6960

帖子

11

TA的资源

版主

5
 
这测试非常用心呀,学习了!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表