1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1 简 介
最近,想学角度融合算法在网上买一个JY61的模块。他们家的模块用起来还不错。模块分为串口通讯和IIC通讯的。串口读取数据他们家有例程,我就不说了。想分享给大家这个模块的IIC是怎么去读取MPU6050芯片数据的。 想要读取MPU6050芯片,其实就是通过IIC去操作读取寄存器。大致过程就是STM32和MPU6050先建立好IIC通讯。再去初始化MPU6050芯片。然后单片机再去读取寄存器,就能把数据读取出来了。 2 配置32单片机的IIC引脚 根据你32单片机的原理图,找到你的IIC引脚。 a 时钟RCC的配置,以我自己写的为例子。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_12C1,ENABLE); b 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; GPIO_Init(GPIOB,&GPIO_InitStructure); 注意:SCL和SDA都得接上两个4.7K的电阻。不然你是读取不到MPU6050的数据。 c 32的IIC的配置 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; GPIO_Init(GPIOB,&GPIO_InitStructure); 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);//发送MPU6050地址进行写操作 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);//启用确认以准备再次接收 } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1933浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
726浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
550浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 14:58 , Processed in 0.622621 second(s), Total 45, Slave 39 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号