IIC通訊協議詳解

2022-04-04 05:05:21 字數 3528 閱讀 6168

iic:兩線式序列匯流排,它是由資料線sda時鐘線scl構成的序列匯流排,可傳送和接收資料。

在cpu與被控

ic之間、ic與

ic之間進行雙向傳送,高速

iic匯流排一般可達

400kbs

以上。時鐘線scl:在通訊過程起到控制作用。 

資料線sda:用來一位一位的傳送資料。 

iic分為軟體

iic和硬體

iic

軟體iic:軟體iic通訊指的是用微控制器的兩個i/o埠模擬出來的iic,用軟體控制管腳狀態以模擬i2c通訊波形,軟體模擬暫存器的工作方式。

硬體iic:一塊硬體電路,硬體i2c對應晶元上的i2c外設,有相應i2c驅動電路,其所使用的i2c管腳也是專用的,硬體(韌體)i2c是直接呼叫內部暫存器進行配置。

補充

1.硬體i2c的效率要遠高於軟體的,而軟體i2c由於不受管腳限制,介面比較靈活。

2.iic是半雙工通訊方式

iic通訊過程由開始、結束、傳送、響應、接收五個部分構成。

1、(在傳送、接收資料的時候)當scl為高電平時,sda線不允許變化;當scl線為低電平時,sda線可以任意0、1變化。 

2、(在任意時候)只有當scl為高電平時,iic電路才對sda線上的電平(0或者1)進行記錄,當scl線為低電平時,無論sda是高還是低,iic電路都不對sda進行取樣。

在介紹上面五個部分前,我們首先說說空閒狀態,什麼是空閒狀態,就是沒有通訊時的狀態初始狀態

i2c匯流排的sda和scl兩條訊號同時處於高電平時,規定為匯流排的空閒狀態。此時各個器件的輸出級場效管均處在截止狀態,即釋放匯流排,由兩條訊號線各自的上拉電阻把電平拉高。

開始訊號:當scl為高期間,sda由高到低的跳變;啟動訊號是一種電平跳變時序訊號,而不是乙個電平。

停止訊號:當scl為高期間,sda由低到高的跳變;停止訊號也是一種電平跳變時序訊號,而不是乙個電平訊號。

開始訊號程式

//

產生iic起始訊號

//1.設定sda輸出

//2.先拉高sda,再拉高scl,空閒狀態

//3.拉低sda

//4.準備接收資料

void iic_start(void

)

停止訊號程式

//

產生iic停止訊號

//1.設定sda輸出

//2.先拉低sda,再拉低scl

//3.拉高scl

//4.拉高sda

//5.停止接收資料

void iic_stop(void

)

傳送器每傳送乙個位元組,就在時鐘脈衝9期間釋放資料先,由接收器反饋乙個應答訊號。應答訊號為低電平時,規定為有效應答位(ack簡稱應答位),表示接收器已經成功接收了該位元組;應答訊號為高電平時,規定為非應答位(nack),一般表示接收器接收該位元組沒有成功。

對於反饋有效應答位ack的要求是,接收器在第9個時鐘脈衝之前的低電平期間將sda線拉低,並且確保在該時鐘的高電平期間位穩定的低電平。如果接收器是主控器,則在它收到最後乙個位元組後,傳送乙個nack訊號,以通知被控傳送器結束資料傳送,並釋放sda線,以便主控接收器傳送乙個停止訊號p

每當主機向從機傳送完乙個位元組的資料,主機總是需要等待從機給出乙個應答訊號,以確認從機是否成功接收到了資料,從機應答主機所需要的時鐘仍是主機提供的,應答出現在每一次主機完成8個資料位傳輸後緊跟著的時鐘週期,低電平0表示應答,1表示非應答:

應答訊號程式

//

產生ack應答

//這裡就很清楚了,產生應答:scl在sda一直為低電平期間完成低高電平轉換

void iic_ack(void)//

不產生ack應答

//這裡就很清楚了,不產生應答:scl在sda一直為高電平期間完成低高電平轉換

void iic_nack(void

)

在i2c匯流排上傳送的每位資料都有乙個時鐘脈衝相對應(或同步控制),即在scl序列時鐘的配合下,sda逐位地序列傳送每一位資料。資料位的傳輸是邊沿觸發。

//

iic傳送乙個位元組

//返回從機有無應答

//1,有應答

//0,無應答

//iic_scl=0;

//在scl上公升沿時準備好資料,進行傳送資料時,拉高拉低sda,因為傳輸乙個位元組,乙個scl脈衝裡傳輸乙個位。

//資料傳輸過程中,資料傳輸保持穩定(在scl高電平期間,sda一直保持穩定,沒有跳變)

//只有當scl被拉低後,sda才能被改變

//總結:在scl為高電平期間,傳送資料,傳送8次資料,資料為1,sda被拉高,資料為0,sda被拉低。

//傳輸期間保持傳輸穩定,所以資料線僅可以在時鐘scl為低電平時改變。

void

iic_send_byte(u8 txd)

}

微控制器傳送完乙個位元組後面必須跟乙個等外應答函式:

思路:先讓sda=1,再判斷在一定時間內sda是否變為0,從而識別出外設有沒有傳送應答訊號。

//

等待應答訊號到來

//返回值:1,接收應答失敗

//0,接收應答成功

//1.設定sda為輸入

//2.拉高sda

//3.拉高scl

//4.等待接收器返回應答訊號,如果資料線sda一直為高,就一直等待,並返回1(無效應答),如果資料線sda為低,返回0(有效應答)

u8 iic_wait_ack(void

) }

iic_scl=0;//

時鐘輸出0

return

0;

}

傳送資料是一位一位傳送,接收資料也是一位一位接收進來,最後返回應答訊號:

//

讀1個位元組,ack=1時,傳送ack,ack=0,傳送nack

//先拉低scl,延時後拉高

//讀取資料

//是否傳送應答

u8 iic_read_byte(unsigned char

ack)

if (!ack)

iic_nack();

//傳送nack

else

iic_ack();

//傳送ack

return

receive;

}

IIC通訊協議詳解

對於stm32外設的理解還是不夠深,也許也是沒有沉澱的原因吧,對於嵌入式行業來說,通訊協議是挺重要的,今天花一段時間好好講一下iic匯流排通訊協議。也是方便日後檢視吧。iic匯流排是序列匯流排,兩根線,時鐘線scl和資料線sda。從以下六個方面來講解iic通訊協議。資料主要是通過scl sda線1高...

IIC 通訊協議

原文 i2c匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。起始和終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電平的變化表示終止...

IIC 通訊協議

i2c匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。起始和終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電平的變化表示終止訊號。...