I2C、IIC通讯(填坑作,MPU6050数据读取,STM32主控,附源码)

上图的VCC 接 3.3V,GND接地,SCL和SDA分别接上单片机引脚,并加上上拉电阻,AD0接地。
代码链接:https://pan.baidu.com/s/1AvuMYvgX8Xy8g81S0Ay5Yg
提取码:sce0
初始化单片机引脚,并置1

程序里引脚的变化顺序还有延时的位置一定不要错。
IIC起始信号;SDA置零,等待,SCL置零

写入一次数据,IIC每次写入的数据长度都是8Bit,写入顺序是从最高位写到最低位。
SCL置0,SDA存放数据的最高位,数据左移1位,等待,SCL置1,数据起效,等待。
右移7位:1000 0000会变成0000 0001。(0X80 >> 0X01)
左移1位:1101 0000会变成1010 0000。(0XD0 >> 0XA0)

每次写完数据都要接收一次 “应答信号” ,把SDA改为输入模式并置1,等待,SCL置1,如果这时SDA收到0就算收到应答。
以下为IIC通讯的测试程序,IIC通讯的首个数据一定是芯片地址,手册上MPU6050的默认地址是1011 00xx,第一个x由AD0引脚决定,这里我把它接到了GND,所以这个x就是0,第二个x由你的目的决定,如果你打算写入,这个x就是0,如果你打算读取,这个x就是1,所以这里写入的最终数据是0XD0。

如果通讯成功了,LED就会闪烁,如果LED不闪烁,就检查芯片地址对不对,AD0引脚和芯片地址是否相符,通讯程序是否正确,每次延时给得够不够。
指定时间内接收 “应答信号” ,若等待超时就当通讯失败,并停止通讯。

每次通讯的最后一定是停止信号;把SDA设为输出模式,SCL置0,SDA置0,等待,SCL先置1,SDA再置1,等待。

有了这些就可以进行一次完整的写入了,下面的程序只修改一个寄存的数据,
发起起始信号;写入芯片地址,接收应答,写入寄存器地址,接收,写入数据,接收应答,停止通讯,返回"NICE",每次接收应答的失败都会导致通讯停止。

读取一次数据;先设SDA为输入模式,把SCL设为0,等待,把SCL设为1,等待,数据左移1位,把SDA的状态放到数据的最低位,循环八次,最后发送应答。

如果读取的是最后一个数据或只读取一个数据,就发送 “非应答信号”;SCL置0,SDA置为输出并置1,等待,SCL置1,等待,SCL置0。

读取芯片的单个数据;发起起始信号,写入芯片地址,写入寄存器,发起起始信号,写入(芯片地址+1)表示读取,读取数据,并选择“非应答信号”,停止通讯,返回“NICE”表示成功。

有了这些就可以完成MPU6050的数据读取了,首先是MPU6050写入和读取程序的定义

MPU6050初始化和数据读取

主函数
