打印

关于hal库的硬件I2C陷入死循环的问题 见下文

[复制链接]
2340|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一片混沌|  楼主 | 2020-4-21 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
文人手持芯片stm32f103rct6
最近我尝试读取mpu9250 但是一直碰到I2C读取死循环的问题 就死在了这个函数里面I2C_WaitOnMasterAddressFlagUntilTimeout   一直都在while loop里循环 我也不知道这个函数到底是什么意思
[C] 纯文本查看 复制代码static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart)
{
  while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
  {
    if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
    {
      /* Generate Stop */
      hi2c->Instance->CR1 |= I2C_CR1_STOP;

      /* Clear AF Flag */
      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

      hi2c->ErrorCode = HAL_I2C_ERROR_AF;
      hi2c->PreviousState = I2C_STATE_NONE;
      hi2c->State= HAL_I2C_STATE_READY;

      /* Process Unlocked */
      __HAL_UNLOCK(hi2c);

      return HAL_ERROR;
    }

    /* Check for the Timeout */
    if(Timeout != HAL_MAX_DELAY)
    {
      if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
      {
        hi2c->PreviousState = I2C_STATE_NONE;
        hi2c->State= HAL_I2C_STATE_READY;

        /* Process Unlocked */
        __HAL_UNLOCK(hi2c);

        return HAL_TIMEOUT;
      }
    }
  }
  return HAL_OK;
}
我查询过网上其他解决办法 但都没有用处 修改的代码基本上是这么写的(见下文代码)  
[C] 纯文本查看 复制代码void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hi2c->Instance==I2C2)
  {
  /* USER CODE BEGIN I2C2_MspInit 0 */

  /* USER CODE END I2C2_MspInit 0 */
                 __HAL_RCC_I2C2_CLK_ENABLE();//有人说是将I2C时钟提前打开
               

   __HAL_RCC_GPIOB_CLK_ENABLE();
    /**I2C2 GPIO Configuration   
    PB10     ------> I2C2_SCL
    PB11     ------> I2C2_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
                GPIO_InitStruct.Pull= GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
               
                __HAL_RCC_I2C2_FORCE_RESET();
                __HAL_RCC_I2C2_RELEASE_RESET();//也有人说是加上这两句话 所以我既提前了又加了这两句
    /* Peripheral clock enable */
          
  /* USER CODE BEGIN I2C2_MspInit 1 */

  /* USER CODE END I2C2_MspInit 1 */
  }

}

以下是链接我找到的问题解决办法的原文 但是不幸的是到了我这里无法解决问题
https://bbs.21ic.com/icview-1645236-1-1.html

使用特权

评论回复
评论
craove 2022-7-27 22:05 回复TA
这个问题解决了吗 

相关帖子

沙发
tianxj01| | 2020-4-21 10:48 | 只看该作者
不想复杂的去看你的代码。
STM系列,库函数做IIC卡死,最常见的,无一例外基本上死在器件ACK应答环节,还缺少超时容错,则直接卡死。
而且,理论上调试IIC,如果不挂从器件,则总线总是空闲状态,如果主机能够自主发送从机地址命令,而且能容错循环发送,则以后可能通信有问题,但是不会再卡死。

使用特权

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

本版积分规则

391

主题

391

帖子

0

粉丝