stm32的硬件I2C接口是每个使用stm32的人都会遇到的一个难点之一。我之前也在这卡了很长的时间。这里记录下stm32的i2c接口的使用心得。
说说我遇到的问题:
首先我使用的是STM32的I2C1,死活调不出来,于是google了下,发现是我把fsmc的时钟打开了,这是stm32设计的一个Bug,在使用fsmc的时候i2c是无法使用的。
修正了以后发现还是不行,绞尽脑汁,最后发现是速率的问题,我的i2c从机根本就支持不了那么高的速度,所以降低了速率。延了时。果然解决了,哈哈。
下面是配置源码:
void i2c_init(){ GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; /* PB10 SCL and PB11 SDA */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_DeInit(MMA8451_I2C); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = MMA845x_IIC_ADDRESS; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; I2C_Cmd(MMA8451_I2C, ENABLE); I2C_Init(MMA8451_I2C, &I2C_InitStructure); /* Enable the sEE_I2C peripheral DMA requests */ //I2C_DMACmd(I2C1, ENABLE); }
博主您好,
看了您的帖子发现我们有很多共同点。我也做过二轮平衡车。
最近在使用stm32f103驱动MMA8451,我看您的帖子应该是跟8451有关的,能不能将您调通的代码给我一份,我老是调不好,[email protected]。
谢谢
配置程序就是博客上放的初始化程序,stm32的i2c对于mma8451的速度太快了,你要降低速率。