找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20520|回復(fù): 4
收起左側(cè)

基于51的IIC通訊原理及協(xié)議詳解(I2C)

  [復(fù)制鏈接]
ID:94349 發(fā)表于 2015-11-10 02:10 | 顯示全部樓層 |閱讀模式
IIC 的一些特征:
兩條總線:串行數(shù)據(jù)總線(SDA)和串行時(shí)鐘總線(SCL)
真正的多主機(jī)總線
連接到相同總線的ic數(shù)量只受到總線的最大電容400pF限制。
串行8位雙向數(shù)據(jù)在標(biāo)準(zhǔn)模式下可達(dá)100K bit/s
快速模式400K bit/s,高速模式下3.4Mbit/s.

數(shù)據(jù)有效性規(guī)定:
IIC總線在進(jìn)行數(shù)據(jù)傳輸時(shí),SCL在高電平區(qū)間,SDA上的電平必須保持穩(wěn)定
SDA的數(shù)據(jù)的高或者低電平狀態(tài)只有在SCL線的時(shí)鐘信號是低電平時(shí)才能改變。

起始和停止條件:
起始:SCL高電平時(shí),SDA由高電平向低電平切換。
停止:SCL高電平時(shí),SDA由低電平向高電平切換。

模擬時(shí)序如下:
起始與終止:

應(yīng)答與非應(yīng)答:

總線上進(jìn)行一次數(shù)據(jù)傳輸?shù)耐ㄐ鸥袷剑?br />

相關(guān)模擬時(shí)序的驅(qū)動函數(shù):包括(start,stop,respons,write_byte,read_byte)
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//SCL高電平區(qū)間,SDA一個(gè)下降沿啟動信號
void Start()
{
    SDA=1;
   delay();
    SCL=1;
   delay();
    SDA=0;
   delay();
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//SCL在高電平區(qū)間,SDA一個(gè)上升沿停止信號
void Stop()
{
    SDA=0;
   delay();
    SCL=1;
   delay();
    SDA=1;
   delay();
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//SCL在高電平區(qū)間,SDA被從設(shè)備拉低表示應(yīng)答,
//(SDA==1)&&(i<255)表示如果一段時(shí)間未收到從期間
//的應(yīng)答則默認(rèn)從期間已經(jīng)收到而不再等待應(yīng)答信號
void Respons()
{
    uchari=0;
    SCL=1;
   delay();
   while((SDA==1)&&(i<255))
       i++;
    SCL=0;
   delay();   
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//CY 為PSW寄存器中的CY位
//先移位,然互使用SCL控制發(fā)出去
void Write_Byte(uchar date)
{
    uchari,temp;
   temp=tada;
   for(i=0;i<8;i++)
    {
      temp=temp<<1;
       SCL=0;
      delay();
      SDA=CY;
      delay();
       SCL=1;
      delay();
    }
    SCL=0;
   delay();
    SDA=1;
   delay();
}

-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//定義臨時(shí)變量K,K左移一位后與SDA進(jìn)行或運(yùn)算,
//依次把8個(gè)獨(dú)立地位放入一個(gè)字節(jié)中來接受完成
void Read_Byte()
{
    uchari,k;
    SCL=0;
   delay();
    SDA=1;
   for(i=0;i<8;i++)
    {
       SCL=1;
      delay();
      k=(k<<1)|SDA;
       SCL=0;
      delay();
    }
   delay();
    returnk;
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
底層驅(qū)動完成以后,我們需要對實(shí)際的芯片使用通訊協(xié)議來進(jìn)行操作。
目前大多的情況下一般比較受歡迎的是AT24cxx 系列。
AT24Cxx系列主要有:    以下系列:

以下僅以AT24C02為例來進(jìn)行說明:
AT24C02芯片地址為:1010,其控制字格式如下:

其中A2,A1,A0為可編程選擇地址,此處A2,A1,A0均接地,即000,
因此發(fā)送寫信號的尋址字節(jié)為:10100000,即0XA0,
因此發(fā)送讀信號的尋址字節(jié)為:10100001,即0XA1,

下圖為寫一個(gè)字節(jié)的數(shù)據(jù)格式,有圖可知道:向AT24C02中寫入一個(gè)字節(jié)的時(shí)候,需要:
先發(fā)一個(gè)起始信號,再發(fā)一個(gè)字節(jié)的控制字,
在發(fā)送一個(gè)字節(jié)的控制字地址,都得到應(yīng)答信號后,
再發(fā)送要存入的數(shù)據(jù),最后發(fā)一個(gè)停止信號!
So,一個(gè)字節(jié)的數(shù)據(jù)已經(jīng)寫入AT24C02中,OK!下面是數(shù)據(jù)格式,如圖:

程序如下:
-----------------------------------------------------------------------------------------------------------------------
//任意地址,寫入數(shù)據(jù)
void Write_Add(uchar address,uchar date)
{
   Start();

   Write_Byte(0xA0);
   Respons();
   Write_Byte(address);
   Respons();
   Write_Byte(date);
   Respons();

    Stop
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
下圖為讀一個(gè)字節(jié)的數(shù)據(jù)格式,其讀取一個(gè)字節(jié)的數(shù)據(jù)和寫入時(shí)候差不多,此處不再累贅,讀一字節(jié)數(shù)據(jù)格式如圖:

程序如下:
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//任意地址,讀出數(shù)據(jù)
void Read_Add(uchar address)
{
    uchardate;

   Start();
   Write_Byte(0XA0);
   Respons();
   Write_Byte(address);
   Respons();

   Start();
   Write_Byte(0XA1);
   Respons();
   date=Read_Byte();
   Stop();

    returnbyte;      
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------


以上幾位IIC的基本通訊時(shí)序的相關(guān)講解,可參與時(shí)序圖進(jìn)行理解!

評分

參與人數(shù) 3黑幣 +15 收起 理由
SKYLAR123 + 5 贊一個(gè)!
muzhi + 5 很給力!
愛學(xué)習(xí)的陳先生 + 5

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:644141 發(fā)表于 2019-12-3 22:15 | 顯示全部樓層
收藏了,謝謝。但還是有些不知道SDA=CY是什么意思?
回復(fù)

使用道具 舉報(bào)

ID:342911 發(fā)表于 2019-12-12 00:30 | 顯示全部樓層
很清楚的解釋,多謝分享
回復(fù)

使用道具 舉報(bào)

ID:630001 發(fā)表于 2019-12-12 07:25 來自手機(jī) | 顯示全部樓層
寫字節(jié)函數(shù)中的第二行是date變量,程序筆誤了
回復(fù)

使用道具 舉報(bào)

ID:634190 發(fā)表于 2019-12-12 16:54 | 顯示全部樓層
厲害,求指導(dǎo)
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表