movetoporket 发表于 2018-9-25 15:55:16

STM32F407 硬 件I2C速度达不到400K

我在使用STM32F407的硬件I2C,工程是用CUBE生成,速度设定为400KHz,但实际测试只有297KHz,求大神们指点下,用CUBE生成的硬件I2C,能改动的参数不多,附上初始化,求大神们指点下!谢谢!
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 400000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
    Error_Handler();
}

butterflyspring 发表于 2018-9-25 16:27:16

你是用什么时钟?如果是外部时钟,你的外部时钟(和你实际的外部晶体)和PLL在cubeMx的配置是正确的吗?

xiaolingoei 发表于 2018-9-25 19:09:06

据说是STM32本身的问题,即使你用了hal库也一样。
我提供一种解决方法给LZ参考:
我是用两个GPIO口模拟的IIC通信,来读取EEPROM,没有任何问题。因为GPIO的通信速率有100M,模拟IIC的通信达到400K很容易。
这个地方新手容易把应答信号写错,其他的就没什么了,祝LZ早日解决问题

desertsailor 发表于 2018-9-25 19:10:13

肯定是时钟设置不对,要么是系统时钟,要么是I2C的时钟

toofree 发表于 2018-9-26 09:21:23

像这种情况,一般是时钟设置不对。
STM32CubeMX设置的时钟也不一定对,不排除会有BUG。自己调试,看一下各时钟都是多少,尤其是观察下系统时钟。

movetoporket 发表于 2018-9-26 10:05:08

这是我配置的时钟,各位大神有好建议不?我看不出时钟跟I2C速度慢的关系。

movetoporket 发表于 2018-9-26 10:07:01

@ xiaolingoei ,不想用软件,项目所限。

whtt 发表于 2018-9-26 10:11:19

换用LL库试试
页: [1]
查看完整版本: STM32F407 硬 件I2C速度达不到400K