打印
[STM32F0]

急切求助!!!STM32F042 CAN总线驱动初始化不成功!

[复制链接]
14039|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 想把我唱给你听 于 2014-10-22 11:12 编辑

我现在做一个汽车CAN总线通信,在f103(使用V3.5库)上跑得很完美,一搬到f042(使用V1.3.1库)上就是死活初始化不成功:


代码如下:
void CAN_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  NVIC_InitTypeDef  NVIC_InitStructure;
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
   
  /* Enable GPIO clock */
  RCC_AHBPeriphClockCmd(CAN_GPIO_CLK, ENABLE);

  /* Enable CAN clock */
  RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

          /* CAN register init */
  CAN_DeInit(CAN);
        GPIO_DeInit(GPIOA);

          /* Configure CAN RX and TX pins */
  GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;
  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(CAN_GPIO_PORT, &GPIO_InitStructure);
        
  /* Connect CAN pins to AF4 */
  GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
  GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);
  
          /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber = 0;
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);

  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM = DISABLE;
  CAN_InitStructure.CAN_ABOM = ENABLE;
  CAN_InitStructure.CAN_AWUM = ENABLE;
  CAN_InitStructure.CAN_NART = DISABLE;
  CAN_InitStructure.CAN_RFLM = DISABLE;
  CAN_InitStructure.CAN_TXFP = DISABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

         /* CAN Baudrate = 500KBps (CAN clocked at 48 MHz) */
  CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler = 6;
  CAN_Init(CAN, &CAN_InitStructure);             //代码就死在这个函数里面的等待硬件应答的地方,附在下方

    /* NVIC configuration ****/
  NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Enable FIFO 0 message pending Interrupt */
  CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
}


