1. 程式人生 > >IIC通訊的AT24C02學習筆記

IIC通訊的AT24C02學習筆記

引言

最近在學習幾種序列通訊協議,感覺收穫很多,這篇文章是學習IIC匯流排協議的第一篇文章,以後還會再寫一篇關於PCF8591 IIC通訊的ADDA轉換晶片的文章.

關於IIC匯流排

IIC 即Inter-Integrated Circuit(積體電路匯流排),這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單、雙向、二線制、同步序列匯流排,主要是用來連線整體電路(ICS) ,IIC是一種多向控制匯流排,也就是說多個晶片可以連線到同一匯流排結構下,同時每個晶片都可以作為實時資料傳輸的控制源。主要包括啟始、停止、讀、寫、應答訊號。這種方式簡化了訊號傳輸匯流排介面。

IIC總線上可以掛多個器件,而每個器件都有唯一的地址,這樣可以標識通訊目標。資料的通訊的方式採用主從方式,主機負責主動聯絡從機,而從機則被動迴應資料。

 

 

關於AT24C02

AT24C02是一個2K位序列CMOS E2PROM, 內部含有256個8位位元組,CATALYST公司的先進CMOS技術實質上減少了器件的功耗。AT24C02有一個8位元組頁寫緩衝器。該器件通過IIC匯流排介面進行操作,有一個專門的防寫功能。在微控制器上的應用廣泛, 可以實現掉電資料不丟失功能。

 

 

IIC匯流排資料有效性的規定

SCL=1期間,SDA必須保持穩定,SCL=0時,SDA才允許改變。

 

IIC 匯流排的幾種訊號

1.起始和終止訊號:

 

 

從時序圖可以看出,起始訊號為,SCL=1,SDA下降沿;終止訊號為SCL=1,SDA為上升沿,保持的時間是有限制的:

 

具體的程式實現如下:

起始訊號:SDA=1保持時間大於4。7us,隨後SDA=0保持時間大於4us

1

2

3

4

5

6

7

8

9

/*SDA下降沿*/

void start()

{

SDA = 1; //順序不能反了,先是SDA=1;

SCL = 1;

delay();

SDA = 0;

delay();

}

終止訊號:SDA=0保持時間大於4us,隨後SDA=1保持時間大於4。7us

1

2

3

4

5

6

7

8

9

/*SDA上升沿*/

void end()

{

    SDA = 0;        //順序不能反了,先是SDA=0;

    SCL = 1;

    delay();

    SDA = 1;

    delay();

}

2.應答訊號:

 

傳送的每一個位元組必須保證是8位長度。資料傳送時,先傳送最高位(MSB),每一個被傳送的位元組後面都必須跟隨一位應答訊號(即一幀共有9位)。

如:主機往總線上傳送一個位元組的資料後,釋放匯流排,從機會把匯流排拉低(即應答訊號),以表示這一位元組傳送成功

同理主機從總線上讀取完一個位元組的資料後,主機會把匯流排拉低,"告訴"從機這一位元組的資料接收成功

 

程式實現

應答訊號:

1

2

3

4

5

6

7

8

9

void ack()

{

    uchar i = 0;

    SCL = 1;

    delay();

    while(SDA == 1 && i < 250)i++;

    SCL = 0;            //SCL=0,SDA可以改變

    delay();

}

3.AT24C02的器件地址:

根據資料手冊和原理圖可以看出器件地址為:0x90/0x91其中最後一位是讀寫方向位,若下一個位元組為向總線上傳送資料,則為0x90,若下一個位元組是從總線上讀取資料,則為0x91。

4.往總線上寫一位元組的資料

程式實現:先寫最高位,通過左移運算子,將一位元組的資料一位一位的傳送到總線上,其中CY儲存的是左移後的進位

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

void write_byte(uchar dat)

{

    uchar i;

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

    {

        dat = dat << 1;          //如1011 0011 左移一位為0110 0110

        SCL = 0;            //SDL=0,才能往SDA送資料,或從SDA讀資料

        delay();

        SDA = CY;               //上面左移後進位為1

        delay();

        SCL = 1;

        delay();

    }

    SCL = 0;

//      delay();

    SDA = 1;            //釋放SDA

    delay();

}

 

5.從總線上讀取一個位元組的資料

程式實現:帶返回值,先讀高位,然後通過移位運算子,一位一位讀入

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

uchar read_byte()

{

    uchar dat = 0, tmp, i;

    SCL = 0;

    delay();

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

    {

        SCL = 1;        //讓SDA保持穩定,準備讀取

        delay();

        tmp = SDA;        //讀取此時SDA的狀態

        dat = dat << 1;

        dat = dat | tmp;

        delay();

        SCL = 0;        //釋放SDA匯流排,為下一次讀取做準備

        delay();

    }

    return dat;

}

AT24C02讀寫操作

1.通過以上幾種訊號的組合,可以向AT24C02指定單元地址寫一位元組的資料,可以看出,讀寫順序為:起始,寫器件地址,應答,寫單元地址,應答,寫資料,應答,終止。

程式實現:此函式無返回值,有兩個形參, 記憶體單元地址,範圍0-255;要寫的資料,如0xfe;

1

2

3

4

5

6

7

8

9

10

11

void write_AT24C02(uchar unit_addr, uchar dat)

{

    start();

    write_byte(AT24C02_ADDR + 0);    //下一個位元組為寫,所以是+0

    ack();

    write_byte(unit_addr);

    ack();

    write_byte(dat);

    ack();

    end();

}

  

 2.從AT24C02任意單元地址讀取資料,可以看出讀寫順序為:起始,寫器件地址+0(下一個位元組為寫),應答,寫單元地址,應答,起始,寫器件地址+1(下一個位元組為讀取),讀取資料,終止。

 

具體程式實現:此函式有返回值,一個形參;單元地址,範圍:0-255;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

uchar read_AT24C02(uchar unit_addr)

{

    uchar dat;

    /*先寫資料*/

    start();

    write_byte(AT24C02_ADDR + 0);      //下一個位元組為寫

    ack();

    write_byte(unit_addr);

    ack();

    start();

    write_byte(AT24C02_ADDR + 1);       //下一個位元組為讀

    ack();

    dat = read_byte();

    end();

    return dat;

}

延時函式:

1

2

3

4

void delay()        //短暫5us延時

{

    ;;

}

  

IIC初始化:

複製程式碼

void I2C_init()                //初始化
{
    SDA = 1;   
    delay();
    SCL = 1;   
    delay();
}

複製程式碼

 

具體應用

有了以上幾個函式,我們就可以寫主函數了, 功能是向記憶體單元211,寫入資料0xae,然後在從記憶體單元211中讀取出來,送給P1口led顯示.注意:寫完後要延時一會才能讀取,否則不能成功讀取.

1

2

3

4

5

6

7

void main()

{

    write_AT24C02(211, 0xae);

    delay_10ms();                       //寫完後,必須延時一定的時間才可以讀取,否則不行

    P1 = read_AT24C02(211);

    while(1);

}

總結

通過IIC 匯流排通訊協議的學習,可以看出,IIC匯流排用IO口模擬操作起來還是很簡單的,使用起來還是比較方便的,而且還可以多個IIC器件掛接在一條總線上,只需要SDA和SCL兩根線即可,當然也有缺點,由於是隻有一根資料線,所以不能全雙工傳輸,傳輸速度也有一定的限制.

 

相關推薦

IIC通訊AT24C02學習筆記

引言 最近在學習幾種序列通訊協議,感覺收穫很多,這篇文章是學習IIC匯流排協議的第一篇文章,以後還會再寫一篇關於PCF8591

容聯雲通訊學習筆記

先把demo中的功能理清,分析需要哪些功能吧 容聯雲通訊中的demo也不是很複雜,執行demo。 剛進入的介面是一個登陸介面,這裡直接用手機號碼登陸,進入主介面 先看清單檔案,ECApplication類是程式開啟載入的類,先不管。程式的主入口是一個Lau

NIO,BIO,AIO,JAVA通訊程式設計學習筆記3

下文內容摘自《Netty 權威指南》 JDK1.7升級了NIO類庫,升級後的NIO類庫被稱為NIO2.0,引人注目的是Java正式提供了非同步檔案IO操作,同時提供了與Unix網路程式設計事件驅動IO對應的AIO,下面的2.4章節我們學習下如何利用NIO2.0編寫AIO程

Volley網路通訊框架學習筆記(一)

1.什麼是Volley 我們平時在開發Android應用的時候不可避免地都需要用到網路技術,而多數情況下應用程式都會使用HTTP協議來發送和接收網路資料。 Android系統中主要提供了兩種方式來進行HTTP通訊,HttpURLConnection和Http

IIC協議學習筆記

位置 半雙工 時間段 .cn 雙工 htm 通訊 公司 mage   IIC總線(Inter-Integrated Circuit)即集成電路總線,是PHILIPS公司設計出來的一種簡單、雙向、二線制、同步串行總線。IIC總線是一個多向控制總線,多個器件(從機)可以同時掛載

學習筆記--post 相比get 有很多優點,為什麼現在的HTTP通訊中大多數請求還是使用get?

作者:羅志宇 連結:https://www.zhihu.com/question/31640769/answer/52824098 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 好吧, 除了哲學方式的回答以外,下面是一個瀏覽器從業人員的

vue.js學習筆記(六)--利用v-model實現父子元件間的雙向通訊

