OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11525|回复: 4

STM32F072的CAN初始化失败

[复制链接]

12

主题

36

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2394
金钱
2394
注册时间
2016-4-14
在线时间
225 小时
发表于 2016-5-31 17:55:16 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 hechuanxi0312 于 2016-5-31 21:05 编辑

STM32F072的CAN初始化失败,具体是进入到CAN_init()函数中后最后有个while循环等待硬件置为,返回CAN初始化失败,有没有人知道具体原因,求助

[mw_shl_code=c,true]uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
{
  uint8_t InitStatus = CAN_InitStatus_Failed;
  uint32_t wait_ack = 0x00000000;
  
  /* Check the parameters */
  assert_param(IS_CAN_ALL_PERIPH(CANx));
  assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM));
  assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM));
  assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM));
  assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART));
  assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM));
  assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP));
  assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode));
  assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW));
  assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1));
  assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2));
  assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler));

  /* Exit from sleep mode */
  CANx->MCR &= (~(uint32_t)CAN_MCR_SLEEP);

  /* Request initialisation */
  CANx->MCR |= CAN_MCR_INRQ ;

  /* Wait the acknowledge */
  while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
  {
    wait_ack++;
  }

  /* Check acknowledge */
  if ((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
  {
    InitStatus = CAN_InitStatus_Failed;
  }
  else
  {
    /* Set the time triggered communication mode */
    if (CAN_InitStruct->CAN_TTCM == ENABLE)
    {
      CANx->MCR |= CAN_MCR_TTCM;
    }
    else
    {
      CANx->MCR &= ~(uint32_t)CAN_MCR_TTCM;
    }

    /* Set the automatic bus-off management */
    if (CAN_InitStruct->CAN_ABOM == ENABLE)
    {
      CANx->MCR |= CAN_MCR_ABOM;
    }
    else
    {
      CANx->MCR &= ~(uint32_t)CAN_MCR_ABOM;
    }

    /* Set the automatic wake-up mode */
    if (CAN_InitStruct->CAN_AWUM == ENABLE)
    {
      CANx->MCR |= CAN_MCR_AWUM;
    }
    else
    {
      CANx->MCR &= ~(uint32_t)CAN_MCR_AWUM;
    }

    /* Set the no automatic retransmission */
    if (CAN_InitStruct->CAN_NART == ENABLE)
    {
      CANx->MCR |= CAN_MCR_NART;
    }
    else
    {
      CANx->MCR &= ~(uint32_t)CAN_MCR_NART;
    }

    /* Set the receive FIFO locked mode */
    if (CAN_InitStruct->CAN_RFLM == ENABLE)
    {
      CANx->MCR |= CAN_MCR_RFLM;
    }
    else
    {
      CANx->MCR &= ~(uint32_t)CAN_MCR_RFLM;
    }

    /* Set the transmit FIFO priority */
    if (CAN_InitStruct->CAN_TXFP == ENABLE)
    {
      CANx->MCR |= CAN_MCR_TXFP;
    }
    else
    {
      CANx->MCR &= ~(uint32_t)CAN_MCR_TXFP;
    }

    /* Set the bit timing register */
    CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | \
                ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | \
                ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | \
                ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | \
               ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1);

    /* Request leave initialisation */
    CANx->MCR &= ~(uint32_t)CAN_MCR_INRQ;

   /* Wait the acknowledge */
   wait_ack = 0;

   while (((CANx->MSR & CAN_MSR_INAK) == (uint16_t)CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))//程序就死在这里,一直循环直到跳出,然后进入下面的if判断,can初始化失败
   {
     wait_ack++;
   }

    /* ...and check acknowledged */
    if ((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)
    {
      InitStatus = CAN_InitStatus_Failed;
    }
    else
    {
      InitStatus = CAN_InitStatus_Success ;
    }
  }

  /* At this step, return the status of initialization */
  return InitStatus;
}[/mw_shl_code]

[mw_shl_code=c,true]u8 CAN_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 CAN_RX_INT_ENABLE //ê&#199;·&#241;ê1&#196;üCAN&#189;óê&#213;&#214;D&#182;&#207;
                NVIC_InitTypeDef NVIC_InitStructure;
        #endif
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);//ê1&#196;üCAN&#182;&#212;ó|μ&#196;1ü&#189;&#197;μ&#196;ê±&#214;ó
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN,ENABLE);//ê1&#196;üCANê±&#214;ó
        
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_4);//&#209;&#161;&#212;&#241;CAN1ü&#189;&#197;μ&#196;&#184;′ó&#195;1|&#196;ü£&#172B8->RX
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_4);//&#209;&#161;&#212;&#244;CAN1ü&#189;&#187;μ&#196;&#184;′ó&#195;1|&#196;ü£&#172B9->TX
//        
//        /*3&#245;ê&#188;&#187;ˉCANμ&#196;1ü&#189;&#197;£&#172B8->RX*/
//        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//&#209;&#161;&#212;&#241;&#184;′ó&#195;&#196;£ê&#189;
//        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//        GPIO_Init(GPIOB,&GPIO_InitStructure);
//        /*3&#245;ê&#188;&#187;ˉCANμ&#196;1ü&#189;&#197;£&#172B9->TX*/
//        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//&#209;&#161;&#212;&#241;&#184;′ó&#195;&#196;£ê&#189;
//        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//í&#198;íì
//        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_Init(GPIOB,&GPIO_InitStructure);        
        
        /*3&#245;ê&#188;&#187;ˉCAN1ü&#189;&#197;*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        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(GPIOB, &GPIO_InitStructure);
        /*CAN&#207;à1&#216;éè&#214;&#195;*/
        /* CAN register init */
        CAN_DeInit(CAN);
        CAN_StructInit(&CAN_InitStructure);
        /*CANμ¥&#212;aéè&#214;&#195;*/
        CAN_InitStructure.CAN_TTCM = DISABLE; /* ê±&#188;&#228;′¥·¢&#189;&#251;&#214;1, ê±&#188;&#228;′¥·¢£oCANó2&#188;tμ&#196;&#196;ú2&#191;&#182;¨ê±&#198;÷±&#187;&#188;¤&#187;&#238;£&#172;2¢&#199;ò±&#187;ó&#195;óú2úéúê±&#188;&#228;′á */
        CAN_InitStructure.CAN_ABOM = DISABLE; /* ×&#212;&#182;ˉà&#235;&#207;&#223;&#189;&#251;&#214;1£&#172;×&#212;&#182;ˉà&#235;&#207;&#223;£oò&#187;μ&#169;ó2&#188;t&#188;à&#191;&#216;μ&#189;128′&#206;11&#184;&#246;òtD&#212;&#206;&#187;£&#172;&#190;í×&#212;&#182;ˉí&#203;3&#246;à&#235;&#207;&#223;×′ì&#172;&#161;£&#212;ú&#213;aà&#239;òaèí&#188;téè&#182;¨oó2&#197;&#196;üí&#203;3&#246; */
        CAN_InitStructure.CAN_AWUM = DISABLE; /* ×&#212;&#182;ˉ&#187;&#189;D&#209;&#189;&#251;&#214;1£&#172;óD±¨&#206;&#196;à′μ&#196;ê±oò×&#212;&#182;ˉí&#203;3&#246;DY&#195;&#223;        */
        CAN_InitStructure.CAN_NART = DISABLE; /* ±¨&#206;&#196;&#214;&#216;′&#171;, è&#231;1&#251;′í&#206;óò&#187;&#214;±′&#171;μ&#189;3é1|&#214;1£&#172;·&#241;&#212;ò&#214;&#187;′&#171;ò&#187;′&#206; */
        CAN_InitStructure.CAN_RFLM = DISABLE; /* &#189;óê&#213;FIFO&#203;&#248;&#182;¨, 1--&#203;&#248;&#182;¨oó&#189;óê&#213;μ&#189;D&#194;μ&#196;±¨&#206;&#196;&#213;a2&#187;òa£&#172;0--&#189;óê&#213;μ&#189;D&#194;μ&#196;±¨&#206;&#196;&#212;ò&#184;2&#184;&#199;&#199;°ò&#187;±¨&#206;&#196;        */
        CAN_InitStructure.CAN_TXFP = ENABLE;  /* ·¢&#203;íó&#197;&#207;è&#188;&#182;  0---óé±êê&#182;·&#251;&#190;&#246;&#182;¨  1---óé·¢&#203;í&#199;&#235;&#199;ó&#203;3Dò&#190;&#246;&#182;¨        */
        CAN_InitStructure.CAN_Mode = mode;//&#196;£ê&#189;éè&#214;&#195;£o mode:0,&#198;&#213;í¨&#196;£ê&#189;;1,&#187;&#216;&#187;·&#196;£ê&#189;;
        CAN_InitStructure.CAN_SJW = tsjw;//&#214;&#216;D&#194;í&#172;2&#189;ì&#248;&#212;&#190;&#191;í&#182;è(Tsjw)&#206;atsjw+1&#184;&#246;ê±&#188;&#228;μ¥&#206;&#187;  CAN_SJW_1tq~CAN_SJW_4tq
        CAN_InitStructure.CAN_BS1 = tbs1;//Tbs1=tbs1+1&#184;&#246;ê±&#188;&#228;μ¥&#206;&#187;CAN_BS1_1tq ~CAN_BS1_16tq
        CAN_InitStructure.CAN_BS2 = tbs2;//Tbs2=tbs2+1&#184;&#246;ê±&#188;&#228;μ¥&#206;&#187;CAN_BS2_1tq ~CAN_BS2_8tq
        CAN_InitStructure.CAN_Prescaler = brp;//·&#214;&#198;μ&#207;μêy(Fdiv)&#206;abrp+1        
        //CAN_StructInit(&CAN_InitStructure);
        CAN_Init(CAN,&CAN_InitStructure);        
        /*CAN&#194;&#203;2¨éè&#214;&#195;*/
        CAN_FilterInitStructure.CAN_FilterNumber=0;     /* 1y&#194;&#203;&#198;÷0 */
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;  /* &#198;á±&#214;&#196;£ê&#189; */
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; /* 32&#206;&#187; */
        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;  /* ò&#212;&#207;&#194;&#203;&#196;&#184;&#246;&#182;&#188;&#206;a0, ±í&#195;÷2&#187;1y&#194;&#203;è&#206;o&#206;id */
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//32&#206;&#187;ID
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//32&#206;&#187;MASK
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  /* &#196;ü1&#187;í¨1y&#184;&#195;1y&#194;&#203;&#198;÷μ&#196;±¨&#206;&#196;′&#230;μ&#189;fifo0&#214;D */
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//&#188;¤&#187;&#238;1y&#194;&#203;&#198;÷0
        CAN_FilterInit(&CAN_FilterInitStructure);
        
        #if CAN_RX_INT_ENABLE//ê&#199;·&#241;ê1&#196;üCAN&#189;óê&#213;&#214;D&#182;&#207;
                NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;//éè&#182;¨CAN&#214;D&#182;&#207;μ&#196;í¨μà
                NVIC_InitStructure.NVIC_IRQChannelPriority = 0;//CAN&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ê1&#196;ü&#214;D&#182;&#207;
                NVIC_Init(&NVIC_InitStructure);//3&#245;ê&#188;&#187;ˉ
                CAN_ITConfig(CAN,CAN_IT_FMP0, ENABLE);//FIFO0&#207;&#251;&#207;¢1òo&#197;&#214;D&#182;&#207;ê1&#196;ü
        #endif
        return 0;
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

