stm32下使用硬件I2C心得

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);
}

《stm32下使用硬件I2C心得》有2个想法

  1. 博主您好,
    看了您的帖子发现我们有很多共同点。我也做过二轮平衡车。
    最近在使用stm32f103驱动MMA8451,我看您的帖子应该是跟8451有关的,能不能将您调通的代码给我一份,我老是调不好,814118650@qq.com。

    谢谢

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload the CAPTCHA.