硬件I2C配置结构
注意:本次以7位地址模式,一主多从模式对32单片机进行配置
硬件I2C初始化
时钟初始化
RCC_APB2PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
引脚初始化
GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;//复用开漏输出模式 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct);
I2C2配置寄存器初始化(设置stm32从机模式下7位响应地址,自身地址0x00)
I2C_InitTypeDef I2C_InitStruct; I2C_InitStruct.I2C_Ack=I2C_Ack_Enable; I2C_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit; I2C_InitStruct.I2C_ClockSpeed=50000; I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2; I2C_InitStruct.I2C_Mode=I2C_Mode_I2C; I2C_InitStruct.I2C_OwnAddress1=0x00; I2C_Init(I2C2,&I2C_InitStruct); I2C_Cmd(I2C2,ENABLE);
注意:占空比在时钟频率小于100KHZ时配置无效,低于100KHZ占空比时间固定为一比一,为标准模式,且该比例是低电平时间比高电平时间
硬件I2C读写MPU6050
超时等待机制:
void MPU6050_WaitEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) { uint32_t Timeout; Timeout = 10000; while(I2C_CheckEvent(I2Cx,I2C_EVENT)!=SUCCESS) { Timeout --; if(Timeout==0) { return; } } }
I2C写MPU6050
void HMPU6050_WriteReg(uint8_t RegAddress, uint8_t Data) { I2C_GenerateSTART(I2C2,ENABLE); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Transmitter); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); I2C_SendData(I2C2,RegAddress); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING); I2C_SendData(I2C2,Data); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED); I2C_GenerateSTOP(I2C2,ENABLE); }
I2C读MPU6050
uint8_t HMPU6050_ReadReg(uint8_t RegAddress) { uint8_t Data; I2C_GenerateSTART(I2C2,ENABLE); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Transmitter); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); I2C_GenerateSTART(I2C2,ENABLE); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Receiver); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); I2C_AcknowledgeConfig(I2C2,DISABLE); I2C_GenerateSTOP(I2C2,ENABLE); MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED); Data = I2C_ReceiveData(I2C2); I2C_AcknowledgeConfig(I2C2,ENABLE); return Data; }
注意:以上发送和接收均是一个字节的代码,多字节代码请自行修改