iic(iic,inter-integrated circuit),兩線式序列匯流排,用於mcu和外設間的通訊。 iic只需兩根線:資料線sda和時鐘線scl。以半雙工方式實現mcu和外設之間資料傳輸,速度可達400kbps。
多主機i2c匯流排結構
注意sda和scl兩根匯流排需要上拉,使匯流排處於空閒狀態。
2.2 iic協議
a.空閒狀態
協議規定,sda和scl同時為高電平時,匯流排處於空閒狀態。上拉電阻保證電平處於高電平。
起始訊號和停止訊號
起始訊號:scl為高電平時,sda電平發生高到低的跳變
停止訊號:scl為高電平時,sda電平發生低到高的跳變
b.應答訊號
傳送器每傳送完乙個位元組(8個脈衝),在第9個脈衝間釋放匯流排,接收器返回乙個ack訊號,協議規定,低電平為有效應答,高電平為無效應答。
c.資料有效性
協議對有效資料進行了規定:即時鐘訊號為高電平期間,資料必須保持穩定,時鐘訊號低電平期間,資料線上的電平才允許變化。也就是說,資料在時鐘訊號到來前必須準備好,並保持到時鐘訊號的下降沿之後。
d.資料傳輸
i2c為同步傳輸,時鐘控制資料位的傳輸,邊沿觸發。
驅動程式
直接引用實驗中的**。測試沒問題。
起始訊號
1.
//產生iic起始訊號
2.void
iic_start
(void)3.
停止訊號
1.
//產生iic停止訊號
2.void
iic_stop
(void)3.
有效應答
1.
//產生ack應答
2.void
iic_ack
(void)3.
無效應答
1.
//不產生ack應答
2.void
iic_nack
(void)3.
傳送單位元組
1.
//iic傳送乙個位元組
2.//返回從機有無應答
3.//1,有應答
4.//0,無應答
5.void
iic_send_byte
(u8 txd)
6.20.
}
接收單位元組
1.
//讀1個位元組,ack=1時,傳送ack,ack=0,傳送nack
2. u8 iic_read_byte
(unsigned
char ack)
3.15.if(
!ack)
16.iic_nack()
;//傳送nack
17.else
18.iic_ack()
;//傳送ack
19.return receive;
20.}
三、怎麼背iic
上面的程式親身驗證過,可以用的(第二節非原創,摘錄乙個牛人,很久之前找到了,不知道原創的鏈結了)。
1.iic由scl和sda組成。
2.根據iic的時序要求,要實現六個功能子函式,包括啟動函式,停止函式,應答函式,非應答函式,位元組傳送函式,位元組接受函式。
3.再深入就是背時序了。啟動,停止,應答,非應答是主動傳送的過程相對來說比較簡單,
啟動就是先將scl拉高,延時一下,然後將sda拉低,延時一下;
停止也是先將scl拉高,延時一下,不過接下來將sda拉低,延時一下;
應答是將scl拉高,在拉高期間將sda保持低電平,非應答則是將sda拉高。
傳送和接收位元組都是從高位開始的,先將scl拉高,然後傳送或者接收。
IIC 通訊協議
原文 i2c匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。起始和終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電平的變化表示終止...
IIC 通訊協議
i2c匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。起始和終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電平的變化表示終止訊號。...
IIC 通訊協議
簡要過程 主機傳送起始位,這會通知匯流排上的所有裝置傳輸開始了,接下來主機傳送裝置位址 讀 寫訊號,與這一位址匹配的從裝置將成為從機並與主機進行傳輸,而其它從裝置將會退出此次通訊。主機匹配到從機後,主機傳送它所要讀取或寫入的從機的內部暫存器位址 然後傳送資料 資料傳送完畢後,傳送停止位。詳細過程 簡...