部落格:https://fisher-zh.github.io/ 在Vue中,我們可以使用prop屬性來進行父子元件間的通訊,在之前的文章Vue踩坑之路–父子元件通訊總結中有介紹過。 但是prop 是單向繫結的,我們無法在元件中直接修改prop傳遞的屬性。

vue.js學習筆記(三)--父子元件通訊總結

部落格地址:https://fisher-zh.github.io 在使用Vue的過程中,如果需要進行父子元件間的通訊,通過查閱官方文件 我們可以瞭解到只需要在子元件要顯式地用 props選項宣告它期待獲得的資料,同時在其使用過程中傳入相應的資料即可,例如: Vu

Java多執行緒學習筆記15之執行緒間通訊

詳細程式碼見:github程式碼地址   本節內容: 1)ThreadLocal類的使用     JDK文件及方法翻譯     InheritableThreadLocal的使用   5.

Java多執行緒學習筆記14之執行緒間通訊

詳細程式碼見:github程式碼地址   本節內容: 1) 實戰 等待/通知之交叉備份 2) 方法join的使用(Jdk文件翻譯及原始碼解析)     join()及join(long)的使用和實現原理   &nbs

Java多執行緒學習筆記13之執行緒間通訊

詳細程式碼見:github程式碼地址   本節內容: 1)  生產者消費者模型     多個生產者和多個消費者: 操作值假死及解決     多個生產者和多個消費者: 操作棧假死及解決 2) 通過管

Java學習筆記之--------網路程式設計之Socket通訊----聊天室實現

Socket通訊 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。基於TCP/IP協議,建立穩定的點對點的通訊。 特點:實時、快速、安全性高、佔用系統資源多、效率低。 通常也稱作"套接字",套接字是一種程序間的資料交換機制。這些程序既可以在同一機

嵌入式核心及驅動開發之學習筆記(十) 非同步通訊+中斷實現讀取資料

對於linux一切都是檔案,驅動裝置在應用層也是以檔案的形式進行讀寫。之前學了阻塞、非阻塞、多路複用的方式讀裝置,它們都需要應用主動讀取。那麼應用層有沒有一種方式,當底層將資料準備好了,應用程式自動處理這些資料?通過非同步通訊可以實現,這有寫類似硬體層的中斷概念 驅動層(準備好了資料) --&g

python 學習筆記_2 模擬socket程式設計 服務端、客戶端通訊(參考核心程式設計2程式碼實現)

伺服器端程式碼實現: #!/usr/bin/env python#coding=gbk'''接收客戶端字串,在欄位串前面打上當前時間,然後返回server端採用 python2 linux下除錯執行客戶端採用python3 windows下除錯執行(注意編碼格式)''' from socket impor

學習筆記——IIC匯流排

學習筆記——IIC匯流排 IIC(Inter-Integrated Circuit)匯流排是一種由 PHILIPS 公司開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。它是由資料線 SDA 和時鐘 SCL 構成的序列匯流排,可傳送和接收資料。在 CPU 與被控 IC 之間、 IC

多執行緒學習筆記--04執行緒間的通訊通訊管道實現執行緒間的通訊

 1.執行緒間的通訊        通過管道實現執行緒間的通訊:位元組流        通訊關單實現執行緒間的通訊:字元流        等待通知之交叉備份

多執行緒學習筆記--03執行緒間的通訊(wait/notify)

1.執行緒間的通訊      使用wait/notify來實現執行緒間的通訊      生產者/消費者模式的實現      方法join的使用     ThreadLocal

51微控制器學習筆記——Uart、IIC、SPI

SPI: Serial Peripheral Interface,序列外圍裝置介面。SPI 是一種高速的、全雙工、同步通訊匯流排,標準的 SPI 也僅僅使用 4 個引腳,常用於微控制器和 EEPROM、FLASH、實時時鐘、數字訊號處理器等器件的通訊。SPI匯流排由三條訊號線組成:序列時鐘(SC

QT學習筆記——串列埠通訊

寫一個最簡單的串列埠助手。 QT5以後,編寫串列埠不需要藉助第三方庫了,可以說方便了不少。 先建立QT專案,在.pro檔案里加入下面這行程式碼,不然會沒有串列埠庫額昂你使用的 QT += serialport 然後在標頭檔案mainwindows.h中加入標頭檔案 #inc

【android學習筆記】activity間的通訊案例之高德地圖實現天氣查詢

【概述】app實現天氣查詢是再正常不過的功能了,又因為往往不止一個activity去獲取資料,那就想到封裝一個類,需要時去呼叫獲取即可。 【注】因為看文件還有點懵,故將自己抓腦寫的程式碼記錄下,以便查詢 【思路】activity傳送請求--獲取地址--根據地址獲取天氣