Stm32F103RCT6硬件i2c HAL库函数bug

问题描述 使用stm32f103rcT6芯片的i2c引脚PB6 PB7连接EEROM AT24C02进行EEROM读写时调用 HAL_I2C_Mem_Write和HAL_I2C_Mem_Read函数进行读写操作不能成功,使用示波器测的引脚也无波形产生,最终在函数void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)中发现其代码如下

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

{


  GPIO_InitTypeDef GPIO_InitStruct;

  if(i2cHandle->Instance==I2C1)

  {

  /* USER CODE BEGIN I2C1_MspInit 0 */


  /* USER CODE END I2C1_MspInit 0 */

  

    /**I2C1 GPIO Configuration    

    PB6     ------> I2C1_SCL

    PB7     ------> I2C1_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* I2C1 clock enable */

    __HAL_RCC_I2C1_CLK_ENABLE();

  /* USER CODE BEGIN I2C1_MspInit 1 */


  /* USER CODE END I2C1_MspInit 1 */

  }

}

将其更改为如下 即先使能时钟 再初始化引脚问题得以解决可以正常读写EEROM

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

{


  GPIO_InitTypeDef GPIO_InitStruct;

  if(i2cHandle->Instance==I2C1)

  {

  /* USER CODE BEGIN I2C1_MspInit 0 */


  /* USER CODE END I2C1_MspInit 0 */

  /* I2C1 clock enable */

  __HAL_RCC_I2C1_CLK_ENABLE();

    /**I2C1 GPIO Configuration    

    PB6     ------> I2C1_SCL

    PB7     ------> I2C1_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    

  /* USER CODE BEGIN I2C1_MspInit 1 */


  /* USER CODE END I2C1_MspInit 1 */

  }

}

希望对后面遇到的人有用 by荒野大嫖客


1 个评论

 楼主你好,我现在用cubemx生成的hal_i2c_mem_read函数,发设备地址0x6b,寄存器地址0x01。用示波器发现,发设备地址的时候函数把最低位置0了,也就是改为了写的逻辑电平,我把他改回来发出0x6b的波形后,无法产生0x01的波形,请问你产生的波形是什么样子,谢谢!我的邮箱是<a href="mailto:%3Ca%20href=" mailto:768839134@qq.com"="" style="box-sizing: border-box; background: 0px 0px; color: rgb(21, 95, 170); text-decoration-line: none; cursor: pointer;">768839134@qq.com" style="box-sizing: border-box; background: 0px 0px; color: rgb(21, 95, 170); text-decoration-line: none; cursor: pointer;">768839134@qq.com,方便的话是否可以分享一下你成功的代码 


我使用的英飞凌的A2B6芯片,要读取他的指定寄存器需要发送如下波形,我用STM32的硬件I2C发不出这个波形,因为发送设备地址的时候的第八位发送的1,也就是read command,导致无法将register address发送出去,请问你用STM32的I2C能发出相同的波形吗,谢谢。

QQ图片20190116215051.jpg

要回复文章请先登录注册