1.I2C總線及其工作原理
微控制器和各種傳感器的通信一般是通過I2C 總線(Inter-IntegratedCircuit)。
I2C 串行總線一般有兩根信號線,一根是雙向的數(shù)據(jù)線SDA,另一根是時鐘線SCL。I2C 的工作原理如圖所示,主機(jī)在SCL 線上產(chǎn)生自己的時鐘來傳輸I2C 總線上的數(shù)據(jù),數(shù)據(jù)只在時鐘的高電平周期有效,每傳輸一個數(shù)據(jù)位就產(chǎn)生一個時鐘脈沖,數(shù)據(jù)線的高或低電平狀態(tài)只有在SCL 線的時鐘信號是低電平時才能改變,當(dāng)SCL 為高電平時,SDA 的改變表示“開始”和“停止”狀態(tài),即SDA 由高電平轉(zhuǎn)入低電平表示開始,該命令必須在其它命令前執(zhí)行;SDA 由低電平轉(zhuǎn)入高電平表示停止?fàn)顟B(tài),該命令可終止所有通訊。 在開始條件后,SCL 低電平期間,SDA 允許變化,每位數(shù)據(jù)需一個時鐘脈沖,當(dāng)SCL 為高時,SDA
必須穩(wěn)定,主控器在應(yīng)答時鐘脈沖高電平期間釋放SDA 線,轉(zhuǎn)由接收器控制。相同總線上的設(shè)備在收到數(shù)據(jù)后,以置SDA
為低電平的方式對其確認(rèn)??偩€不忙時,數(shù)據(jù)線和時鐘線保持為高電平。
仿真:
用keil C語言寫出I2C總線傳輸?shù)拇a,編譯通過后寫入MCU的程序ROM中,測試是否能按照總線的協(xié)議正常工作。
首先,對MC8051 的端口加以命名:
Sbit sda=P1^7 Sbit scl=P1^6 啟動函數(shù):在SCL 為高時,給出SDA 的下降沿,即為啟動信號。 停止函數(shù):在SCL 為高時,給出SDA 的上升沿,即為停止信號。 發(fā)送函數(shù):向I2C 總線寫數(shù)據(jù),每次寫8 位。首先拉低SCL,然后使發(fā)送數(shù)據(jù)左移,用SDA 發(fā)送一位數(shù)據(jù),再拉高SCL 以給出上升沿,發(fā)出SDA的狀態(tài)值。 接受函數(shù):從I2C 總線讀數(shù)據(jù),每次讀8 位。首先拉高SCL,然后接受值左移一位把低位和SDA 相或得到SDA 的狀態(tài)值,再拉低SCL 以給出下降沿。 舉例說明:利用MCU 程序控制傳送數(shù)據(jù)12,二進(jìn)制表示為00001100。Modelsim 的仿真結(jié)果如圖所示,可見sda 即P1[7]上傳輸數(shù)據(jù),scl 即P1[6]上的狀態(tài)改變控制了時鐘,時序與協(xié)議要求完全符合。
2.SPI總線及其工作原理
微控制器和無線收發(fā)器模塊的通信一般是通過SPI 總線(Serial Peripheral interface)。
SPI 就是串行外圍設(shè)備接口,是一種高速的、全雙工、同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時為PCB 的布局上節(jié)省空間,提供方便。 該接口一般使用4 條線:串行時鐘線(SCK)、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI 和低電平有效的從機(jī)選擇線SS(有的SPI 接口芯片帶有中斷信號線INT 或INT、有的SPI 接口芯片沒有主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI)。 SPI 的工作模式有兩種:主模式和從模式,無論那種模式,都支持3Mbit/s的速率,并且還具有傳輸完成標(biāo)志和寫沖突保護(hù)標(biāo)志。 仿真:
對于不帶SPI 串行總線接口的MC8051 來說,可以使用軟件來模擬SPI的操作,包括串行時鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出。對于不同的串行接口外圍芯片,它們的時鐘時序是不同的。
用keil C 語言寫出I2C總線傳輸?shù)拇a,編譯通過后寫入MCU 的程序ROM 中,測試是否能按照總線的協(xié)議正常工作。 首先,對MC8051 的端口加以命名: Sbit MISI=P1^0 Sbit MISO=P1^3 Sbit SCK=P1^1 Sbit SS=P1^2 發(fā)送函數(shù):向SPI 總線寫數(shù)據(jù),每次寫8 位。首先拉低SCK,然后使發(fā)送數(shù)據(jù)左移,用MISI發(fā)送一位數(shù)據(jù),再拉高SCL 以給出時鐘的上升沿以發(fā)出數(shù)據(jù)。 接受函數(shù):從SPI 總線讀數(shù)據(jù),每次讀8 位。首先拉低SCK,然后接受值左移一位把低位和MISO相或得到接受數(shù)據(jù)該位的狀態(tài)值,再拉高SCL以給出上升沿。 舉例說明:利用MCU 程序控制傳送數(shù)據(jù)23,二進(jìn)制表示為00010111。Modelsim
的仿真結(jié)果如圖所示,SCK 即P1[1]上產(chǎn)生的是串行時鐘信號,SS
即P1[2]上產(chǎn)生片選信號。此時情況為發(fā)送信號,而MCU為主機(jī),因此MISI即P1[0]上的信號是主機(jī)輸出即MCU 發(fā)送的數(shù)據(jù),而MISO
即P1[3]上沒有信號的變化。
|
|