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

32F042F6的CAN总线配置问题,回环测试有数据,正常模式没数据

[复制链接]
1hexie 提问时间:2019-4-24 14:25 /
大家好,我用的是STM32F042F6,TSSOP20芯片,CAN引脚为PA11,PA12(与PA9,PA10复用)
当设置为CAN_Mode_LoopBack时,可以在用示波器在TX引脚看到波形,并且程序里可以接收到数据;
当设置为CAN_Mode_Normal时,TX引脚看不到波形,并且也不能接受发送CAN数据。
代码如下,请大家帮忙看看,谢谢!!


void CAN1_Init(u16 Baudrate,u16 Receive_MsgId)
{
    GPIO_InitTypeDef       GPIO_InitStructure;
    NVIC_InitTypeDef       NVIC_InitStructure;
    CAN_InitTypeDef        CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;

        /* CAN1 Periph clock enable */
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);
        
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
          SYSCFG->CFGR1 |= (uint32_t)SYSCFG_CFGR1_PA11_PA12_RMP;        
        
          GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);         

    /* Configure CAN pin: RX */  // PA11
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure CAN pin: TX */   // PA12
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//          GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* enabling interrupt */
    NVIC_InitStructure.NVIC_IRQChannel         = CEC_CAN_IRQn;;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    //CAN_INIT();//CA???N??
    /* CAN register init */
//   CAN_DeInit(CAN);                     
//   CAN_StructInit(&CAN_InitStructure);   

    /* CAN cell init */
    CAN_InitStructure.CAN_TTCM = DISABLE;      
    CAN_InitStructure.CAN_ABOM = DISABLE;        
    CAN_InitStructure.CAN_AWUM = DISABLE;        
    CAN_InitStructure.CAN_NART = DISABLE;         
    CAN_InitStructure.CAN_RFLM = DISABLE;        
    CAN_InitStructure.CAN_TXFP = DISABLE;         
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//CAN_Mode_LoopBack; //
    CAN_InitStructure.CAN_SJW  = CAN_SJW_1tq;     
    CAN_InitStructure.CAN_BS1  = CAN_BS1_4tq;     
    CAN_InitStructure.CAN_BS2  = CAN_BS2_3tq;   

                CAN_InitStructure.CAN_Prescaler=6;
                        
    CAN_Init(CAN,&CAN_InitStructure);         


    CAN_FilterInitStructure.CAN_FilterNumber = 1;                    
    CAN_FilterInitStructure.CAN_FilterMode   = CAN_FilterMode_IdList;  
    CAN_FilterInitStructure.CAN_FilterScale  = CAN_FilterScale_32bit;  

    CAN_FilterInitStructure.CAN_FilterIdHigh= (((u32)Receive_MsgId<<21)&0xFFFF0000)>>16;  
//   CAN_FilterInitStructure.CAN_FilterIdHigh=0X00;                  //????ID??
    CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)Receive_MsgId<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF; //????ID??

    CAN_FilterInitStructure.CAN_FilterMaskIdHigh     = 0xFFFF;         
    CAN_FilterInitStructure.CAN_FilterMaskIdLow      = 0xFFFF;            
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;   
    CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;      
    CAN_FilterInit(&CAN_FilterInitStructure);                     

    /* CAN FIFO0 message pending interrupt enable */
    CAN_ITConfig(CAN,CAN_IT_FMP0, ENABLE);         

}


收藏 评论4 发布时间:2019-4-24 14:25

举报

4个回答
wh8 回答时间:2019-4-24 16:29:33
正常模式下,CAN是带纠错的,需要你两端的设备都正常连接才行。
否则你对面设备没接,单片机CAN外设就认为通信出错了,也就不会再正常发送了。
所以你把另一边的CAN设备接上再测测。
参考http://community.st.com/s/questi ... /can-loopbacknormal
另外环回模式就是用来测代码的,环回下没问题,代码配置一般就不会有问题

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

jeffhe1 回答时间:2019-4-24 16:30:29
附件是別人 STM32F042 can 的 sample code , 有親自測試 改寫 可用 , 可以參考看看

19-ISO_CAN.zip

下载

2.07 MB, 下载次数: 27, 下载积分: ST金币 -1

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

七哥 回答时间:2019-4-24 16:55:46
如沙发楼层所说。
CAN正常收发时,必须是两个以上的CAN接点才行,单个节点是会报错的。
只要你的回环模式测试没有问题,这时只要把模式改成正常模式,就可以正常CAN通信了。
从MCU的CAN_TX、CAN_RX引出来后,必须加CAN收发器才行,过收发器后转成CAN电平连接外部的CAN接点。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

1hexie 回答时间:2019-4-24 17:33:37
谢谢楼上三位热心回答,我再检查一下。
我的程序也是在19-ISO基础上做了更改,因为19-ISO这个程序的CAN用的是其他端口,我用的芯片是TSSP20封装,CAN脚用的是PA11,PA12,需要做端口映射一下。


所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版