F103用Stm32CubeMx生成I2C,用于EEPROM的读写不成功。

在网上包括本站看了用STM32CubeMx生成代码控制EEPROM的成功的例子。
觉得这条路是可行的,准备依葫芦画瓢,用硬件方式实现。

但是生成之后发现,在我们使用的F103芯片上调试不成功。
看到的最主要现象是:
1、函数HAL_I2C_Mem_Write中调用了I2C_RequestMemoryWrite。在这个函数中,有配置Start Bit(CR1寄存器)的操作,但是配置之后,示波器上看不到有电平的变化。同时,SR1寄存器中的SB寄存器也没有置1,程序超时退出。
2、从本站下载了一份F407配置生成的代码进行对比,在GPIO初始化代码中有一处明显区别。F407的GPIO配置中有一处是配置Alternate,是用于配置GPIO寄存器AFR,这个寄存器F103系列没有。

请教各位大咖,哪位有用Stm32CubeMx 配置F103成功的例子,是否遇到过上述的问题,感谢!



已邀请:

jiangmaple - 70

赞同来自:

/bug在这里,请注意看下面的注释
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hi2c->Instance==I2C2)
  {
  /* USER CODE BEGIN I2C2_MspInit 0 */
    __HAL_RCC_I2C2_CLK_ENABLE(); //将这个函数提前执行,先启动时钟,后进行IIC GPIO的初始化
  /* USER CODE END I2C2_MspInit 0 */
 
    /**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.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __HAL_RCC_I2C2_CLK_ENABLE(); //时钟启动应在 HAL_GPIO_Init之前,否则设置不能生效,将这个函数提前,放在上面
  /* USER CODE BEGIN I2C2_MspInit 1 */

  /* USER CODE END I2C2_MspInit 1 */
  }

}


要回复问题请先登录注册