0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >基础知识 > mpu6050对应i2c地址是什么_如何读取数据

mpu6050对应i2c地址是什么_如何读取数据

来源: elecfans
2021-03-17
类别:基础知识
eye 30
文章创建人 拍明

原标题:mpu6050对应i2c地址是什么_如何读取数据

  MPU6050其实就是一个 I2C 器件,里面有很多寄存器(但是我们用到的只有几个),我们通过读写寄存器来操作这个芯片。所以首要问题就是 STM32 和 MPU6050 的 I2C 通信。

  1、配置 STM32 (用I2C1:PB6——SCL;PB7——SDA)

  1)时钟 RCC

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 , ENABLE);

  2)GPIO 配置

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //两个引脚都加 4.7K 上拉电阻

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  3)I2C 配置

  void I2C_ConfiguraTIon(void)

  {

  I2C_InitTypeDef I2C_InitStructure;

  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

  I2C_InitStructure.I2C_OwnAddress1 =0xc0; // STM32 的自身地址,不与从器件相同即可

  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

  I2C_InitStructure.I2C_ClockSpeed = 100000;

  I2C_Init(I2C1, &I2C_InitStructure);

  I2C_Cmd(I2C1, ENABLE);

  }

  至此,STM32 已配置完毕,其实不是那么难。

  2、初始化 MPU6050

  void MPU6050_IniTIalize() //初始化过程 ,其实就是写 5个寄存器

  {

  MPU6050_I2C_ByteWrite(0xd0,0x00,MPU6050_RA_PWR_MGMT_1); // reg107, 唤醒,8M内部时钟源

  MPU6050_I2C_ByteWrite(0xd0,0x07,MPU6050_RA_SMPLRT_DIV); //采用频率 1000

  MPU6050_I2C_ByteWrite(0xd0,0x06,MPU6050_RA_CONFIG);

  MPU6050_I2C_ByteWrite(0xd0,0x01,MPU6050_RA_ACCEL_CONFIG); //加速度量程 2g

  MPU6050_I2C_ByteWrite(0xd0,0x18,MPU6050_RA_GYRO_CONFIG); //角速度量程 2000度/s

  }

  注:0xD0 表示 MPU6050 的地址。我们知道 I2C从器件(在此当然是指 MPU6050)有 8 位的地址,前 7 位由 WHO AM I 确定,第 8 位由 AD0 的电平决定。WHO AM I 默认值是 0x68H(1101000B),AD0 接低电平,所以 MPU6050 的 I2C 地址是 0xD0H(11010000B)。

  3、I2C 核心程序 ( 读/写)

  1)写入寄存器

  一次写操作分为几个步骤: 发送开始信号 -》 起始成功?(可能描述的不太准确) -》 发送 MPU6050 地址、状态(写)-》 写地址成功? -》 发送 MPU6050内部某个待写寄存器地址 -》 发送成功? -》 发送要写入的内容 -》 发送成功? -》 发送结束信号

  总结:先写 MPU6050 地址,再写 寄存器地址,最后写 内容,且每次都要验证(应该和应答信号有关)。这就像寄快递一样,先写市县地址,再写街道地址,最后写门牌号。

  再看下面的程序就会更容易理解一些。

  void MPU6050_I2C_ByteWrite(u8 slaveAddr, u8 pBuffer, u8 writeAddr)

  {

  /* Send START condiTIon */

  I2C_GenerateSTART(I2C1, ENABLE); //发送开始信号

  /* Test on EV5 and clear it */

  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

  /* Send MPU6050 address for write */

  I2C_Send7bitAddress(I2C1, slaveAddr, I2C_DirecTIon_Transmitter); // 发送 MPU6050 地址、状态(写)

  /* Test on EV6 and clear it */

  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  /* Send the MPU6050‘s internal address to write to */

  I2C_SendData(I2C1, writeAddr); //发送 MPU6050内部某个待写寄存器地址

  /* Test on EV8 and clear it */

  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  /* Send the byte to be written */

  I2C_SendData(I2C1, pBuffer); //发送要写入的内容

  /* Test on EV8 and clear it */

  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  /* Send STOP condition */

  I2C_GenerateSTOP(I2C1, ENABLE); //发送结束信号

  }


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

标签: mpu6050 i2c

相关资讯