MPU6050开发 -- 进阶之I2C/SPI通信协议
如需轉(zhuǎn)載請注明出處:https://blog.csdn.net/qq_29350001/article/details/78611309
上一篇基本概念講了一通,大體上對MPU6050有了一個(gè)了解。對于MPU6050開發(fā)來講主要的應(yīng)該就是 I2C/SPI 通信和寄存器控制了吧。
接下來我們繼續(xù)看芯片手冊,簡單了解一下I2C/SPI通信協(xié)議。(S5PV210開發(fā)里再綜合詳講)
I2C 和SPI 都是串行同步通信,同步通信和異步通信區(qū)別是什么?這一點(diǎn)我們剛講過,參看:S5PV210開發(fā) -- 通信
?
一、I2C和SPI(僅限MPU-6000)串行接口
MPU-6000 / MPU-6050的內(nèi)部寄存器和存儲(chǔ)器可以使用400 kHz的I2C 或 1MHz的SPI(僅MPU-6000)訪問。 SPI工作在四線模式。
?
注意:
為了防止在使用SPI(MPU-6000)時(shí)切換到I2C模式,應(yīng)通過設(shè)置 I2C_IF_DIS 配置位來禁用 I2C 接口。 在等待 6.3節(jié)“寄存器讀/寫啟動(dòng)時(shí)間”指定的時(shí)間后,立即執(zhí)行該位設(shè)置。
?
二、I2C接口
I2C是由信號(hào)串行數(shù)據(jù)(SDA)和串行時(shí)鐘(SCL)組成的雙線接口。 一般來說,這些線路是開漏和雙向的。 在廣義的I2C接口實(shí)現(xiàn)中,連接的設(shè)備可以是主設(shè)備或從設(shè)備。 主設(shè)備將從設(shè)備地址放在總線上,并且具有匹配地址的從設(shè)備確認(rèn)主設(shè)備。
系統(tǒng)處理器(MPU-60X0)作為從設(shè)備與主系統(tǒng)處理器進(jìn)行通信。 SDA和SCL線通常需要上拉電阻(4.7k電阻)到VDD。 最大總線速度是400 kHz。
MPU-60X0的從機(jī)地址為 b110100X,長度為7位。 7位地址的LSB位由引腳AD0的邏輯電平?jīng)Q定。 這允許兩個(gè)MPU-60X0 連接到同一個(gè)I2C總線。在此配置中使用時(shí),其中一個(gè)設(shè)備的地址應(yīng)為b1101000(AD0引腳為邏輯低電平),另一個(gè)的地址應(yīng)為b1101001(AD0引腳為邏輯高電平)。
?
PS:講到這里就搞明白了,為什么AD0接地了!!
思考:這里只給出了從機(jī)地址?b110100X,那I2C的讀地址和寫地址是什么呢?
?
三、I2C通信協(xié)議
(1)開始(S)和停止(P)條件:
主機(jī)在總線上啟動(dòng) START 條件(S)時(shí)啟動(dòng) I2C 總線通信,總線定義為 SCL 線為高電平(見下圖)時(shí),SDA 線從高電平變?yōu)榈碗娖健?/strong> 總線被認(rèn)為是繁忙的,直到主機(jī)在總線上放置一個(gè)停止條件(P),在SCL為高電平(見下圖)時(shí),在SDA線路上定義為從低電平到高電平的跳變。
?
?
此外,如果產(chǎn)生一個(gè)重復(fù)的START(Sr)而不是STOP條件,總線將保持忙碌狀態(tài)。
?
(2)數(shù)據(jù)格式/應(yīng)答
?
I2C 數(shù)據(jù)字節(jié)定義為8位長。 每個(gè)數(shù)據(jù)傳輸傳輸?shù)淖止?jié)數(shù)沒有限制。 傳輸?shù)拿總€(gè)字節(jié)必須跟一個(gè)應(yīng)答(ACK)信號(hào)。 應(yīng)答信號(hào)的時(shí)鐘由主器件產(chǎn)生,而接收器通過下拉 SDA 并在應(yīng)答時(shí)鐘脈沖的高電平期間保持低電平來產(chǎn)生實(shí)際的應(yīng)答信號(hào)。
如果一個(gè)從機(jī)處于繁忙狀態(tài),并且在某個(gè)其他任務(wù)執(zhí)行之前不能發(fā)送或接收另一個(gè)數(shù)據(jù)字節(jié),則它可以保持SCL為低電平,從而強(qiáng)制主機(jī)進(jìn)入等待狀態(tài)。 當(dāng)從站準(zhǔn)備好時(shí),正常的數(shù)據(jù)傳輸恢復(fù),并釋放時(shí)鐘線(參見下圖)。
?
?
擴(kuò)展:
應(yīng)答信號(hào)的時(shí)鐘由主器件產(chǎn)生,這句話讓我想起先前做 DM368 編碼的時(shí)候出現(xiàn)無應(yīng)答的問題。
參看:DM368開發(fā) -- 編碼并實(shí)時(shí)播放
(3)通信
在開始與起始條件(S)的通信之后,主機(jī)發(fā)送一個(gè)7位從機(jī)地址,然后是第8位(讀/寫位)。 讀/寫位指示主器件是從正在接收數(shù)據(jù)還是正在寫入從器件。 然后,主器件釋放SDA線并等待來自從器件的應(yīng)答信號(hào)(ACK)。 傳輸?shù)拿總€(gè)字節(jié)后面都必須有一個(gè)應(yīng)答位。 為了應(yīng)答,從器件將SDA線拉低并在SCL線的高電平期間保持低電平。
數(shù)據(jù)傳輸始終由具有STOP條件(P)的主機(jī)終止,從而釋放通信線路。 但是,主器件可以產(chǎn)生一個(gè)重復(fù)的起始條件(Sr),并在不首先產(chǎn)生停止條件(P)的情況下尋址另一個(gè)從器件。 SCL為高電平時(shí),SDA線上的低電平至高電平轉(zhuǎn)換定義停止條件。 除了啟動(dòng)和停止條件之外,所有SDA變化都應(yīng)在SCL低電平時(shí)進(jìn)行。
===============================
翻譯的真亂,簡單點(diǎn)說就是:
數(shù)據(jù)傳輸:SCL為高電平時(shí),SDA線若保持穩(wěn)定,那么SDA上是在傳輸數(shù)據(jù)bit;若SDA發(fā)生跳變,則用來表示一個(gè)會(huì)話的開始或結(jié)束。應(yīng)答(ADC)為SDA為低電平。
數(shù)據(jù)改變:SCL為低電平時(shí),SDA線才能改變傳輸?shù)腷it。
===============================
?
為了寫入內(nèi)部MPU-60X0寄存器,主機(jī)發(fā)送開始條件(S),然后是I2C地址和寫入位(0)。 在第9個(gè)時(shí)鐘周期(時(shí)鐘為高電平),MPU-60X0確認(rèn)傳輸。 然后主機(jī)把寄存器地址(RA)放在總線上。 在MPU-60X0確認(rèn)接收到寄存器地址后,主機(jī)將寄存器數(shù)據(jù)放到總線上。 接著是ACK信號(hào),數(shù)據(jù)傳輸可以由停止條件(P)結(jié)束。 為了在最后的ACK信號(hào)之后寫入多個(gè)字節(jié),主機(jī)可以繼續(xù)輸出數(shù)據(jù)而不是發(fā)送停止信號(hào)。 在這種情況下,MPU-60X0自動(dòng)遞增寄存器地址并將數(shù)據(jù)裝載到適當(dāng)?shù)募拇嫫鳌O聢D顯示了單字節(jié)和雙字節(jié)寫入序列:
要讀取內(nèi)部MPU-60X0寄存器,主機(jī)將發(fā)送一個(gè)開始條件,然后是I2C地址和寫入位,然后是要讀取的寄存器地址。 主機(jī)收到來自MPU-60X0的ACK信號(hào)后,發(fā)送一個(gè)起始信號(hào),隨后是從機(jī)地址和讀取位。 結(jié)果,MPU-60X0發(fā)送一個(gè)ACK信號(hào)和數(shù)據(jù)。 通信以無應(yīng)答(NACK)結(jié)束信號(hào)和來自主機(jī)的停止位。 定義NACK條件,使得SDA線在第9個(gè)時(shí)鐘周期保持高電平。 下圖顯示了單字節(jié)和雙字節(jié)讀取序列。
四、I2C術(shù)語
五、SPI接口(僅限MPU-6000)
SPI 是一個(gè) 4 線同步串行接口,使用兩根控制線和兩根數(shù)據(jù)線。 標(biāo)準(zhǔn)主從SPI操作期間,MPU-6000始終作為從設(shè)備運(yùn)行。
對于主設(shè)備,串行時(shí)鐘輸出(SCLK),串行數(shù)據(jù)輸出(SDO)和串行數(shù)據(jù)輸入(SDI)在從設(shè)備之間共享。 每個(gè)SPI從器件都需要自己的片選(/ CS)線。
/ CS 在傳輸開始時(shí)變?yōu)榈碗娖?#xff08;有效),在結(jié)束時(shí)變?yōu)楦唠娖?#xff08;無效)。 一次只有一個(gè)/ CS線路處于活動(dòng)狀態(tài),確保在任何給定時(shí)間只有一個(gè)從站被選中。 未選中的從器件的 / CS 線保持高電平,使 SDO 線保持高阻態(tài)(高阻態(tài)),從而不會(huì)干擾任何有源器件。
SPI操作特性
1、數(shù)據(jù)首先傳遞 MSB(最高位),最后傳遞 LSB(最低位)
2、數(shù)據(jù)在SCLK的上升沿鎖存
3、數(shù)據(jù)應(yīng)在SCLK的下降沿進(jìn)行轉(zhuǎn)換
4.、SCLK的最大頻率是1MHz
5.、SPI讀寫操作在16個(gè)或更多時(shí)鐘周期(兩個(gè)或多個(gè)字節(jié))內(nèi)完成。 第一個(gè)字節(jié)包含SPI地址,下一個(gè)字節(jié)包含SPI數(shù)據(jù)。 第一個(gè)字節(jié)的第一位包含讀/寫位,并指示讀(1)或?qū)?#xff08;0)操作。
以下7位包含寄存器地址。 在多字節(jié)讀/寫的情況下,數(shù)據(jù)是兩個(gè)或多個(gè)字節(jié):
6、支持單個(gè)或雙個(gè) 讀/寫
如需轉(zhuǎn)載請注明出處:https://blog.csdn.net/qq_29350001/article/details/78611309
?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的MPU6050开发 -- 进阶之I2C/SPI通信协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop3.1.2 配置 3台
- 下一篇: MPU6050开发 -- 在 C52 单