[STM32F4] can的初始化失败

[复制链接]
156|24
手机看帖
扫描二维码
随时随地手机跟帖
chuxh|  楼主 | 2022-5-5 22:14 | 显示全部楼层 |阅读模式
用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;
    }
  }

这里最后报错

使用特权

评论回复
llljh| | 2022-5-5 22:16 | 显示全部楼层
要上拉电阻

使用特权

评论回复
chuxh|  楼主 | 2022-5-5 22:19 | 显示全部楼层
不知道是哪个引脚啊?

使用特权

评论回复
wyjie| | 2022-5-5 22:22 | 显示全部楼层
时钟怎么配置的

使用特权

评论回复
llljh| | 2022-5-5 22:24 | 显示全部楼层
io口如何设置的

使用特权

评论回复
chuxh|  楼主 | 2022-5-5 22:26 | 显示全部楼层
wyjie 发表于 2022-5-5 22:22
时钟怎么配置的

是这个吗

使用特权

评论回复
chuxh|  楼主 | 2022-5-5 22:28 | 显示全部楼层
llljh 发表于 2022-5-5 22:24
io口如何设置的

io口只有这些啊

使用特权

评论回复
chuxh|  楼主 | 2022-5-5 22:31 | 显示全部楼层
而且我发现同样的配置,can2可以初始化成功,can1不行

使用特权

评论回复
chuxh|  楼主 | 2022-5-5 22:39 | 显示全部楼层
648006273dfe77cc67.png

使用特权

评论回复
chuxh|  楼主 | 2022-5-5 22:41 | 显示全部楼层
852726273e208e3f44.png 到这一步windows会提示无法识别的设备

使用特权

评论回复
xxrs| | 2022-5-5 22:43 | 显示全部楼层
io配置的不对

使用特权

评论回复
wyjie| | 2022-5-5 22:45 | 显示全部楼层
配置后就可以了,GPIO没有难度

使用特权

评论回复
dingy| | 2022-5-5 22:47 | 显示全部楼层
测试CAN的回环,可以的话就进行下一步

使用特权

评论回复
heweibig| | 2022-5-5 22:51 | 显示全部楼层
连接两个CAN设备,通过CAN收发器测试CAN的正常模式

使用特权

评论回复
dengdc| | 2022-5-5 22:54 | 显示全部楼层
然后找个协议 CANopen耍耍

使用特权

评论回复
supernan| | 2022-5-5 22:56 | 显示全部楼层
难道是芯片的bug?

使用特权

评论回复
wyjie| | 2022-5-5 22:58 | 显示全部楼层
来自奋斗开发板的例程,看有没有用,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;
}

使用特权

评论回复
juventus9554| | 2022-5-5 23:01 | 显示全部楼层
初始化是卡在while循环里边了么

使用特权

评论回复
stly| | 2022-5-5 23:04 | 显示全部楼层
遇到同样的问题了,请问是怎样解决的呢?这是我的gpio配置

使用特权

评论回复
stly| | 2022-5-5 23:07 | 显示全部楼层
150046273e76d44651.png

使用特权

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

本版积分规则