Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

I2C 串列匯流排通訊協定與 AT24C04 EEPROM 驅動程式完整實作

編輯:Linux 教學

本文整理 I2C 協定核心時序與基於 AT24C04 EEPROM 的完整 C 語言驅動程式碼,包含起始/停止信號、位元組收發、ACK/NACK 機制與頁面寫入流程,適合嵌入式開發者參考移植。

I2C 訊號時序基礎

  • 起始信號 (Start):SCL 高電平時,SDA 由高→低(下降沿)
  • 停止信號 (Stop):SCL 高電平時,SDA 由低→高(上升沿)
  • 資料有效性:SCL 高電平期間 SDA 必須保持穩定
  • 應答機制:第 9 個時脈週期,接收端拉低 SDA 表示 ACK,保持高電平表示 NACK

核心函式實作 (C 語言)

1. 起始/停止信號

void AT24C04_Start(void) {
    SDA = 1; SCL = 1; Delay5us();
    SDA = 0; Delay5us();        // 產生下降沿
    SCL = 0; Delay5us();
}

void AT24C04_Stop(void) {
    SDA = 0; SCL = 1; Delay5us();
    SDA = 1; Delay5us();        // 產生上升沿
}

2. 位元組發送 (MSB First)

void AT24C04_SendByte(BYTE dat) {
    BYTE i;
    for (i = 0; i < 8; i++) {
        dat <<= 1;              // 移出最高位到 Carry
        SDA = CY;               // 輸出資料位
        SCL = 1; Delay5us();
        SCL = 0; Delay5us();
    }
    AT24C04_RecvACK();          // 等待從機 ACK
}

3. 位元組接收


BYTE AT24C04_RecvByte(void) {
    BYTE i, dat = 0;
    SDA = 1;                    // 釋放總線,準備讀取
    for (i = 0; i < 8; i++) {
        dat <<= 1;
        SCL = 1; Delay5us();
        dat |= SDA;             // 讀取資料位
        SCL = 0; Delay5us();
    }
    return dat;
}

4. ACK/NACK 處理


// 主機發送 ACK/NACK (讀取時使用)
void AT24C04_SendACK(bit ack) {
    SDA = ack; SCL = 1; Delay5us();
    SCL = 0; Delay5us();
}

// 主機接收從機 ACK (寫入時使用)
bit AT24C04_RecvACK(void) {
    SCL = 1; Delay5us();
    CY = SDA;                   // 讀取 ACK 位
    SCL = 0; Delay5us();
    return CY;                  // 0=ACK, 1=NACK
}

5. 頁面寫入範例 (16 位元組)


void AT24C04_WritePage(void) {
    BYTE i;
    AT24C04_Start();
    AT24C04_SendByte(0xA0);     // 裝置地址 + 寫位元 (0)
    AT24C04_SendByte(0x00);     // 記憶體位址 (低位元組)
    for (i = 0; i < 16; i++) {
        AT24C04_SendByte(TESTDATA[i]);
    }
    AT24C04_Stop();
}

AT24C04 關鍵特性補充

  • 容量:4 Kbit (512 Bytes),分 32 頁,每頁 16 Bytes
  • 位址結構:裝置位址 1010 + A2/A1/A0 + R/W;記憶體位址 8 位元
  • 頁面寫入:單次最多 16 位元組,跨頁需重新發送起始信號與位址
  • 讀取模式:當前位址讀取、隨機讀取、循序讀取
  • 寫入時間:典型 5ms,需輪詢 ACK 確認完成 (ACK Polling)

移植注意事項

  1. GPIO 模擬 vs 硬體 I2C:本碼為 GPIO 模擬 (Bit-banging),移植時需替換 SDA/SCL 宏定義與 Delay5us() 為目標平台對應實作
  2. 時脈頻率:標準模式 100 kHz,快速模式 400 kHz,延遲需滿足 t_HD;STA、t_SU;STA、t_HIGH/t_LOW 等時序參數
  3. 上拉電阻:SDA/SCL 必須外接上拉電阻 (典型 4.7kΩ),否則總線無法正常釋放
  4. 中斷保護:關鍵時序段建議關閉中斷,防止時序被打斷

總結

I2C 以兩線實現多主多從通訊,掌握「起始/停止條件、位元組傳輸、ACK 機制」三大核心,即可實作任意 I2C 裝置驅動。AT24C04 為經典練習晶片,理解其頁面寫入與位址自動遞增特性,對開發其他 EEPROM、感測器、RTC 等 I2C 裝置極具參考價值。

Copyright © Windows教程網 All Rights Reserved