首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

超頻軟體原理深度探析:I2C 總線與頻率發生器的協作機制

     編輯:關於VC++

摘要

主流主板廠商的超頻軟體均基於頻率發生器硬體實現,多數頻率發生器為 I2C 總線設備。本文介紹 I2C 設備基本原理及超頻核心方法。

關鍵字:I2C、頻率發生器、位元組讀寫、區塊讀寫

1. 緒論

DIY 族群追求極致效能,主板廠商推出超頻軟體:聯想 QDI StepEasy、技嘉 EasyTune、微星 Fuzzy Logic、璩泰克 紅色風暴。超頻實質是對頻率發生器輸出的基礎外頻進行調整。

例子:CPU 800MHz (外頻 100MHz × 倍頻 8)。外頻由頻率發生器決定。軟體操作發生器將輸出改為 105MHz,CPU 內頻變 105×8=840MHz,達到超頻目的。

主流頻率發生器供應商:Cypress、ICS、Winbond、PhaseLink。僅支援軟體調整輸出頻率的晶片才能作為超頻基礎。多數發生器以 I2C 總線與主板通訊,故理解 I2C 為超頻原理前提。

2. I2C 總線基本原理

I2C (Inter-Integrated Circuit) 為飛利浦 80 年代開發的串行總線,初為音視頻設備設計,今廣泛用於微電子、消費電子、通訊領域。

2.1 特點

  • 雙線介面:串行資料線 (SDA) + 串行時脈線 (SCL)。
  • 每器件唯一位址,軟體存取。
  • 介面在元件上,佔用空間極小,減少 PCB 面積與腳位,降低互連成本。
  • 總線長達 25 英尺,10Kbps 支援 40 元件。
  • 支援多主控,任一收發設備可成主控,串行 8 位雙向傳輸。

2.2 傳輸開始/停止條件

  • 開始:SCL 高電平時,SDA 由高轉低。
  • 停止:SCL 高電平時,SDA 由低轉高。
  • 通常由主控產生。

2.3 資料傳輸確認 (ACK)

  • 確認位必要,相關時脈由主控發出。
  • 確認時脈週期:發送端釋放 SDA (高),接收端拉低 SDA,高電平時保持穩定低電平。

2.4 資料傳輸過程

  • 每位元組 8 位,最高有效位優先 (MSB first)。
  • 每位元組後必跟確認位。
  • 開始條件後發送 7 位從屬位址 + 1 位資料方向位 (0=寫入/發送, 1=讀取/需求)。
  • 通常以主控發出停止條件結束。

3. 超頻基本原理

核心:修改時鐘晶片 I2C 總線上資料暫存器值,免跳線、免重啟達到超頻。為防超頻死機,晶片提供看門狗功能:超頻過程觸發內部計數器,若死機,幾秒後發 reset 重啟;若成功,軟體須在等待期間清除看門狗暫存器讓系統正常運作。

3.1 復位與看門狗電路

上電/掉電提供復位電平。WDI RESET 腳未採集到翻轉信號時發 200ms 復位脈衝。單晶片 P30 定時發送翻轉信號證明系統正常。外部干擾導致死機時,看門狗自動發復位信號觸發主板重啟。

3.2 M 與 N 參數計算

軟體視角:將 CPU 外頻轉換為參數寫入發生器暫存器。以某晶片為例,公式:

Fcpu = G * (N + 3) / (M + 3)
  • Fcpu:目標外頻
  • G:定義常數
  • M, N:已知最大/最小值

編程搜尋最接近目標頻率的 M、N 值 (參考代碼):

#define G xxx
#define Mmax xxx; #define Nmax xxx
#define Mmin xxx; #define Nmin xxx

void FoundMN(float Fcpu, int *M, int *N) {
    float D = 300; // 測試差值
    for (*M = Mmin; *M <= Mmax; (*M)++) {
        for (*N = Nmin; *N <= Nmax; (*N)++) {
            float FREQ = G * (*N + 3) / (*M + 3);
            if (fabs(Fcpu - FREQ) < D) {
                D = fabs(Fcpu - FREQ);
                // 存入最佳 M1, N1
            }
        }
    }
}

寫入暫存器後,若幾秒系統正常,超頻成功。

4. 軟體設計:I2C 讀寫實作

遵循 I2C 傳輸協議。重點:I2C 資料暫存器讀寫分位元組與區塊模式,視晶片而定。將算得的 M、N 依對應模式寫入暫存器。

位元組讀取組合語言範例

; Byte 方式讀
ReadByte Proc Near
    push cx
    mov dx, SMBus_Port + 04h
    inc ch
    mov al, ch        ; ID 讀命令
    out dx, al
    IODELAY
    call Ct_Chk_SMBus_READY
    pop ax
    mov dl, 03h
    out dx, al
    IODELAY; IODELAY
    mov dl, 02h
    mov al, 48h
    out dx, al        ; 讀資料
    IODELAY
    mov cx, 1000h
@@: newiodelay; loop short @B
    call Ct_Chk_SMBus_READY
    mov dl, 05
    in al, dx         ; 讀出資料到 AL
    IODELAY
    ret
ReadByte Endp

區塊寫入組合語言範例

; Block 方式寫
WriteBlock PROC NEAR
    push cx
    call Ct_Chk_SMBus_READY
    mov dx, SMBus_Port + 02h
    in al, dx
    IODELAY
    pop cx
    mov dx, SMBus_Port + 04h
    mov al, ch
    out dx, al
    IODELAY
    mov dx, SMBus_Port + 03h
    mov al, cl
    out dx, al
    xor cx, cx
    mov dx, SMBus_Port + 00h
BlockWriteok:
    mov al, byte ptr es:[si]   ; es:[si+0] = 區塊大小
    mov dx, SMBus_Port + 05h
    out dx, al
    IODELAY
    movzx cx, al               ; 取得 block 數
    inc si                     ; es:[si+1] = 開始資料
    mov dx, SMBus_Port + 07h
WriteBlockdata:
    mov al, byte ptr es:[si]
    out dx, al
    IODELAY
    inc si
    loop short WriteBlockdata
    mov dx, SMBus_Port + 02h
    mov al, 54h
    out dx, al
    IODELAY
    xor cx, cx
    mov dx, SMBus_Port + 00h
Writefail:
    in al, dx
    IODELAY
    test al, 02h
    jnz short writeok
    out dx, al
    IODELAY
    loop short Writefail
Writeok:
    ret
WriteBlock ENDP

5. 後記

超頻後系統極不穩定:頻率發生器輸出改變,不只 CPU 外頻變化,主板 SDRAM、PCI、AGP 設備頻率同步變化,這些設備對頻率變化承受力往往弱於 CPU,故常導致死機。

參考文獻

  1. 《I2C 總線介紹》彭秀峰
  2. 《The I2C-BUS Specification Version 2.1》Philips Semiconductors 1/2000
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved