0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

IIC通信的基礎(chǔ)知識(shí)

天才小貍花 ? 來源:Sigle_chip ? 作者:Sigle_chip ? 2022-09-27 11:51 ? 次閱讀

[]()# IIC概述

IIC:兩線式串行總線,它是由__數(shù)據(jù)線SDA__和__時(shí)鐘線__SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù),其使用IO使用較少,

CPU與被控IC之間、IC與IC之間進(jìn)行雙向傳送,高速IIC總線一般可達(dá)400kbs以上。

時(shí)鐘線SCL:在通信過程起到控制作用。

數(shù)據(jù)線SDA:用來一位一位的傳送數(shù)據(jù)。

IIC分為軟件IIC和硬件IIC

軟件IIC:軟件IIC通信指的是用單片機(jī)的兩個(gè)I/O端口模擬出來的IIC,用軟件控制管腳狀態(tài)以模擬I2C通信波形,軟件模擬寄存器的工作方式。

硬件IIC:一塊硬件電路,硬件I2C對(duì)應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動(dòng)電路,其所使用的I2C管腳也是專用的,硬件(固件)I2C是直接調(diào)用內(nèi)部寄存器進(jìn)行配置。

補(bǔ)充

1.硬件I2C的效率要遠(yuǎn)高于軟件的,而軟件I2C由于不受管腳限制,接口比較靈活。

2.IIC是半雙工通信方式

[]()# IIC通信協(xié)議

IIC通信過程由開始、結(jié)束、發(fā)送、響應(yīng)、接收五個(gè)部分構(gòu)成。

1、(在發(fā)送、接收數(shù)據(jù)的時(shí)候)當(dāng)SCL為高電平時(shí),SDA線不允許變化;當(dāng)SCL線為低電平時(shí),SDA線可以任意0、1變化。

2、(在任意時(shí)候)只有當(dāng)SCL為高電平時(shí),IIC電路才對(duì)SDA線上的電平(0或者1)進(jìn)行記錄,當(dāng)SCL線為低電平時(shí),無論SDA是高還是低,IIC電路都不對(duì)SDA進(jìn)行采樣。

[]()### 空閑狀態(tài)

在介紹上面五個(gè)部分前,我們首先說說空閑狀態(tài),什么是空閑狀態(tài),就是__沒有通信時(shí)的狀態(tài)__( 初始狀態(tài)

I2C總線的SDA和SCL兩條信號(hào)同時(shí)處于高電平時(shí),規(guī)定為總線的空閑狀態(tài)。此時(shí)各個(gè)器件的輸出級(jí)場(chǎng)效管均處在截止?fàn)顟B(tài),即釋放總線,由兩條信號(hào)線各自的上拉電阻把電平拉高。

[]()### 開始信號(hào)與停止信號(hào)

開始信號(hào):當(dāng)SCL為高期間,SDA由高到低的跳變;啟動(dòng)信號(hào)是一種電平跳變時(shí)序信號(hào),而不是一個(gè)電平。

停止信號(hào):當(dāng)SCL為高期間,SDA由低到高的跳變;停止信號(hào)也是一種電平跳變時(shí)序信號(hào),而不是一個(gè)電平信號(hào)。

1664250641991qfvkns4ev8

開始信號(hào)程序

fig:

//產(chǎn)生IIC起始信號(hào)

//1.設(shè)置SDA輸出

//2.先拉高SDA,再拉高SCL,空閑狀態(tài)

//3.拉低SDA

//4.準(zhǔn)備接收數(shù)據(jù)

void IIC_Start(void)

{

SDA_OUT(); //sda線輸出

IIC_SDA=1;

IIC_SCL=1;

delay_us(4);

IIC_SDA=0;//START:when CLK is high,DATA change form high to low

delay_us(4);

IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)

}

停止信號(hào)程序

//產(chǎn)生IIC停止信號(hào)

//1.設(shè)置SDA輸出

//2.先拉低SDA,再拉低SCL

//3.拉高SCL

//4.拉高SDA

//5.停止接收數(shù)據(jù)

void IIC_Stop(void)

{

SDA_OUT();//sda線輸出

IIC_SCL=0;

IIC_SDA=0;//STOP:when CLK is high DATA change form low to high

 delay_us(4);

IIC_SCL=1; 

IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號(hào)

delay_us(4);

}

