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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

I2C通信協議簡介

[復制鏈接]
跳轉到指定樓層
樓主
ID:249758 發表于 2018-2-22 09:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
I2C通信協議簡介
摒棄復雜的情況,這里只對I2C做簡單的介紹。
一、I2C 總線的一些特征:
• 只要求兩條總線線路一條串行數據線SDA 一條串行時鐘線SCL
• 每個連接到總線的器件都可以通過唯一的地址和一直存在的簡單的主機從機關系軟件設定地址主機可以作為主機發送器或主機接收器
• 它是一個真正的多主機總線如果兩個或更多主機同時初始化數據傳輸可以通過沖突檢測和仲裁防止數據被破壞
• 串行的8 位雙向數據傳輸位速率在標準模式下可達100kbit/s 快速模式下可達400kbit/s 高速模式下可達3.4Mbit/s
• 片上的濾波器可以濾去總線數據線上的毛刺波保證數據完整
• 連接到相同總線的IC 數量只受到總線的最大電容400pF 限制
二、I2C總線在傳送數據過程中共有三種類型信號:開始信號、結束信號和應答信號。
開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。
結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。
       應答信號:接收數據的IC在接收到8bit數據后,向發送數據的IC發出特定的低電平脈沖,表示已收到數據
起始和結束:
bool I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!SDA_read)return FALSE; // SDA線為低電平則總線忙,退出
SDA_L;                      // 拉低SDA線(當SCL為高電平時,SDA由高電平向低電平跳變表示開始信號)
I2C_delay();
if(SDA_read) return FALSE; // SDA線為高電平則總線出錯,退出
SDA_L;                     //數據為準備好時,拉低SCL線
I2C_delay();
return TRUE;
}
    發出開始信號之后,設備在數據未準備好時,拉低SCL線,這樣主設備可知從設備未發送數據,從設備在數據準備好,可以發送的時候,停止拉低SCL線,這時候才開始真正的數據傳輸
void I2C_Stop(void)
{
SCL_L;
I2C_delay();      
SDA_L;
I2C_delay();
SCL_H;            // SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據
I2C_delay();
SDA_H;
I2C_delay();
}
   STOP在單主環境下非必要,但在多主環境就非常必要,主控總線的設備發送STOP后,通知總線其他設備總線已經閑置.
void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
    當主機作為接收設備時,主機對最后一個字節不應答,以向發送設備(從設備)標識數據傳送結束。這是因為每次傳輸都應得到應答信號后再進行下一個字節傳送。如果此時接收機應答了,那它就接收的不是最后一個字節了。如果是最后一個字節,第9個時鐘周期發送的是非應答信號(此時發送的不是應答信號就是非應答信號),最后發送停止信號。
  1)主發從收:主START->主發地址->從ACK->(主發數據->從ACK(循環))->主STOP或主 START啟動下一次傳輸
  這一過程中,主控SCL線,從只在ACK時控SDA線,其他時刻主控SDA線。  
  2)主收從發:主START->從發地址->主ACK->(從發數據->主ACK(循環))->接受至最后一個字節時,主 NACK->主 STOP 或主START啟動下一次傳輸
      
并非每傳輸8位數據之后,都會有ACK信號,有以下3中例外
  •            當從機不能響應從機地址時(例如它正忙于其他事而無法響應IIC總線的操作,或者這個地址沒有對應的從機),在第9個SCL周期內SDA線沒有拉低,即沒有ACK信號。這時,主機發出一個P信號終止傳輸或者重新發出一個S信號開始新的傳輸。
  •            如果從機接收器在傳輸過程中不能接收更多的數據時,它不會發出ACK信號。這樣,主機就可以意識到這點,從而發出一個P信號終止傳輸或者重新發出一個S信號開始新的傳輸。
  •            主機接收器在接收到最后一個字節后,也不會發出ACK信號。于是,從機發送器釋放SDA線,以允許主機發出P信號結束傳輸。
位傳輸:
主機向從機發送一字節數據
void I2C_SendByte(u8 SendByte) //數據從高位到低位
{
    u8 i=8;
    while(i--)
    {
        SCL_L;
        I2C_delay();
      if(SendByte&0x80)
        SDA_H;
      else
        SDA_L;  
        SendByte<<=1;
        I2C_delay();
  SCL_H;
        I2C_delay();
    }
    SCL_L;
}

三、7位尋址
    在起始條件S 后發送了一個從機地址,這個地址共有7 位,緊接著的第8 位是數據方向位R/W ,0表示發送寫、1表示請求數據讀:
    數據傳輸一般由主機產生的停止位P終止,但是如果主機仍希望在總線上通訊它可以產生重復起始條件Sr和尋址另一個從機,而不是首先產生一個停止條件。
完整的數據傳輸:




stm32如何建立與EEPROM的通訊
1、 配置I/O端口,確定并配置I2C的模式,使能GPIO和I2C時鐘。

2、 寫:
檢測SDA是否空閑;
->按I2C協議發出起始訊號;
->發出7位器件地址和寫模式;
->要寫入的存儲區首地址;
->用頁寫入方式或字節寫入方式寫入數據;
3、 讀:
檢測SDA是否空閑;
->按I2C協議發出起始訊號;
->發出7位器件地址和寫模式(偽寫);
->發出要讀取的存儲區首地址;
->重發起始訊號;
->發出7位器件地址和讀模式;
->接收數據;

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产乱码久久久久久 | 羞羞在线视频 | 免费一级片 | 亚洲成人av在线播放 | 亚洲国产精品久久 | 韩国精品一区 | 免费在线性爱视频 | 亚洲精品一区在线观看 | 狠狠亚洲| 精品国产免费一区二区三区演员表 | 国产精品视频久久 | 欧美成视频 | 国产视频91在线 | 亚洲一区中文字幕在线观看 | 国产a级毛毛片 | 污片在线观看 | 放个毛片看看 | 久久久青草婷婷精品综合日韩 | 九九热精品免费 | 免费视频久久久久 | 久久不射网 | 成人亚洲网 | 亚洲三级国产 | 欧美日韩在线免费观看 | 欧美日韩高清在线观看 | 天天夜碰日日摸日日澡 | 中文字幕视频在线观看免费 | 欧美久久电影 | 黄页网址在线观看 | 欧美在线小视频 | 青青久久 | 天天躁天天操 | 精品在线一区 | 99成人| 亚洲人成在线播放 | 91在线视频播放 | 日韩欧美一级精品久久 | 天天夜夜操 | 国产日韩欧美在线 | 欧美视频免费在线 | www国产亚洲精品久久网站 |