I2C、IIC通訊(填坑作,MPU6050數(shù)據(jù)讀取,STM32主控,附源碼)

上圖的VCC?接 3.3V,GND接地,SCL和SDA分別接上單片機引腳,并加上上拉電阻,AD0接地。
代碼鏈接:https://pan.baidu.com/s/1AvuMYvgX8Xy8g81S0Ay5Yg?
提取碼:sce0?
初始化單片機引腳,并置1

程序里引腳的變化順序還有延時的位置一定不要錯。
IIC起始信號;SDA置零,等待,SCL置零

寫入一次數(shù)據(jù),IIC每次寫入的數(shù)據(jù)長度都是8Bit,寫入順序是從最高位寫到最低位。
SCL置0,SDA存放數(shù)據(jù)的最高位,數(shù)據(jù)左移1位,等待,SCL置1,數(shù)據(jù)起效,等待。
右移7位:1000?0000會變成0000 0001。(0X80?>> 0X01)?
左移1位:1101 0000會變成1010 0000。(0XD0 >> 0XA0)?

每次寫完數(shù)據(jù)都要接收一次 “應(yīng)答信號” ,把SDA改為輸入模式并置1,等待,SCL置1,如果這時SDA收到0就算收到應(yīng)答。
以下為IIC通訊的測試程序,IIC通訊的首個數(shù)據(jù)一定是芯片地址,手冊上MPU6050的默認地址是1011 00xx,第一個x由AD0引腳決定,這里我把它接到了GND,所以這個x就是0,第二個x由你的目的決定,如果你打算寫入,這個x就是0,如果你打算讀取,這個x就是1,所以這里寫入的最終數(shù)據(jù)是0XD0。

如果通訊成功了,LED就會閃爍,如果LED不閃爍,就檢查芯片地址對不對,AD0引腳和芯片地址是否相符,通訊程序是否正確,每次延時給得夠不夠。
指定時間內(nèi)接收? “應(yīng)答信號” ,若等待超時就當通訊失敗,并停止通訊。

每次通訊的最后一定是停止信號;把SDA設(shè)為輸出模式,SCL置0,SDA置0,等待,SCL先置1,SDA再置1,等待。

有了這些就可以進行一次完整的寫入了,下面的程序只修改一個寄存的數(shù)據(jù),
發(fā)起起始信號;寫入芯片地址,接收應(yīng)答,寫入寄存器地址,接收,寫入數(shù)據(jù),接收應(yīng)答,停止通訊,返回"NICE",每次接收應(yīng)答的失敗都會導(dǎo)致通訊停止。

讀取一次數(shù)據(jù);先設(shè)SDA為輸入模式,把SCL設(shè)為0,等待,把SCL設(shè)為1,等待,數(shù)據(jù)左移1位,把SDA的狀態(tài)放到數(shù)據(jù)的最低位,循環(huán)八次,最后發(fā)送應(yīng)答。

如果讀取的是最后一個數(shù)據(jù)或只讀取一個數(shù)據(jù),就發(fā)送 “非應(yīng)答信號”;SCL置0,SDA置為輸出并置1,等待,SCL置1,等待,SCL置0。

讀取芯片的單個數(shù)據(jù);發(fā)起起始信號,寫入芯片地址,寫入寄存器,發(fā)起起始信號,寫入(芯片地址+1)表示讀取,讀取數(shù)據(jù),并選擇“非應(yīng)答信號”,停止通訊,返回“NICE”表示成功。

有了這些就可以完成MPU6050的數(shù)據(jù)讀取了,首先是MPU6050寫入和讀取程序的定義

MPU6050初始化和數(shù)據(jù)讀取

主函數(shù)
