找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2519|回復: 1
打印 上一主題 下一主題
收起左側(cè)

IIC通信協(xié)議筆記

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:204624 發(fā)表于 2018-5-17 16:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.IIC總線是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。它在傳輸數(shù)據(jù)過程中有三種特殊類型信號,分別是:開始信號、結(jié)束信號和應答信號。
區(qū)分UART通信:同樣使用兩根線進行數(shù)據(jù)傳輸,但UART通信中一根用于接收數(shù)據(jù),一根用于發(fā)送數(shù)據(jù),每次通信的時候只用到一根線。且其傳輸數(shù)據(jù)與時鐘無關(guān),因此稱為異步串行通信,隨時進行數(shù)據(jù)的接收和發(fā)送,SBUF寄存器存滿時,則說明完成數(shù)據(jù)接收;想要進行數(shù)據(jù)發(fā)送時,只需把數(shù)據(jù)寫入SBUF寄存器。
IIC通信:IIC通信無論發(fā)送還是接收,都需要結(jié)合時鐘SCL來進行數(shù)據(jù)SDA的傳輸,因此一次要使用兩條線。傳輸數(shù)據(jù)與時鐘有關(guān),因此稱為同步串行通信。
2.IIC通信的起始信號和停止信號
時鐘線SCL為高電平期間,數(shù)據(jù)線SDA由高電平向低電平變化——起始信號
時鐘線SCL為高電平期間,數(shù)據(jù)線SDA由低電平向高電平變化——停止信號
3.IIC通信的數(shù)據(jù)傳輸
時鐘線SCL為高電平期間,數(shù)據(jù)線SDA上的數(shù)據(jù)必須保持穩(wěn)定。
只有時鐘線SCL信號為低電平期間,數(shù)據(jù)線SDA狀態(tài)才允許變化。 4.數(shù)據(jù)線SDA上的數(shù)據(jù)一般先于時鐘SCL發(fā)生變化
原因:發(fā)生變化說明信號需要翻轉(zhuǎn),分兩種情況(數(shù)據(jù)線SDA隨你怎么翻)。情況1-1:當數(shù)據(jù)線SDA先發(fā)生變化,時鐘線SCL再從1變?yōu)?,與上述第3點相違背,在時鐘SCL為高電平時,數(shù)據(jù)線SDA并沒有保持穩(wěn)定,而發(fā)生翻轉(zhuǎn),這樣的信號只會被當做是起始信號或停止信號;
情況1-2:數(shù)據(jù)線SDA還是先發(fā)生變化,時鐘線SCL從0變1,在時鐘線SCL為0時,數(shù)據(jù)線SDA早已經(jīng)完成了翻轉(zhuǎn),也就是說,在時鐘線SCL為0時,數(shù)據(jù)線沒有發(fā)生變化,那么在后來時鐘線SCL為1時,所傳輸?shù)臄?shù)據(jù)則是數(shù)據(jù)線SDA上剛完成翻轉(zhuǎn)后的數(shù)據(jù)。情況2-1:時鐘線SCL由0變1,先于數(shù)據(jù)線SDA發(fā)生變化,時鐘線SCL低電平時的狀態(tài)內(nèi),數(shù)據(jù)線SDA沒有發(fā)生任何變化,所以只在最后維持高電平有效,而在高電平后,再改變數(shù)據(jù)線SDA的數(shù)據(jù),違反了上述第3點;
情況2-2:時鐘線SCL由1變0,先于數(shù)據(jù)線SDA發(fā)生變化,在變0之后,數(shù)據(jù)線SDA會完成信號的翻轉(zhuǎn)。在之后得等時鐘線SCL重新置1,才能確認數(shù)據(jù)線SDA的傳輸數(shù)據(jù)----那如果這樣的話,不就又變成了數(shù)據(jù)線SDA先變化,時鐘線SCL后變化的情況了??
綜上所述,去除掉違反IIC數(shù)據(jù)傳輸?shù)囊?guī)則的兩則情況后,剩下的紅色兩種情況,則是現(xiàn)在第4點的最好說明...
5.IIC的數(shù)據(jù)讀寫和應答
區(qū)分UART數(shù)據(jù)傳輸:UART數(shù)據(jù)傳輸先傳低位,后傳高位
IIC數(shù)據(jù)傳輸:先傳高位,后傳低位
主機寫數(shù)據(jù)時,每發(fā)送一個字節(jié),接收機需要回復一個應答位“0”,通過應答位來判斷從機是否接收成功
主機讀數(shù)據(jù)時,接收一個字節(jié)結(jié)束后,主機也需要發(fā)一個應答位“0”,但是當接收最后一個字節(jié)結(jié)束后,需要發(fā)送一個非應答位“1”,發(fā)完這個非應答位“1”后,再發(fā)一個停止信號,最終結(jié)束通信。
如果需要檢測應答信號“0”,得先置高數(shù)據(jù)線SDA,如果數(shù)據(jù)線后來檢測到應答信號“0”,則是應答信號存在的最好說明!
如果需要檢測非應答信號“1”,得先拉低數(shù)據(jù)線SDA,如果數(shù)據(jù)線后來檢測到非應答信號“1”,也是非應答信號存在的最好說明!
6.IIC協(xié)議傳輸一位數(shù)據(jù)程序分析
void Delay(void) //在使用IIC進行通信的時候,需要控制傳輸數(shù)據(jù)的速度,這里的使用了4個機器周期的延時,而具體的延時由于包括了函
{ //數(shù)調(diào)用時的壓棧和出棧,而且受編譯環(huán)境的影響,因此實際延時并不止4個機器周期
_nop_() ;_nop_() ;_nop_() ;_nop_() ;
}
void IIC_Send_Byte(unsigned char byte) //有數(shù)據(jù)傳入,類型為八位無符號字節(jié)型——傳入數(shù)據(jù) / 命令 / 地址
{
unsigned char mask, i; //定義兩個八位無符號字節(jié)型變量,一個用以for循環(huán),另一個用以把傳入的十六進制數(shù),以二進制方式提取各個位
mask = 0x80;//再結(jié)合時鐘線SCL時序變化,控制數(shù)據(jù)線SDA進行信號傳輸
for(i = 0; i < 8; i++)
{
SCL = 0; //先把時鐘線SCL置“0”,為了使數(shù)據(jù)線SDA數(shù)據(jù)能變化
Delay(); //數(shù)據(jù)傳輸?shù)难訒r
if((mask & byte) == 0) //用mask十六進制數(shù)(以二進制的方式)與傳入的數(shù)據(jù)byte取“與”,把傳入的十六進制byte以二進制的方式提取位
{
SDA = 0;//如果該位取“與”為0,則控制數(shù)據(jù)線SDA數(shù)據(jù)變?yōu)?
}
else
{
SDA = 1; //否則如果該位取“與”為1,則控制數(shù)據(jù)線SDA數(shù)據(jù)變?yōu)?
}
mask >>= 1; //mask變量右移一位,假如第一次mask值為1000 0000,完成數(shù)據(jù)線SDA的一次輸出后,mask的值為0100 0000,方便
Delay(); //繼續(xù)提取第二位數(shù)據(jù),數(shù)據(jù)傳輸?shù)难訒r
SCL= 1; //在時鐘線SCL為1的時候維持數(shù)據(jù)SDA的穩(wěn)定,便能確認傳入的數(shù)據(jù)
Delay(); //數(shù)據(jù)傳輸?shù)难訒r
}
SCL = 0; //先置低時鐘線SCL,才能拉高數(shù)據(jù)線SDA,用以檢測后面的應答信號
SDA= 1;
Delay();
SCL= 1; //下面對時鐘線SCL的操縱則是用以檢測應答信號的
Delay();
SCL= 0;
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:242300 發(fā)表于 2018-10-5 23:58 | 只看該作者
學習學習。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表