你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407 bxCAN 低温-35度下通讯出错

[复制链接]
marvin_xie 提问时间:2016-6-7 21:07 /
单步调试中,寄存器TSR和ESR值如下:
0: TSR: 0x1C00 0009 //发送请求已执行,但邮箱0发送失败
      ESR: 0x0008 0030 //传输错误,错误计数器+8,错误类型:011 == 确认(ACK)错误

1: TSR: 0x1C00 0909 //发送请求已执行,但邮箱1、邮箱0发送失败
      ESR: 0x0010 0040 //传输错误,错误计数器+8,错误类型:100 == 位隐性错误

2: TSR: 0x1C00 0909 //发送请求已执行,但邮箱1、邮箱0发送失败
      ESR: 0x0018 0040 //传输错误,错误计数器+8,错误类型: 100 == 位隐性错误  

3: TSR: 0x1C00 0909
      ESR: 0x0020 0040
.
.
.
10:TSR: 0x1C00 0903  //成功发送的一帧
       ESR: 0x004F 0000  


收藏 评论9 发布时间:2016-6-7 21:07

举报

9个回答
marvin_xie 回答时间:2016-6-7 21:11:58
CAN出错时,MCU是正常的(有定时器点灯,灯闪正常;也喂过狗,也正常复位)。我尝试过自环,自环没问题。
marvin_xie 回答时间:2016-6-7 21:15:04

CAN控制器的初始化代码:

u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    CAN_InitTypeDef CAN_InitStructure;
    CAN_FilterInitTypeDef CAN_FilterInitStructure;

#if CAN1_RX0_INT_ENABLE
    NVIC_InitTypeDef  NVIC_InitStructure;
#endif

    //使能相关时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟                                                                                                                  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       
       

    //初始化GPIO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                        //复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                        //上拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);                                                //初始化PA11,PA12

       
    //引脚复用映射配置
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN1
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1

       
    //CAN单元设置
    CAN_InitStructure.CAN_TTCM = DISABLE;        //非时间触发通信模式   
    CAN_InitStructure.CAN_ABOM = DISABLE;        //软件自动离线管理          
    CAN_InitStructure.CAN_AWUM = DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
    CAN_InitStructure.CAN_NART = ENABLE;        //禁止报文自动传送  marvin 1: ENABLE->DISABLE
    CAN_InitStructure.CAN_RFLM = DISABLE;        //报文不锁定,新的覆盖旧的  
    CAN_InitStructure.CAN_TXFP = DISABLE;        //优先级由报文标识符决定
    CAN_InitStructure.CAN_Mode = mode;         //模式设置
    CAN_InitStructure.CAN_SJW = tsjw;        //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
    CAN_InitStructure.CAN_BS1 = tbs1; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
    CAN_InitStructure.CAN_BS2 = tbs2;        //Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
    CAN_InitStructure.CAN_Prescaler = brp;  //分频系数(Fdiv)为brp+1       
    CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1

       
    //配置过滤器
    CAN_FilterInitStructure.CAN_FilterNumber = 0;          //过滤器0
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;         //32位
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;                                                                ////32位ID
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;                                                //32位MASK
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;//过滤器0关联到FIFO0
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                                                         //激活过滤器0
    CAN_FilterInit(&CAN_FilterInitStructure);                                                                                                        //滤波器初始化
   
    return 0;
}
marvin_xie 回答时间:2016-6-7 21:18:23
main.c中调用的CAN初始化:
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_2tq,CAN_BS1_4tq,6,mode);//marvin 1:  brp:3->6  波特率:1000kbps -> 500kbps, mode =0 普通模式
marvin_xie 回答时间:2016-6-7 21:20:58
时钟(16MHz外部晶振):

/************************* PLL Parameters *************************************/
/* Select the PLL clock source */

//#define PLL_SOURCE_HSI        // HSI (~16 MHz) used to clock the PLL, and the PLL is used as system clock source
#define PLL_SOURCE_HSE        // HSE used to clock the PLL, and the PLL is used as system clock source
//#define PLL_SOURCE_HSE_BYPASS   // HSE bypassed with an external clock (8MHz, coming from ST-Link) used to clock
                                // the PLL, and the PLL is used as system clock source


/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#if defined  (PLL_SOURCE_HSI)
#define PLL_M      16
#else
#define PLL_M      16  //marvin 1: 8->16
#endif
#define PLL_N      168 //marvin 2: 360->168

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2

/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
#define PLL_Q      48         //marvin 4: 7->48
任风吹吹 回答时间:2016-6-8 11:11:27
楼主:提几个问题:
1 常温下是正常的吗?
2 CAN收发器后外接了CAN测试工具或其他CAN节点了吗?
3 测试时波特率是1M? 可以降速为500K测试下?
4 LookBack模式下肯定是正常的。这只是说明这个问题与CAN控制器外部连接的部分有关。
marvin_xie 回答时间:2016-6-8 15:43:59
任风吹吹 发表于 2016-6-8 11:11
楼主:提几个问题:
1 常温下是正常的吗?
2 CAN收发器后外接了CAN测试工具或其他CAN节点了吗?

1. 常温下正常;(高温也没问题,低温-30°没有问题,过了-30开始出错);
2. CAN收发器外接了CAN调试盒子(型号是:广州致远电子的 USBCAN-II);
3. 测试时波特率是500kbps;
4. 嗯,我当时也是猜想可能是控制器外面的电路的问题,所以做了回环测试。
PS: 谢谢您的回复
任风吹吹 回答时间:2016-6-8 17:09:35
也不排除CAN收发器的性能,不知道用的是哪款CAN收发器?NXP的TJAXXX?
建议用示波器查看CAN_TX脚的波形与CAN总线上的波形。对比常温正常下与低温异常时有什么差异?

期望分享结果。
marvin_xie 回答时间:2016-6-8 18:12:33
任风吹吹 发表于 2016-6-8 17:09
也不排除CAN收发器的性能,不知道用的是哪款CAN收发器?NXP的TJAXXX?
建议用示波器查看CAN_TX脚的波形与CA ...

收发器用的是:ADM3053BRWZ。能搞定就好了,到时候来分享。
zero99 回答时间:2016-7-10 13:37:18
楼主解决了吗

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版