[]()### 應(yīng)答信號(hào)

發(fā)送器每發(fā)送一個(gè)字節(jié),就在時(shí)鐘脈沖9期間釋放數(shù)據(jù)先,由接收器反饋一個(gè)應(yīng)答信號(hào)。應(yīng)答信號(hào)為低電平時(shí),規(guī)定為有效應(yīng)答位(ACK簡(jiǎn)稱應(yīng)答位),表示接收器已經(jīng)成功接收了該字節(jié);應(yīng)答信號(hào)為高電平時(shí),規(guī)定為非應(yīng)答位(NACK),一般表示接收器接收該字節(jié)沒有成功。

對(duì)于反饋有效應(yīng)答位ACK的要求是,接收器在第9個(gè)時(shí)鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時(shí)鐘的高電平期間位穩(wěn)定的低電平。如果接收器是主控器,則在它收到最后一個(gè)字節(jié)后,發(fā)送一個(gè)NACK信號(hào),以通知被控發(fā)送器結(jié)束數(shù)據(jù)發(fā)送,并釋放SDA線,以便主控接收器發(fā)送一個(gè)停止信號(hào)P

每當(dāng)主機(jī)向從機(jī)發(fā)送完一個(gè)字節(jié)的數(shù)據(jù),主機(jī)總是需要等待從機(jī)給出一個(gè)應(yīng)答信號(hào),以確認(rèn)從機(jī)是否成功接收到了數(shù)據(jù),從機(jī)應(yīng)答主機(jī)所需要的時(shí)鐘仍是主機(jī)提供的,應(yīng)答出現(xiàn)在每一次主機(jī)完成8個(gè)數(shù)據(jù)位傳輸后緊跟著的時(shí)鐘周期,低電平0表示應(yīng)答,1表示非應(yīng)答:

1664250642744w7p9acoced

應(yīng)答信號(hào)程序

//產(chǎn)生ACK應(yīng)答

//這里就很清楚了,產(chǎn)生應(yīng)答:SCL在SDA一直為低電平期間完成低高電平轉(zhuǎn)換

void IIC_Ack(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=0;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

//不產(chǎn)生ACK應(yīng)答,購(gòu)買正品元器件,上唯樣商城

//這里就很清楚了,不產(chǎn)生應(yīng)答:SCL在SDA一直為高電平期間完成低高電平轉(zhuǎn)換

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

[]()### 發(fā)送數(shù)據(jù)

在I2C總線上傳送的每位數(shù)據(jù)都有一個(gè)時(shí)鐘脈沖相對(duì)應(yīng)(或同步控制),即在SCL串行時(shí)鐘的配合下,SDA逐位地串行傳送每一位數(shù)據(jù)。數(shù)據(jù)位的傳輸是邊沿觸發(fā)。

//IIC發(fā)送一個(gè)字節(jié)

//返回從機(jī)有無應(yīng)答

//1,有應(yīng)答

//0,無應(yīng)答

//IIC_SCL=0;

//在SCL上升沿時(shí)準(zhǔn)備好數(shù)據(jù),進(jìn)行傳送數(shù)據(jù)時(shí),拉高拉低SDA,因?yàn)閭鬏斠粋€(gè)字節(jié),一個(gè)SCL脈沖里傳輸一個(gè)位。

//數(shù)據(jù)傳輸過程中,數(shù)據(jù)傳輸保持穩(wěn)定(在SCL高電平期間,SDA一直保持穩(wěn)定,沒有跳變)

//只有當(dāng)SCL被拉低后,SDA才能被改變

//總結(jié):在SCL為高電平期間,發(fā)送數(shù)據(jù),發(fā)送8次數(shù)據(jù),數(shù)據(jù)為1,SDA被拉高,數(shù)據(jù)為0,SDA被拉低。

//傳輸期間保持傳輸穩(wěn)定,所以數(shù)據(jù)線僅可以在時(shí)鐘SCL為低電平時(shí)改變。

void IIC_Send_Byte(u8 txd)

{

u8 t;

SDA_OUT();

IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸

for(t=0;t<8;t++)

{

//IIC_SDA=(txd&0x80)>>7;

//獲取數(shù)據(jù)的最高位,然后左移7位

//如果某位為1,則SDA為1,否則相反

if((txd&0x80)>>7)

IIC_SDA=1;

else

IIC_SDA=0;

txd<<=1;

delay_us(2); //對(duì)TEA5767這三個(gè)延時(shí)都是必須的

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

delay_us(2);

}

}

單片機(jī)發(fā)送完一個(gè)字節(jié)后面必須跟一個(gè)等外應(yīng)答函數(shù):

思路:先讓SDA=1,再判斷在一定時(shí)間內(nèi)SDA是否變?yōu)?,從而識(shí)別出外設(shè)有沒有發(fā)送應(yīng)答信號(hào)。

