野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13119|回复: 4

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

[复制链接]
发表于 2019-7-3 16:22:57 | 显示全部楼层 |阅读模式
文人手持芯片stm32f103rct6
最近我尝试读取mpu9250 但是一直碰到I2C读取死循环的问题 就死在了这个函数里面I2C_WaitOnMasterAddressFlagUntilTimeout   一直都在while loop里循环 我也不知道这个函数到底是什么意思
[mw_shl_code=c,true]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;
}[/mw_shl_code]
我查询过网上其他解决办法 但都没有用处 修改的代码基本上是这么写的(见下文代码)  
[mw_shl_code=c,true]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 */
  }

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

回复

使用道具 举报

 楼主| 发表于 2019-7-3 18:09:40 | 显示全部楼层
一个i2c接口 调了不知道多少个星期 到现在还是读不出半个字儿
回复 支持 反对

使用道具 举报

发表于 2019-7-4 09:06:31 | 显示全部楼层
改用软件i2c
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-7-5 11:38:26 | 显示全部楼层
再问个问题 我在读磁力计的时候 为啥读数全是65535 ID读出来是0xff  bypass模式我也设置了但并没有什么卵用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-5 12:15:44 | 显示全部楼层
我在设置完bypass模式之后也做了延迟才开始设置磁力计的
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 14:58 , Processed in 0.041039 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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