两个单片机iic通讯程序_STM32通过IIC接口读取JY61模块MPU6050陀螺仪芯片数据核心程序...

1 简述

最近,想学角度融合算法在网上买一个JY61的模块。他们家的模块用起来还不错。模块分为串口通讯和IIC通讯的。串口读取数据他们家有例程,我就不说了。想分享给大家这个模块的IIC是怎么去读取MPU6050芯片数据的。

24b13614b02020d7b0fd7933f809008c.png

想要读取MPU6050芯片,其实就是通过IIC去操作读取寄存器。注意模块默认是串口直接输出数据的,需要先将模块设置为IIC模式后,才可以直接访问MPU6050芯片,不过因为角度数据是模块内部算法解出来的,用IIC接口无法获取到传感器角度数据了,如果要用IIC接口访问到角度数据需要选这他家的JY61P或者JY901。

连接的大致过程就是STM32和MPU6050先建立好IIC通讯。再去初始化MPU6050芯片。然后单片机再去读取寄存器,就能把数据读取出来了。

2 配置32单片机的IIC引脚

根据你32单片机的原理图,找到你的IIC引脚。

  • 时钟RCC的配置

以我自己写的为例子。

deeebd29c313f5c8b00ff12001650e26.png
  • GPIO口的配置

a964f15f707dd587109c75552c72f1ff.png

注意:SCL和SDA都得接上两个4.7K的电阻。不然你是读取不到MPU6050的数据。

  • STM32的IIC的配置

fa3247a16fbfef8b7b92086e61b2e060.png

3 初始化 MPU6050

     void MPU6050_Initialize()        
         {        
              MPU6050_I2C_ByteWrite(0xd0,0x00,MPU6050_RA_PWR_MGMT_1);     
              MPU6050_I2C_ByteWrite(0xd0,0x07,MPU6050_RA_SMPLRT_DIV);   
              MPU6050_I2C_ByteWrite(0xd0,0x06,MPU6050_RA_CONFIG);                 
              MPU6050_I2C_ByteWrite(0xd0,0x01,MPU6050_RA_ACCEL_CONFIG);     
              MPU6050_I2C_ByteWrite(0xd0,0x18,MPU6050_RA_GYRO_CONFIG);      
         }

注意:0xD0 表示 MPU6050 的地址。MPU6050有 8 位的地址,前 7 位由 WHO AM I 确定,第 8 位由 AD0 的电平决定。WHO AM I 默认值是 0x68H(1101000B),AD0 接低电平,所以 MPU6050 的 I2C 地址是 0xD0H(11010000B)。

4 核心读取程序

总结: 发送开始信号 -> 起始成功? -> 发送 MPU6050 地址、状态(写)-> 写地址成功? -> 发送 MPU6050内部某个待写寄存器地址 -> 发送成功? -> 发送要写入的内容 -> 发送成功? -> 发送结束信号

void MPU6050_I2C_BufferRead(u8 slaveAddr, u8* pBuffer, u8 readAddr, u16 NumByteToRead)
{
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  I2C_GenerateSTART(I2C1, ENABLE);//发送开始条件
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//在EV5上测试并清除
  I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Transmitter); //发送MOU6050地址进行写操作
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//在EV6上测试并清除
  I2C_Cmd(I2C1, ENABLE);//通过再次设置PE位来清除EV6
  I2C_SendData(I2C1, readAddr);//发送MPU6050的内部地址来写入
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//在EV8上测试并清除
  I2C_GenerateSTART(I2C1, ENABLE);//第二次发送STRAT条件
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//在EV5上测试并清除
  I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Receiver);//发送MOU6050地址进行写操作
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//在EV6上测试并清除
  while(NumByteToRead)//当有数据被读取到的时候
  {
    if(NumByteToRead == 1)
    {
      I2C_AcknowledgeConfig(I2C1, DISABLE);//Acknowledge不使能
      I2C_GenerateSTOP(I2C1, ENABLE);//发送停止条件
    }
    if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))//在EV7上测试并清除
    {
      *pBuffer = I2C_ReceiveData(I2C1);//从MPU6050读取一个字节
      pBuffer++;//指向将保存读取的字节的下一个位置
      NumByteToRead--;//读取字节计数器减一
    }
  }
  I2C_AcknowledgeConfig(I2C1, ENABLE);//启用确认以准备再次接收
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值