//等待應(yīng)答信號(hào)到來

//返回值:1,接收應(yīng)答失敗

// 0,接收應(yīng)答成功

//1.設(shè)置SDA為輸入

//2.拉高SDA

//3.拉高SCL

//4.等待接收器返回應(yīng)答信號(hào),如果數(shù)據(jù)線SDA一直為高,就一直等待,并返回1(無效應(yīng)答),如果數(shù)據(jù)線SDA為低,返回0(有效應(yīng)答)

u8 IIC_Wait_Ack(void)

{

u8 ucErrTime=0;

SDA_IN(); //SDA設(shè)置為輸入

IIC_SDA=1;delay_us(1);

IIC_SCL=1;delay_us(1);

while(READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

IIC_Stop();

return 1;

}

}

IIC_SCL=0;//時(shí)鐘輸出0

return 0;

}

[]()### 接收數(shù)據(jù)

發(fā)送數(shù)據(jù)是一位一位發(fā)送,接收數(shù)據(jù)也是一位一位接收進(jìn)來,最后返回應(yīng)答信號(hào):

//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK

//先拉低SCL,延時(shí)后拉高

//讀取數(shù)據(jù)

//是否發(fā)送應(yīng)答

u8 IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

SDA_IN();//SDA設(shè)置為輸入

for(i=0;i<8;i++ )

{

    IIC_SCL=0; 

    delay_us(2);

    IIC_SCL=1;

    receive<<=1;

    if(READ_SDA)receive++;   

    delay_us(1); 

}                     

if (!ack)

    IIC_NAck();//發(fā)送nACK

else

    IIC_Ack(); //發(fā)送ACK   

return receive;

}

