久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20437|回復: 4
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:94349 發表于 2015-11-10 02:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
IIC 的一些特征:
兩條總線:串行數據總線(SDA)和串行時鐘總線(SCL)
真正的多主機總線
連接到相同總線的ic數量只受到總線的最大電容400pF限制。
串行8位雙向數據在標準模式下可達100K bit/s
快速模式400K bit/s,高速模式下3.4Mbit/s.

數據有效性規定:
IIC總線在進行數據傳輸時,SCL在高電平區間,SDA上的電平必須保持穩定
SDA的數據的高或者低電平狀態只有在SCL線的時鐘信號是低電平時才能改變。

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

模擬時序如下:
起始與終止:

應答與非應答:

總線上進行一次數據傳輸的通信格式:


相關模擬時序的驅動函數:包括(start,stop,respons,write_byte,read_byte)
-----------------------------------------------------------------------------------------------------------------------

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

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

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

-----------------------------------------------------------------------------------------------------------------------
//CY 為PSW寄存器中的CY位
//先移位,然互使用SCL控制發出去
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();
}

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

-----------------------------------------------------------------------------------------------------------------------
//定義臨時變量K,K左移一位后與SDA進行或運算,
//依次把8個獨立地位放入一個字節中來接受完成
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;
}
-----------------------------------------------------------------------------------------------------------------------

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

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

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

下圖為寫一個字節的數據格式,有圖可知道:向AT24C02中寫入一個字節的時候,需要:
先發一個起始信號,再發一個字節的控制字,
在發送一個字節的控制字地址,都得到應答信號后,
再發送要存入的數據,最后發一個停止信號!
So,一個字節的數據已經寫入AT24C02中,OK!下面是數據格式,如圖:

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

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

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

-----------------------------------------------------------------------------------------------------------------------
下圖為讀一個字節的數據格式,其讀取一個字節的數據和寫入時候差不多,此處不再累贅,讀一字節數據格式如圖:

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

-----------------------------------------------------------------------------------------------------------------------
//任意地址,讀出數據
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的基本通訊時序的相關講解,可參與時序圖進行理解!!

評分

參與人數 3黑幣 +15 收起 理由
SKYLAR123 + 5 贊一個!
muzhi + 5 很給力!
愛學習的陳先生 + 5

查看全部評分

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

使用道具 舉報

沙發
ID:644141 發表于 2019-12-3 22:15 | 只看該作者
收藏了,謝謝。但還是有些不知道SDA=CY是什么意思?
回復

使用道具 舉報

板凳
ID:342911 發表于 2019-12-12 00:30 | 只看該作者
很清楚的解釋,多謝分享
回復

使用道具 舉報

地板
ID:630001 發表于 2019-12-12 07:25 來自手機 | 只看該作者
寫字節函數中的第二行是date變量,程序筆誤了
回復

使用道具 舉報

5#
ID:634190 發表于 2019-12-12 16:54 | 只看該作者
厲害,求指導
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年视频在线观看福利资源 | 手机av免费在线 | 日韩精品av一区二区三区 | 久草在线 | 成人在线亚洲 | 玩丰满女领导对白露脸hd | 一级毛片免费看 | 激情五月婷婷综合 | 亚洲狠狠 | 国产精品久久久久久一区二区三区 | 亚洲一区二区三区四区在线观看 | 日韩精品在线视频免费观看 | 超碰在线人 | 精品久久网| 欧美国产日韩一区二区三区 | 国产高清一区二区三区 | 国产精品久久精品 | 日韩欧美精品一区 | 久久久一二三 | 日韩高清一区 | 精品国产欧美一区二区三区不卡 | www.久久精品视频 | 欧美视频在线一区 | 99re国产精品 | 欧美区在线 | 精品毛片在线观看 | 欧美日韩在线一区二区 | 91资源在线观看 | 天天天操天天天干 | 欧洲精品在线观看 | 一级做a| 99热在线免费 | 国偷自产av一区二区三区 | 黄网站色大毛片 | 国产成人精品一区二 | 日韩中文在线视频 | 日本小视频网站 | 中文字幕乱码一区二区三区 | 亚洲va中文字幕 | 综合网视频 | 日本福利在线观看 |