代码就死在这个初始化的函数里面,我是通过在线调试发现问题出在这的。。。。。。
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))    //硬件在这里无应答呢,初始化失败,这咋回事
   {
     wait_ack++;                                                                                                                                                 我已经整了第三天了,求各位有经验的大哥大
   }                                                                                                                                                                大神们教教小弟吧:hug:

    /* ...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;
}







沙发
mmuuss586| | 2014-10-22 12:32 | 只看该作者
仔细对了下我的程序(我的F4),基本差不多;
将CanTxMsg初始化下看看;

使用特权

评论回复
板凳
airwill| | 2014-10-22 13:32 | 只看该作者
CAN 外设在各个 MCU 间的差别不大。我也是很讨厌这个 CAN 的外设库。
不就是这几个寄存器设置嘛,最好一来气,全部改写了要用到的功能函数。

使用特权

评论回复
地板
想把我唱给你听|  楼主 | 2014-10-22 13:41 | 只看该作者
mmuuss586 发表于 2014-10-22 12:32
仔细对了下我的程序(我的F4),基本差不多;
将CanTxMsg初始化下看看;

首先谢谢你的关注,其实无关这个CanTxMsg的吧,CanTxMsg的使用液是在初始化成功以后才能用的。但是在初始化硬件后软件请求进入正常模式等待硬件应答时,超过一定时间它会自动跳出while循环,也就是返回初始化失败的值:
while (((CANx->MSR & CAN_MSR_INAK) == (uint16_t)CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
{
     wait_ack++;     
   }    //超时无应答跳出
    if ((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)
    {
      InitStatus = CAN_InitStatus_Failed;
    }

使用特权

评论回复
5
想把我唱给你听|  楼主 | 2014-10-22 13:45 | 只看该作者
airwill 发表于 2014-10-22 13:32
CAN 外设在各个 MCU 间的差别不大。我也是很讨厌这个 CAN 的外设库。
不就是这几个寄存器设置嘛,最好一来 ...

:'( 还是不行,已经第三天了,在公司干活压力大呀,硬件无应答真的无从下手了

使用特权

评论回复
6
LOVE_ELEC| | 2014-10-22 13:49 | 只看该作者
建议直接用示波器捕获波形,然后对照协议看看到底是什么问题!

使用特权

评论回复
7
sun1238898| | 2014-10-22 14:02 | 只看该作者
F4的目前确实没搞,F1的CAN倒是很好用。

使用特权

评论回复
8
想把我唱给你听|  楼主 | 2014-10-22 14:04 | 只看该作者
LOVE_ELEC 发表于 2014-10-22 13:49
建议直接用示波器捕获波形,然后对照协议看看到底是什么问题!

谢谢你的关注:handshake,我在公司做的项目,CAN分析仪、示波器都用上了,第一步没成功初始化看不出任何效果的

使用特权

评论回复
9
想把我唱给你听|  楼主 | 2014-10-22 14:09 | 只看该作者
sun1238898 发表于 2014-10-22 14:02
F4的目前确实没搞,F1的CAN倒是很好用。

我现在做的项目,前期由于硬件与软件同步进行,而手上没有项目方案所使用的对应的F0芯片,所以前期的软件的设计都是在F1上进行的。在F1上所做的Can 总线的软件开发跑得好好,可是一移植到F0上就连初始化都不成了

使用特权

评论回复
10
sun1238898| | 2014-10-22 14:12 | 只看该作者
F042这是新品,你还真的要和代理商沟通下,然后再找下原厂。

使用特权

评论回复
11
想把我唱给你听|  楼主 | 2014-10-22 14:15 | 只看该作者
sun1238898 发表于 2014-10-22 14:12
F042这是新品,你还真的要和代理商沟通下,然后再找下原厂。

:funk:若真要这样,这个麻烦可就大了,我们自己做的硬件板都已经成型了

使用特权

评论回复
12
mmuuss586| | 2014-10-22 18:31 | 只看该作者
想把我唱给你听 发表于 2014-10-22 14:15
若真要这样,这个麻烦可就大了,我们自己做的硬件板都已经成型了

有时间的话,换其它M0试下;
也许芯片有BUG也说不准;
程序的话就这么几句,看也没啥问题;

使用特权

评论回复
13
sun1238898| | 2014-10-22 19:17 | 只看该作者
我推荐找代理商,这个新品,我自自己没玩过。不知道情况。

使用特权

评论回复
14
想把我唱给你听|  楼主 | 2014-11-1 20:03 | 只看该作者
sun1238898 发表于 2014-10-22 19:17
我推荐找代理商,这个新品,我自自己没玩过。不知道情况。

谢谢你了,前几天问题已经解决了

使用特权

评论回复
15
想把我唱给你听|  楼主 | 2014-11-1 20:04 | 只看该作者
sun1238898 发表于 2014-10-22 19:17
我推荐找代理商,这个新品,我自自己没玩过。不知道情况。

问题前几天解决了。谢谢关注

使用特权

评论回复
16
harbeth| | 2014-11-2 11:09 | 只看该作者
楼主怎么解决的?

使用特权

评论回复
17
想把我唱给你听|  楼主 | 2014-11-2 13:46 | 只看该作者
harbeth 发表于 2014-11-2 11:09
楼主怎么解决的?

电源电压不稳定还有电压不足,后来换了一个12V的外部电源就可以了,妈蛋

使用特权

评论回复
18
andzheng| | 2015-8-14 10:23 | 只看该作者
深圳市树耀旺企业受权代理ST全系列MCU及 ON TOSHIBA  NXP ROHM   及分销 FSL   INF FSC ATMEL TI AD MELEXIS  被动器件授权代理:顺络 NDK  大毅精密电阻 欢迎大家来电咨询

使用特权

评论回复
19
STARM| | 2015-8-14 23:55 | 只看该作者
想把我唱给你听 发表于 2014-11-2 13:46
电源电压不稳定还有电压不足,后来换了一个12V的外部电源就可以了,妈蛋 ...

学习了,非常宝贵的经验啊,一般人还不告诉他呢。

使用特权

评论回复
20
RD007A| | 2015-10-14 10:23 | 只看该作者
楼主是系统电压不稳怎么会产生这个问题啊,还有别的原因吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

2

粉丝