通信協議--IIC

??IIC協議在Dock看來是最簡單易懂的協議之一。本文介紹IIC協議的基礎要點。

image.png

1.IIC基礎要點

  • 在時鐘的高電平周期內,SDA線上的數據必須保持穩定,數據線僅可以在時鐘SCL為低電平時改變。
image.png
  • 起始條件:當SCL為高電平的時候,SDA線上由高到低的跳變被定義為起始條件
  • 結束條件:當SCL為高電平的時候,SDA線上由低到高的跳變被定義為停止條件
image.png
  • 每當主機向從機發送完一個字節的數據,主機總是需要等待從機給出一個應答信號,以確認從機是否成功接收到了數據,從機應答主機所需要的時鐘仍是主機提供的,應答出現在每一次主機完成8個數據位傳輸后緊跟著的時鐘周期,低電平0表示應答,1表示非應答。
image.png

2 IIC的C實現

  • 初始時SDA、SCL都處于高電平
void Init()
{
    SCL = 1;
    delay();
    SDA = 1;
    delay();
}
  • 起始信號 SDA在SCL為高電平時產生下降沿:
void StartUp
{
    SCL = 1;
    SDA = 1;
    delay();
    SDA = 0;
    delay();
}
  • 結束信號 SDA在SCL為高電平時產生上升沿:
void End()
{
    SCL = 1;
    SDA = 0;
    delay();
    SDA = 1;
    delay();
}
  • 字節發送函數 SCL為低時SDA變為有效數據,SCL為高時,采集數據
void Transfer(int8_t i8Send)
{
    int32_t nIndex = 0;
    for(nIndex = 7; nIndex >= 0; nIndex++)
    {
        SCL = 0;
        SDA = (i8Send >> nIndex) & 0x01; //MSB方式進行發送
        delay();
        SCL = 1;                        //變為高電平,SLAVE短進行數據鎖存
        delay();
    }
}
  • 判斷回復報文 Slave端主動拉低SDA
int8_t CheckAck()
{
    delay();
    if(SDA == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 串行通信的幾個名詞: 全雙工:數據線有2條,分別用來發送和接收。半雙工:數據線只有1條,用來發送和接收,分時復用。...
    X_xxieRiemann閱讀 1,707評論 0 0
  • ???本文主要介紹嵌入式系統的一些基礎知識,希望對各位有幫助。 嵌入式系統基礎 1、嵌入式系統的定義 (1)定義:...
    OpenJetson閱讀 3,354評論 0 13
  • 什么是嵌入式 IEEE(Institute of Electrical and Electronics Engin...
    Leon_Geo閱讀 3,777評論 1 20
  • 1、嵌入式系統的定義 (1)定義:以應用為中心,以計算機技術為基礎,軟硬件可裁剪,適應應用系統對功能、可靠性、成本...
    榮卓然閱讀 1,871評論 0 5
  • 三毛的名字耳熟能詳,卻從未翻看過她的書,直到前一陣朋友贈我一本《撒哈拉的故事》,看完才驚覺相遇恨晚,卻也慶...
    浮萍不浮閱讀 437評論 0 4