[]()

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6042

    文章

    44617

    瀏覽量

    637874
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2900

    瀏覽量

    88310
  • IIC
    IIC
    +關(guān)注

    關(guān)注

    11

    文章

    302

    瀏覽量

    38456
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    通信技術(shù)基礎(chǔ)知識(shí)介紹

    通信技術(shù)基礎(chǔ)知識(shí)介紹 電信網(wǎng)(telecommunication network)是構(gòu)成多個(gè)用戶相互通信的多個(gè)電信系統(tǒng)互連的通信體系,是人類實(shí)現(xiàn)遠(yuǎn)距離
    發(fā)表于 02-23 16:25 ?1.5w次閱讀

    移動(dòng)通信基站基礎(chǔ)知識(shí) PDF文檔

    移動(dòng)通信基站基礎(chǔ)知識(shí) PDF文檔下載附件:
    發(fā)表于 02-18 09:29

    電子通信技術(shù)基礎(chǔ)知識(shí)

    電子通信技術(shù)基礎(chǔ)知識(shí)
    發(fā)表于 08-20 09:58

    移動(dòng)通信基礎(chǔ)知識(shí)

    本帖最后由 南海孤雁 于 2012-12-7 12:43 編輯 移動(dòng)通信基礎(chǔ)知識(shí)視頻監(jiān)控系統(tǒng)發(fā)展。
    發(fā)表于 12-07 12:35

    無線通信基礎(chǔ)知識(shí)介紹

    無線通信基礎(chǔ)知識(shí)
    發(fā)表于 02-04 06:57

    串行通信基礎(chǔ)知識(shí)與UART驅(qū)動(dòng)構(gòu)件使用方法

    慕課蘇州大學(xué).嵌入式開發(fā)及應(yīng)用.第二章.入門與軟件框架.串行通信基礎(chǔ)知識(shí)與UART驅(qū)動(dòng)構(gòu)件使用方法0 目錄2 入門與軟件框架2.1 串行通信基礎(chǔ)知識(shí)與UART驅(qū)動(dòng)構(gòu)件使用方法2.1.1
    發(fā)表于 12-20 06:21

    STM32 IIC和USART接口的基礎(chǔ)知識(shí)點(diǎn)匯總,絕對(duì)實(shí)用

    STM32 IIC和USART接口的基礎(chǔ)知識(shí)點(diǎn)匯總,絕對(duì)實(shí)用
    發(fā)表于 02-22 08:00

    IIC通信原理及分析IIC的真實(shí)波形

    IIC通信原理。1 IIC基礎(chǔ)知識(shí)首先復(fù)習(xí)一下IIC基礎(chǔ)知識(shí),這部分看不懂的請(qǐng)先帶著疑問,然后
    發(fā)表于 02-24 06:01

    通信基礎(chǔ)知識(shí)教程

    通信基礎(chǔ)知識(shí) 1、電信基礎(chǔ)知識(shí)2、通信電源技術(shù)3、配線設(shè)備結(jié)構(gòu)、原理與防護(hù)4、防雷基礎(chǔ)知識(shí)5、EMC
    發(fā)表于 03-04 16:48 ?33次下載

    電子通信技術(shù)基礎(chǔ)知識(shí)

    通信技術(shù)基礎(chǔ)知識(shí)電信網(wǎng)(telecommunication network)是構(gòu)成多個(gè)用戶相互通信的多個(gè)電信系統(tǒng)互連的通信體系,是人類實(shí)現(xiàn)遠(yuǎn)距離通信
    發(fā)表于 07-19 17:31 ?46次下載

    單片機(jī)基礎(chǔ)知識(shí)學(xué)習(xí)筆記

    單片機(jī)基礎(chǔ)知識(shí)學(xué)習(xí)筆記有關(guān)總線1.IIC總線2.SPI總線
    發(fā)表于 11-14 16:51 ?26次下載
    單片機(jī)<b class='flag-5'>基礎(chǔ)知識(shí)</b>學(xué)習(xí)筆記

    IIC實(shí)測(cè)波形入手,搞懂IIC通信

    IIC通信原理。1 IIC基礎(chǔ)知識(shí)首先復(fù)習(xí)一下IIC基礎(chǔ)知識(shí),這部分看不懂的請(qǐng)先帶著疑問,然后
    發(fā)表于 01-12 17:35 ?9次下載
    從<b class='flag-5'>IIC</b>實(shí)測(cè)波形入手,搞懂<b class='flag-5'>IIC</b><b class='flag-5'>通信</b>

    [轉(zhuǎn)]從IIC實(shí)測(cè)波形入手,搞懂IIC通信

    IIC通信原理。1 IIC基礎(chǔ)知識(shí)首先復(fù)習(xí)一下IIC基礎(chǔ)知識(shí),這部分看不懂的請(qǐng)先帶著疑問,然后
    發(fā)表于 01-12 17:59 ?17次下載
    [轉(zhuǎn)]從<b class='flag-5'>IIC</b>實(shí)測(cè)波形入手,搞懂<b class='flag-5'>IIC</b><b class='flag-5'>通信</b>

    一文深入理解IIC通信基礎(chǔ)知識(shí)

    玩單片機(jī)的朋友都知道IIC通信這個(gè)工具,但好多人只是會(huì)用,內(nèi)部的原理不求甚解,或是想要了解其原理,但卻對(duì)抽象的時(shí)序描述一頭霧水。本文將從實(shí)測(cè)的IIC波形入手,帶你看到真實(shí)的IIC樣子,
    的頭像 發(fā)表于 06-08 09:06 ?2.2w次閱讀
    一文深入理解<b class='flag-5'>IIC</b><b class='flag-5'>通信</b><b class='flag-5'>基礎(chǔ)知識(shí)</b>

    光纖通信技術(shù)基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《光纖通信技術(shù)基礎(chǔ)知識(shí).ppt》資料免費(fèi)下載
    發(fā)表于 03-06 15:53 ?0次下載