概述
第一塊:介紹協議規則,然后用軟件模擬的形式來實現協議。
第二塊:介紹STM32的iic外設,然后用硬件來實現協議。
程序一現象:通過軟件I2C通信,對MPU6050芯片內部的寄存器進行讀寫,寫入到配置寄存器,就可以對外掛的這個模型進行配置,讀出數據寄存器,就可以獲取外掛模塊的數據。I2通信的目的
串口通信沒有時鐘線的異步全雙工的協議。
如果我們想要讀寫寄存器來控制硬件電路,我們至少需要定義兩個字節的數據。一個字節是我們要讀寫哪個寄存器,也就是指定寄存器的地址,另一個字節就是這個地址下存儲器的內容,寫入內容就是控制電路,讀出內容就是獲取電路狀態。
要求
1、全雙工變為半雙工;
2、應答機制(安全起見)
3、一根通訊線能夠同時外接多個模塊(單片機可以指定和任意一個模塊進行通信,同時單片機在跟某個模塊進行通信時,其他模塊不能對正常的通信產生干擾。)
4、串口是異步時序,也就是發送方和接收方約定的傳輸速率是非常嚴格的,時鐘不能有過大的偏差,也不能在傳輸過程中,單片機有事進入中斷了,異步時序是不能暫停的,單片機一個字節發一半數據暫停了,接收方是不知道的,它仍然會按照原來的約定速率讀取,最終導致傳輸出錯。(異步時序的缺點是依賴硬件外設的支持,必須要有USART電路才能方便使用,如果沒有USART硬件電路的支持,那么串口是很難用軟件來模擬的),需要將該協議改為同步協議,另外加一條時鐘線來指導對方讀寫。由于存在時鐘線,對傳輸的時間要求就不高了,單片機可以隨時暫停傳輸,去處理其他事情,因為暫停傳輸的同時,時鐘線也暫停了,所以傳輸雙方都能定格在暫停的時刻,可以過一段時間再繼續,不會對傳輸造成影響。(同步時序的好處),使用同步時序可極大降低單片機對硬件電路的依賴。即使沒有硬件電路的支持也可以很方便地用軟件手動翻轉電平來實現通信,而異步時序的好處是省一根時鐘線,節省資源,缺點是對時間要求嚴格,對硬件電路的依賴比較嚴重。
單片機讀寫自己的寄存器,可以直接通過內部的數據總線來實現,直接用指針操作就行,不需要我們操心。但是,現在這個模塊的寄存器在單片機的外面,那怎么實現單片機讀寫外部模塊寄存器的操作呢
項目要求
通過通信線,實現單片機讀寫外掛模塊寄存器的功能,其中至少要實現在指定的位置讀寄存器和在指定的位置寫寄存器兩個功能。實現讀寫寄存器也就實現了對外掛模塊的完全控制。
同步時序穩定性比異步時序更高,然后只有一根SDA數據線,變全雙工為半雙工,一根線兼具發送和接收,最大化利用資源。一主多從:單片機作為主機,主導I2C總線的運行,掛在在I2C總線的所有外部模塊都是從機,從機只有被主機點名之后才能控制IIC總線,不能在未經允許的情況下去碰I2C總線,防止沖突。
?I2C的硬件規定
1.左邊CPU就是單片機,作為總線主機,功能包括對SCL線的完全控制,任何時候都是主機完全掌控SCL線。在空閑狀態下,主機可以主動發起對SDA的控制。只有在從機發送數據和從機應答的時候,主機才會轉交SDA的控制權給從機。
2.被控IC就是掛載在iic總線上的從機,可以是姿態傳感器,OLED,存儲器,時鐘模塊等。
3.從機權利比較小,對SCL時鐘線,在任何時刻都只能被動讀取,從機不允許控制SCL線,對于SDA數據線,從機不允許主動發起對SDA的控制,只有在主機發送讀取從機的命令后,或者從機應答的時候,從機才能短暫的獲取SDA的控制權。
4.接線要求所有從機SCL,SDA線都在一條線上與主機相連。
5.主機SCL可以配置成推挽輸出,從機的SCL可以配置成浮空輸入或者上拉輸入,數據流向是主機發送,所有從機接收。
6.?主機SDA在發送的時候是輸入,在接收的時候是輸出,從機的SDA也在輸入和輸出之間切換。如果總線時序沒協調好,就可能發生兩個引腳同時處于輸出狀態。如果這時一個輸出高電平,一個輸出低電平,這個狀態就是電源短路。需要避免。
7.為了避免這個問題,IIC禁止所有設備輸出強上拉的高電平,采用外置弱上拉電阻加開漏輸出的電路結構。所以設備的SCL和SDA均要配置成開漏輸出模式。并且添加上拉電阻。
?
I2C的軟件規定
起始和終止條件
起始條件:SCL高電平期間,SDA從高電平切換到低電平
? ? ? ? 即左下角,在IIC處于空閑狀態時,SCL和SDA都處于高電平狀態,也就是沒有設備去碰SCL和SDA,SCL和SDA由外掛的上拉電阻拉高至高電平,總線處于平靜的高電平狀態,當主機需要進行數據收發時,需要產生起始條件,即SCL處于高電平,把SDA拉底,變成低電平,產生一個下降沿,當從機捕獲到SCL高電平,SDA下降沿信號時,就會進行自身的復位,等待主機的召喚,在SDA下降沿之后,主機要把SCL拉底。原因是占用總線,且為了方便基本單元的拼接,即為了保證每個時序單元的SCL都是以低電平開始,低電平結束的,這樣這些單元拼接起來,SCL才能續上。
終止條件:SCL高電平期間,SDA從低電平切換到高電平
? ? ? ? ?即SCL先拉高,SDA再拉高,產生一個上升沿,這個上升沿觸發終止條件,同時終止條件之后,SCL和SDA都是高電平。回歸到平靜狀態。類似串口的起始位和停止位。
? ? ? ? ?一個完整的數據幀總是以其實條件開始,終止條件結束,起始和終止都是由主機產生的。再總線空閑狀態時,從機雙手放開。不允許觸碰總線。