IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> AT32 CAN应用问题说明 -> 正文阅读

[嵌入式]AT32 CAN应用问题说明

Questions1:CAN接收报文数据错位问题
在使用CAN时,当在接收数据域期间CAN总线上出现异常(该异常通常可能由采样点漂移、或外部干扰等原因导致)时,可能会出现接收数据位填充错误导致整帧数据错位的现象, 且后续帧又自动恢复正常的现象。
Answer:
此问题可通过软件进行修正,处理方案如下。
开启CAN的上次错误中断号对应的错误中断,在CAN错误中断的中断函数内检测到出现位填充错误时,复位CAN(可只复位CAN寄存器,其相关的GPIO等、NVIC不需复位),并重新调用CAN初始化函数。以CAN1为例,其典型示例代码如下:
__IO uint32_t err_index = 0;
void CAN1_SCE_IRQHandler(void)
{
if (CAN_GetINTStatus (CANx,CAN_INT_LEC) == SET )
{
err_index = CAN1->ESTS;
CAN_ClearINTPendingBit (CANx, CAN_INT_LEC);
if(err_index & 0x00000010) ///<判定是否出现位填充错误
{
CAN_Reset(CAN1);
/调用CAN初始化函数/;
}
}
}

Questions2:CAN报文被异常多发问题
在使用CAN时,若禁止硬件自动重传功能,且又透过软件查询发送状态来达到自动重传效果时,可能会出现某一时刻的某帧报文被异常多发一次的现象。
Answer:
造成此问题的根本原因是CAN的“发送完成标志”与“发送成功或失败标志”非同步置位(间隔一个PCLK)。
此问题可通过使用BSP 1.3.0版本后的CAN驱动(也可按照如下代码方式修改对应的驱动文件),或直接使用硬件自动重传功能来解决:
uint8_t CAN_TransmitStatus(CAN_Type* CANx, uint8_t TransmitMailbox)
{
uint32_t state = 0;
switch (TransmitMailbox)
{
case (CAN_TXMAILBOX_0):
if((CANx->TSTS & CAN_TSTS_RQC0) == CAN_TSTS_RQC0)
{
if((CANx->TSTS & CAN_TSTS_TOK0) == CAN_TSTS_TOK0)
{
state = CAN_TxStatus_Ok;
}
else
{
state = CAN_TxStatus_Failed;
}
}
else
{
state = CAN_TxStatus_Pending;
}
break;

case (CAN_TXMAILBOX_1):
  if((CANx->TSTS &  CAN_TSTS_RQC1) == CAN_TSTS_RQC1)
  {
    if((CANx->TSTS &  CAN_TSTS_TOK1) == CAN_TSTS_TOK1)
    {
      state = CAN_TxStatus_Ok;
    }
    else
    {
      state = CAN_TxStatus_Failed;
    }
  }
  else
  {
    state = CAN_TxStatus_Pending;
  }
  break;

case (CAN_TXMAILBOX_2):
  if((CANx->TSTS &  CAN_TSTS_RQC2) == CAN_TSTS_RQC2)
  {
    if((CANx->TSTS &  CAN_TSTS_TOK2) == CAN_TSTS_TOK2)
    {
      state = CAN_TxStatus_Ok;
    }
    else
    {
      state = CAN_TxStatus_Failed;
    }
  }
  else
  {
    state = CAN_TxStatus_Pending;
  }
  break;
  
default:
  state = CAN_TxStatus_Failed;
  break;

}
return (uint8_t) state;
}

类型:MCU应用
适用型号:AT32F403、AT32F413、AT32F415、AT32F403A、AT32F407
主功能:CAN
次功能:无

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 11:05:27  更:2021-07-14 11:05:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 8:03:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码