今天折腾了一天,发现之前的原理图上CAN的RX,TX均接了上拉电阻,将上拉电阻去掉后,初始化就能成功了,这个有什么说法么? 附上原理图,收发器用的TAJ1041,不知道这个电路图CAN部分还有没有其他问题?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

36

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2394
金钱
2394
注册时间
2016-4-14
在线时间
225 小时
 楼主| 发表于 2016-5-31 17:55:17 | 显示全部楼层
yklstudent 发表于 2016-5-31 21:23
也检测硬件是否存在问题

今天折腾了一天,发现之前的原理图上CAN的RX,TX均接了上拉电阻,将上拉电阻去掉后,初始化就能成功了,这个有什么说法么?
附上原理图,收发器用的TAJ1041,不知道这个电路图CAN部分还有没有其他问题?
QQ截图20160601175245.jpg
回复

使用道具 举报

12

主题

36

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2394
金钱
2394
注册时间
2016-4-14
在线时间
225 小时
 楼主| 发表于 2016-5-31 20:36:20 | 显示全部楼层
本帖最后由 hechuanxi0312 于 2016-5-31 21:02 编辑
yklstudent 发表于 2016-5-31 20:20
[mw_shl_code=applescript,true]void sCAN_Configuration(void)
{
        GPIO_InitTypeDef             ...

我们两个差不多,但是我设置完CAN_InitStructure之后调用CAN_Init(CAN, &CAN_InitStructure)的时候,断点进去看,发现CAN_Init()函数中第二个while (((CANx->MSR & CAN_MSR_INAK) == (uint16_t)CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))这个循环会执行完毕,结果就是返回的InitStatus是CAN初始化失败,但是我换了一块板子初始化就是成功的,现在完全不知道原因在什么地方
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-6-1 20:28:30 | 显示全部楼层
hechuanxi0312 发表于 2016-5-31 17:55
今天折腾了一天,发现之前的原理图上CAN的RX,TX均接了上拉电阻,将上拉电阻去掉后,初始化就能成功了, ...

CAN的TX,RX是不需要接上下拉电阻的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2023-5-30
在线时间
0 小时
发表于 2023-5-30 20:01:36 | 显示全部楼层
我现在的问题是只有一个STM32F303RET6的最小系统板子,没有tranciver收发器,程序已让停留在while (((CANx->MSR & CAN_MSR_INAK) == (uint16_t)CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))不能初始化成功,不知道为什么
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 06:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表