打印
[STM32F4]

can的初始化失败

[复制链接]
7197|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kft91lx|  楼主 | 2018-8-15 16:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
CAN, ST, TI, TE, HC
在下新人  现在用cube生成的代码   在can初始化的时候  调试发现在

while ((hcan->Instance->MSR & CAN_MSR_SLAK) != RESET)  {
    if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
    {
      /* Update error code */
      hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;

      /* Change CAN state */
      hcan->State = HAL_CAN_STATE_ERROR;

      return HAL_ERROR;
    }
  }

这里最后报错

然后发现有这个帖子跟我的问题一样,但是说要上拉电阻 不知道是哪个引脚啊?
https://bbs.21ic.com/icview-2497492-1-1.html
沙发
kft91lx|  楼主 | 2018-8-15 16:54 | 只看该作者
求大神解答,已经搞了几天了还没进展

使用特权

评论回复
板凳
晓伍| | 2018-8-16 07:08 | 只看该作者
时钟怎么配置的

使用特权

评论回复
地板
磨砂| | 2018-8-16 08:15 | 只看该作者
io口如何设置的

使用特权

评论回复
5
kft91lx|  楼主 | 2018-8-16 11:03 | 只看该作者
本帖最后由 kft91lx 于 2018-8-16 11:09 编辑
晓伍 发表于 2018-8-16 07:08
时钟怎么配置的

是这个吗

使用特权

评论回复
6
kft91lx|  楼主 | 2018-8-16 11:04 | 只看该作者
本帖最后由 kft91lx 于 2018-8-16 11:09 编辑
磨砂 发表于 2018-8-16 08:15
io口如何设置的

io口只有这些啊

使用特权

评论回复
7
kft91lx|  楼主 | 2018-8-16 11:05 | 只看该作者
而且我发现同样的配置,can2可以初始化成功,can1不行

使用特权

评论回复
8
kft91lx|  楼主 | 2018-8-16 11:07 | 只看该作者
本帖最后由 kft91lx 于 2018-8-16 11:28 编辑

。。。

使用特权

评论回复
9
kft91lx|  楼主 | 2018-8-16 11:25 | 只看该作者
这是时钟配置

aa.bmp (1.01 MB )

aa.bmp

使用特权

评论回复
10
kft91lx|  楼主 | 2018-8-16 11:26 | 只看该作者
本帖最后由 kft91lx 于 2018-8-16 15:41 编辑

io配置

使用特权

评论回复
11
kft91lx|  楼主 | 2018-8-16 11:27 | 只看该作者
到这一步windows会提示无法识别的设备

aa2.bmp (1.07 MB )

aa2.bmp

使用特权

评论回复
12
kft91lx|  楼主 | 2018-8-16 15:42 | 只看该作者
问题解决了  是io配置的不对

使用特权

评论回复
13
stm32jy| | 2018-8-16 17:02 | 只看该作者
配置后就可以了,GPIO没有难度

使用特权

评论回复
14
stm32jy| | 2018-8-16 17:03 | 只看该作者
测试CAN的回环,可以的话就进行下一步

使用特权

评论回复
15
stm32jy| | 2018-8-16 17:03 | 只看该作者
连接两个CAN设备,通过CAN收发器测试CAN的正常模式

使用特权

评论回复
16
stm32jy| | 2018-8-16 17:04 | 只看该作者
然后找个协议 CANopen耍耍

使用特权

评论回复
17
晓伍| | 2018-8-17 08:22 | 只看该作者
kft91lx 发表于 2018-8-16 11:05
而且我发现同样的配置,can2可以初始化成功,can1不行

难道是芯片的bug?

使用特权

评论回复
18
pmw_56| | 2018-8-18 14:10 | 只看该作者
来自奋斗开发板的例程,看有没有用,STM32F103
/****************************************************************************
* 名    称:TestStatus CAN_Interrupt(void)
* 功    能:中断模式下的CAN收发
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无
****************************************************************************/
TestStatus CAN_Interrupt(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;  
  GPIO_InitTypeDef  GPIO_InitStructure;
  CanTxMsg TxMessage;

  //CanRxMsg RxMessage;
  //uint8_t TransmitMailbox = 0;


  GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);                     //端口复用为CAN1   

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                         //PB8:CAN-RX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                             //输入上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                         //PB9:CAN-TX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         //复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* CAN寄存器初始化 */
  CAN_DeInit(CAN1);
  CAN_StructInit(&CAN_InitStructure);

  /* CAN单元初始化 */
  CAN_InitStructure.CAN_TTCM=DISABLE;                           //MCR-TTCM  时间触发通信模式使能
  CAN_InitStructure.CAN_ABOM=DISABLE;                           //MCR-ABOM  自动离线管理
  CAN_InitStructure.CAN_AWUM=DISABLE;                           //MCR-AWUM  自动唤醒模式
  //CAN_InitStructure.CAN_NART=ENABLE;                           //MCR-NART  禁止报文自动重传          0-自动重传   1-报文只传一次
  CAN_InitStructure.CAN_NART=DISABLE;                           //MCR-NART  禁止报文自动重传          0-自动重传   1-报文只传一次
  CAN_InitStructure.CAN_RFLM=DISABLE;                           //MCR-RFLM  接收FIFO 锁定模式  0-溢出时新报文会覆盖原有报文  1-溢出时,新报文丢弃
  CAN_InitStructure.CAN_TXFP = ENABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  //CAN_InitStructure.CAN_TXFP=DISABLE;                           //MCR-TXFP  发送FIFO优先级 0-优先级取决于报文标示符 1-优先级取决于发送请求的顺序
  //CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;           //BTR-SILM/LBKM   CAN环回模式
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;                   //BTR-SJW 重新同步跳跃宽度 1个时间单元
  CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;                   //BTR-TS1 时间段1 占用了2个时间单元
  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;                   //BTR-TS1 时间段2 占用了3个时间单元
  
