上海航芯 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");
}
}
}
测试结果
- 进入Error Passive
出现一次发送失败,TX Error Count变成128,触发Error Passive中断,表示进入Error Passive状态。
- Error passive状态下,
每发送失败一次,TX Error count 增加6
每成功发送一次帧数据,TX Error count数字减1.
当TX Error count由128减到127时候,再一次触发了Error Passive中断。这一次应该表示退出Error Passive状态。
- 进入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标准。
|