一、I2C
1.定義
????????內部集成電路的簡稱,半雙工串行同步通信,是芯片和芯片之間的通信方式;通常只有一個主機,多個從機,采用主從應答的方式
- 上圖所示是IIC的總線的使用場景,所有掛載在IIC總線上的設備都有兩根信號線,一根是數據線SDA, 另一根是時鐘線SCL。這兩個信號線都是雙向的。
- 作為一種通信方式,IIC總線在某一時刻,總線只允許有一個設備處于發送狀態,所發生的數據被總 線上所有的設備所接收。IIC通信協議包含有設備地址,只有發送方攜帶的地址與某個接收方的地址 相同時,接收方才真正執行相關的指令。
- 主從應答:命令總是由主機發起,從機應答,如果主機只有一個,叫單主機,兩個或兩個以上,是多主機,通常情況下為單主機;主機再發命令的時候,所有從機都能收到,從機的回答所有也都能收到;
- 時鐘信號線永遠只有主機發;
2.釋放總線:
- 整根線為高電平
- 釋放總線的權利(1)應該由接收方來,誰要接收數據,誰要提前釋放總線
3.上拉電阻
- ?IIC總線規定,設備在空閑時,兩根總線都處于高電平狀態。為保證這種狀態,數據線SDA和時鐘線SCL都 要外接上拉電阻。對于I.MX來說,這個上拉電阻也可以在引腳電器配置中設置。
- 上拉電阻的作用就是當雙方在發1的時候,保證最后線上是1,防止內阻拉低,看過原理圖10k
4.I2C時序圖:
- 空閑時,兩根線均處于高電平;
- 每次通信前,發送方首先發送一個“起始”信號,其實信號就是在SCL為高電平 時,SDA發送一個低電平。時鐘信號是由主機來控制和發送;
- 時鐘信號線為低電平時,數據信號線可以發生改變,當為高電平時,數據信號線必須保持穩定,接收方要在高電平階段來采樣。
- 高位先行原則
- 當發完信號時,接收方需要應答,應答為ACK(0)或者NACK(1)(芯片手冊寫);
- 如果后續還有發送數據,就接著應答后面,繼續發,依舊遵循上述原則
- 如果后續沒有發送數據,在時鐘信號線為高電平時,把數據信號線拉為高電平,從此置空閑狀態
每一個從機都有占有一個字節的地址值,而主機發完一個起始信號后,先發從機的地址,地址占7位;最后一個bit,是數據流向位。0:主機發從機收;1:從機發主機收,
5.I.MA6ULL
6.寄存器I2C_I2CR
- IEN(bit7):I2C 使能位,為 1 的時候使能 I2C,為 0 的時候關閉 I2C;
- IIEN(bit6):I2C 中斷使能位,為 1 的時候使能 I2C 中斷,為 0 的時候關閉 I2C 中斷;
- MSTA(bit5):主從模式選擇位,設置 IIC 工作在主模式還是從模式,為 1 的時候工作在主模式,為 0的時候工作在從模式;
- MTX(bit4):傳輸方向選擇位,用來設置是進行發送還是接收,為 0 的時候是接收,為 1 的是發送;
- TXAK(bit3):傳輸應答位使能,為 0 的話發送 ACK 信號,為 1 的話發送 NO ACK 信號;
- RSTA(bit2):重復開始信號,為 1 的話產生一個重新開始信號。
7.寄存器 I2Cx_I2SR?
- ICF(bit7):數據傳輸狀態位,為 0 的時候表示數據正在傳輸,為 1 的時候表示數據傳輸完成;
- IAAS(bit6):當為 1 的時候表示 I2Cx_IADR 寄存器中的地址是從設備地址。為0表示I2Cx_IADR是自己的地址;
- IBB(bit5):I2C 總線忙標志位,當為 0 的時候表示 I2C 總線空閑,為 1 的時候表示 I2C 總線忙;
- IAL(bit4):仲裁丟失位,為 1 的時候表示發生仲裁丟失。仲裁丟失在手冊第1455頁有說明,如果多個設備同時嘗試連接總線,則其中一個成為主設備。硬件會立即將仲裁失敗的設備切換到Slave
- Receive模式 。那么仲裁失敗的設備就會產生仲裁丟失,導致此位置位。需要理解的是這種情況一定發生在發送起始位的時候,也就是說在發送完起始位之后應該判斷此位是否為1;
- SRW(bit2):從機讀寫狀態位,當 I2C 作為從機的時候使用,此位用來表明主機發送給從機的是讀還是寫命令。為 0 的時候表示主機要向從機寫數據,為 1 的時候表示主機要從從機讀取數據;
- IIF(bit1):I2C 中斷掛起標志位,當為 1 的時候表示有中斷掛起,此位需要軟件清零;
- RXAK(bit0):應答信號標志位,無論作為主機還是從機,為 0 的時候表示接收到 ACK 應答信號,為1 的話表示檢測到 NO ACK 信號。
8.寄存器I2Cx_I2DR
注意:此時LSB代表的是數據流向,需要按照實際情況設置為1或者0;如果要接收數據的話? ? ? ? ? 直接讀取此寄存器即可得到接收到的數據。
二、電可擦存儲器
1.時序圖
(1)寫8個bit數據
(2)連續寫數據
寫操作:首先主從機釋放總線處于空閑狀態,主機在clk處于高電平時,將sda電平拉高,發送起始位。接著主機發送8個bit的設備地址,第8位為數據流向位(0為主機寫,1為主機讀),從機收到后會發送ACK應答。主機收到從機的應答后,再發送寄存器的地址位,從機收到后發送ACK應答;之后主機發送數據,從機收到后發送ACK應答。主機發送完之后在clk位高電平時拉高電平發送停止位。
(3)當前位置發數據給主機
(3)主機從指定位讀
讀操作:主機先發送起始位,之后發送8位的設備地址,其中第8個bit寫操作,從機收到發送ACK應答,主機再發送寄存器地址,從機回復ACK應答。之后主機會重發設備地址,但第8bit為讀操作,從機收到回復ACK應答,從機發送數據,主機收到后回復ACK,主機在最后一個數據字節后回復NACK表示結束,之后主機發送停止位。
- 如果最后主機回應NACK是從機不發了,如果主機發ACK的話,就繼續發
三、I2C原理
1.總原理圖
- 作為發送方,是否要檢測對面回應的ACK;
- 作為接收方,回應的是ACK/NACK;
- 一般用于停止位是否發送并且置1成功