南京触屏网站开发,asp 网站开发实例教程,外贸用什么平台自建站较好,北京网站优化什么价格今天的读ID号是建立在上篇文章中有了底层的I2C通讯的6个基本时序来编写的。首先需要完成的就是MPU6050的初始化函数 然后就是编写 指定地址写函数#xff1a; 一#xff1a;开始 二#xff1a;发送 从机地址读写位#xff08;1#xff1a;读 0#xff1…今天的读ID号是建立在上篇文章中有了底层的I2C通讯的6个基本时序来编写的。首先需要完成的就是MPU6050的初始化函数 然后就是编写 指定地址写函数 一开始 二发送 从机地址读写位1读 0写 三接收应答位 四发送 指定寄存器地址用于指定读写哪个寄存器 五接收应答位 六发送要写入指定寄存器下的数据 七接收应答位 八终止
这个过程不是自己瞎编的而是要根据MPU6050的时序图来确定的 接下来要写的函数是指定地址读的函数 一开始 二发送 从机地址读写位 三接收应答位 四发送 指定寄存器地址用于指定读哪个寄存器 五接收应答位 六开始 七发送 从机地址读写位11读 0写 八接收应答位 九接收一个字节此时总线控制权交给从机 十发送应答位0就是给从机应答从机继续发数据 1就是不给从机应答从机停止发数据 十一终止 好了到此读写MPU6050的基本操作就都完成了剩下的事就是往不同的寄存器内写入不同的数据实现不同的功能了这个明天在学习吧今天的代码贴出来看看吧
#include stm32f10x.h // Device header
#include MPU6050.h
#include MyI2C.h#define MPU6050_ADDRESS 0xD0 /*指定地址写函数一开始二发送 从机地址读写位1读 0写三接收应答位四发送 指定寄存器地址用于指定读写哪个寄存器五接收应答位六发送要写入指定寄存器下的数据七接收应答位八终止
*/
void MPU6050_WriteReg(uint8_t Address, uint8_t Data)
{MyI2C_Star();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(Address);MyI2C_ReceiveAck();MyI2C_SendByte(Data); //如果想实现指定地址写多个数据可以在此处加循环循环数据个数次MyI2C_ReceiveAck(); //每次循环都要加接收应答位MyI2C_Stop();
}/*指定地址读的函数一开始二发送 从机地址读写位三接收应答位四发送 指定寄存器地址用于指定读哪个寄存器五接收应答位六开始七发送 从机地址读写位11读 0写八接收应答位九接收一个字节此时总线控制权交给从机十发送应答位0就是给从机应答从机继续发数据 1就是不给从机应答从机停止发数据十一终止*/
uint8_t MPU6050_ReadReg(uint8_t Address)
{uint8_t Data;MyI2C_Star();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(Address);MyI2C_ReceiveAck();MyI2C_Star();MyI2C_SendByte(MPU6050_ADDRESS | 0x01);MyI2C_ReceiveAck();Data MyI2C_ReceiveByte();MyI2C_SendAck(1);MyI2C_Stop();return Data;
}void MPU6050_Init(void)
{MyI2C_Init();
}
写了一个MPU6050.h文件方便测试一下今天的功能
#ifndef __MPU6050_H
#define __MPU6050_Hvoid MPU6050_Init(void);uint8_t MPU6050_ReadReg(uint8_t Address);void MPU6050_WriteReg(uint8_t Address, uint8_t Data);#endif然后就是主函数调用一下验证结果了
#include stm32f10x.h // Device header
#include OLED.h
#include MPU6050.h
#include MPU6050_Reg.hint main(void)
{OLED_Init(); //oled 屏幕初始化MPU6050_Init();uint8_t ID MPU6050_ReadReg(MPU6050_WHO_AM_I);OLED_ShowHexNum(1,1, ID, 2);while(1){}
}编译下载后的结果如图