#if CAN_BAUDRATE == 1000 /* 1MBps */
  CAN_InitStructure.CAN_Prescaler =6;                           //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+2+3)/6=1Mbps
#elif CAN_BAUDRATE == 500 /* 500KBps */
  CAN_InitStructure.CAN_Prescaler =12;
#elif CAN_BAUDRATE == 250 /* 250KBps */
  CAN_InitStructure.CAN_Prescaler =24;
#elif CAN_BAUDRATE == 125 /* 125KBps */
  CAN_InitStructure.CAN_Prescaler =48;
#elif  CAN_BAUDRATE == 100 /* 100KBps */
  CAN_InitStructure.CAN_Prescaler =60;
#elif  CAN_BAUDRATE == 50 /* 50KBps */
  CAN_InitStructure.CAN_Prescaler =120;
#elif  CAN_BAUDRATE == 20 /* 20KBps */
  CAN_InitStructure.CAN_Prescaler =300;
#elif  CAN_BAUDRATE == 10 /* 10KBps */
  CAN_InitStructure.CAN_Prescaler =600;
#endif  

  //CAN_InitStructure.CAN_TXFP=DISABLE;
  //CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
//  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
//  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
//  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  //CAN_InitStructure.CAN_Prescaler=1;
  CAN_Init(CAN1, &CAN_InitStructure);

  /* CAN过滤器初始化 */
  CAN_FilterInitStructure.CAN_FilterNumber=0;                                                //
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;                //FM1R  过滤器组0的工作模式。
                                                                                                                                          //0: 过滤器组x的2个32位寄存器工作在标识符屏蔽位模式;
                                                                                                                                        //1: 过滤器组x的2个32位寄存器工作在标识符列表模式。
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;        //FS1R 过滤器组0(13~0)的位宽。
                                                                                                                                          //0:过滤器位宽为2个16位; 1:过滤器位宽为单个32位。
  
  /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */
  CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)0x1234<<3)&0xFFFF0000)>>16;                                //要过滤的ID高位
  CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x1234<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//要过滤的ID低位
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
  
//  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                       
//  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
//  /* 全为0,忽略了报文标识符判别 */
//  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
//  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;                                //FFAx : 过滤器位宽设置 报文在通过了某过滤器的过滤后,
                                                                                                                                          //将被存放到其关联的FIFO中。 0:过滤器被关联到FIFO0; 1:过滤器被关联到FIFO1。
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                                //FACTx : 过滤器激活 软件对某位设置1来激活相应的过滤器。只有对FACTx位清0,
                                                                                                                                          //或对CAN_FMR寄存器的FINIT位设置1后,才能修改相应的过滤器寄存器
                                                                                                                                        //x(CAN_FxR[0:1])。 0:过滤器被禁用; 1:过滤器被激活。
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* CAN FIFO0 接收中断使能 */
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

  /* 发送一帧报文 */
  TxMessage.StdId=0x00;
  TxMessage.ExtId=0x1234;
  TxMessage.IDE=CAN_ID_EXT;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=2;                      // 帧长度
  TxMessage.Data[0]=0xDE;
  TxMessage.Data[1]=0xCA;

  CAN_Transmit(CAN1, &TxMessage);

  /* 等待接收成功标志置位 */
  ret = 0xFF;         
  while(ret == 0xFF);

  /* 接收中断禁止*/
  CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE);

  return (TestStatus)ret;
}

使用特权

评论回复
19
wakayi| | 2018-8-20 12:51 | 只看该作者
初始化是卡在while循环里边了么

使用特权

评论回复
20
Crown133| | 2018-9-4 19:25 | 只看该作者
遇到同样的问题了,请问是怎样解决的呢?这是我的gpio配置

432975b8e6baccad45.png (49.53 KB )

432975b8e6baccad45.png

使用特权

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

本版积分规则

12

主题

35

帖子

0

粉丝