Skip to Content
支援的硬體

支援的硬體

I2C dongle

程式本身不綁定特定硬體:每一種 dongle 是一顆獨立的 adapter DLL,放在 dongles/ 目錄裡,啟動時掃描。要支援一種新硬體不必改主程式。

目前隨產品出貨的有:

後端說明
usb2i2cITE USB 轉 I2C(HID 介面)
ch341WCH CH341T USB 轉 I2C。需先安裝 CH341PAR 驅動(程式不附驅動 DLL);多顆時以 ch341@xxxxxx 區分。讀取方式可在 config.ini 的 [CH341] 區段設 read=rs(預設)或 read=stop
ftdiFTDI FT2232H/FT232H/FT4232H(MPSSE)USB 轉 I2C+GPIO。需先安裝 FTDI D2XX 驅動(程式不附 ftd2xx.dll);只用 A 通道,B 通道留給 UART(COM 埠)。見下方
stm32dglSTM32H743 USB 轉 I2C(HID)。有 INT 邊緣事件、匯流排恢復、GPIO 脈衝與 vendor op,見下方
mock模擬後端,沒有實體硬體也能跑。用來試操作、跑腳本

下 dongle 會列出實際掃到的全部後端與各自的狀態,那份清單才是準的。

STM32H743 dongle

stm32dgl 是以 STM32H743 做的 USB 轉 I2C dongle,除了一般的 I2C 讀寫,還有其他後端沒有的功能: INT 邊緣事件、匯流排恢復、精確 GPIO 脈衝,以及由韌體自己宣告的廠商操作(vendor op)。

項目內容
USB複合裝置,VID 0x0483/PID 0x573D。自訂 HID(Usage Page 0xFF00)是本程式使用的指令通道;CDC 虛擬序列埠是 UART 橋接,系統會多一個 COM 埠,用法同一般 UART
後端名稱stm32dgl@<六位十六進位>(由 USB 路徑算出,換 USB 孔名稱會變),最多同時接 4 支。dongle 指令會列出實際名稱
GPIO腳 0~6 是韌體的 GPIO 組(nRST、RESET1、PH13、PI9、PI8、PJ11、PH6);腳 7 是 INT1(PB6),專門給 dongle int 用
韌體協定需要協定 2。協定版本不符時開啟會被拒絕,Log 會寫出韌體版本與需要的協定版本;請更新 dongle 韌體
獨占開啟本程式以獨占方式開啟 HID 指令通道,同時間只能有一個程式使用。接不上時先用 dongle who 查是誰佔著
關閉關閉後端(dongle close、離開程式)會把 SCL/SDA 切回 I2C 模式並關掉 INT 通知;若這個工作階段用 i2c_timeout 改過逾時,也會還原成預設的 50/700 ms

腳位模式與 ERR_HW_BUS_PARKED

SCL/SDA 可以用 vendor op 切成 GPIO 或方波輸出(bus_set、wave)。腳位不在 I2C 模式時, I2C 讀寫會回報 ERR_HW_BUS_PARKED,Log 寫「the I2C pins are not in I2C mode (parked)」。 它的意思是裝置健康、只是腳位被借走了:不會被當成離線、不會計入連續失敗,也不會自動重試。 回到 I2C 模式有兩條路:dongle op bus_set i2c,或直接 dongle recover(它一律強制切回 I2C 並停掉方波)。

Vendor op 目錄

韌體自己宣告它支援哪些操作,所以新韌體加了功能,不用升級本程式就能用。dongle op 列出目前連線的目錄, dongle op help <名稱> 看參數,Device 選單的 Dongle operations… 則依目錄自動長出表單。 stm32dgl 目前宣告的 op:

op做什麼參數 → 結果
bus_set設定 SCL/SDA 腳位模式(gpio 放掉 I2C、i2c 還給 I2C)mode(i2c/gpio)、drive(pp/od,預設 od)、pull(none/up/down,預設 none)→ 目前模式、pins、scl_hz、sda_hz、tick_hz
bus_get讀腳位模式與方波設定→ 同 bus_set 的結果
pin_setGPIO 模式下直接驅動 SCL/SDAscl、sda(low/high/keep,預設 keep)→ pins。I2C 模式下會被拒絕(ERR_INVALID_PARAM)
pin_get讀 SCL/SDA 電位→ pins(bit0 = SCL、bit1 = SDA)
wave在 SCL/SDA 輸出 DMA 驅動的方波(bus_set i2c 可停止)scl_hz、sda_hz(1~4000000 Hz)、drive(預設 pp)→ tick_hz
i2c_timeout設定 I2C 時脈延展等待與單筆指令總預算stretch_ms(1~2000)、total_ms(100~3000)→ 生效值。預設 50/700。只有新版韌體才有,沒有的話目錄裡不會出現
i2c_timeout_get讀目前生效的逾時→ stretch_ms、total_ms。同上,只有新版韌體才有
uart_statsUART 橋接(USART2)的計數→ rx_bytes、tx_bytes、rx_drop、errors

實際清單以 dongle op 印出的為準。範例:

dongle op wave 100000 100000 # 位置參數:scl_hz sda_hz dongle op wave scl_hz=100000 sda_hz=50000 drive=od dongle op bus_set i2c # 還給 I2C

INT 事件與時間戳

dongle int config falling up 之後,dongle 會替每個邊緣記一筆事件(不是每毫秒合併一次)。 開 dongle int log on 可以把每個邊緣寫進 Log:

INT edge: level=0 dt=1250 us (~tick 482113 ms, estimated)
  • dt 是dongle 自己的微秒計數之差,精確;第一筆沒有前一筆,顯示 n/a。
  • ~tick 是主程式讀回該批事件時的時間,只是估計:事件在 dongle 裡可能排了一陣子(尤其 poll off 期間不取回),別拿它當絕對時間。
  • dongle 的計數是 32 位元微秒,約 71.6 分鐘繞回一次,主程式算差值時已處理繞回。
  • 事件取回受 poll off 管制;poll on 後一次交出累積的事件。環形緩衝容量有限,超出的計入丟棄數(dongle int status 看得到)。

限制

  • dongle pulse 的寬度範圍是 1 微秒~699 毫秒(毫秒解析度,向上取整),超出會被拒絕,不會被縮短。期間這支 dongle 的 Worker 被佔住,其他 I2C 存取要等。
  • poll off 期間,主機端 HID 輸入佇列滿了而溢位的事件、以及重設基準後第一批之前的掉包,不計入丟棄數。
  • 一次 I2C 交易最長約 3.15 秒(逾時設滿時),比主程式關閉時等 Worker 的 2 秒長;在長交易中關閉程式,dongle 可能來不及切回 I2C 模式。

FTDI MPSSE dongle

ftdi 用 FT2232H(或 FT232H/FT4232H)的 A 通道當 I2C+GPIO dongle。後端名稱 ftdi@<六位十六進位>(由序號算出)。 不需要用 FT_Prog 改 EEPROM:出廠預設(兩個通道都是 UART+虛擬 COM 埠)就能用,程式開啟時才動態切成 MPSSE。 B 通道永遠不碰,仍是一般的 COM 埠,可以直接開 UART 面板。

接線

用途FT2232H 腳說明
SCLADBUS0接目標 SCL
SDAADBUS1 + ADBUS2兩支腳在外部短接後接目標 SDA(ADBUS1 是輸出、ADBUS2 是輸入)
GNDGND與目標共地
GPIO pin 0~4ADBUS3~7
GPIO pin 8~15ACBUS0~7

⚠ SDA 與 SCL 需要上拉電阻(4.7 kΩ 到 IO 電壓);很多 FT2232H 板子沒有,目標那一側也沒有的話要自己加。 ⚠ 有些板子的排針絲印是 FT4232H 的命名(BDB/CDB…),與 FT2232H 實際訊號不同,接線前先對照板子的原理圖。

行為與限制

  • I2C 速度 10 kHz~1 MHz 任意值(預設 100 kHz),實際值不超過設定值,dongle 會顯示實際值。
  • 每個位元組都檢查 ACK,NACK 回報 ERR_I2C_NACK;單筆 1~256 位元組。
  • GPIO 保持電位時跑 I2C,GPIO 不會跳動。
  • GPIO 的 INT 是軟體輪詢、只偵測下降緣,輪詢間隔之間來回的脈衝會漏掉。
  • gpio pulse 範圍 1 微秒~500 毫秒,超出會被拒絕,不會被縮短。
  • 沒有 vendor op、匯流排恢復與 INT 事件環。
  • SCL 是推挽輸出,不支援 clock stretching。
  • FT4232H 沒有 ACBUS,GPIO 只有 pin 0~4。
  • 後端名稱 ftdi@xxxxxx 是序號的雜湊,不含序號本身。
  • A 通道的 COM 埠若在掃描前就被其他程式開著,這顆裝置不會出現在清單中(D2XX 此時回報空序號);掃描之後才被占用時,開啟會失敗,dongle 會註明「通道被占用」。

自動選擇與手動指定

沒指定時程式會自動探測,依固定的優先序嘗試。要指定:

dongle ch341 切到指定後端 dongle rescan 重新掃描 dongles/ 目錄 dongle close 手動關閉(等同拔線,但不會自動重連) dongle who 查出是誰佔著裝置

⚠ 命令列的 --dongle 是以名稱比對的,沒有叫 auto 的後端。要讓程式 自己探測就不要帶這個參數。

熱插拔

離線時程式會週期性地重新探測,插回去會自己接上,不用重開。換了 USB 孔的話, dongle rescan 會把新的那一個加進清單——舊的那一筆會留著並顯示離線,重開才會 消失。

UART

序列埠獨立於 I2C,任何系統看得到的 COM 埠都可以用。uart scan 列出可用的埠。 見 UART 記錄與 UART 送出。

沒有硬體也能用

dongle mock 切到模擬後端,它在內部模擬一顆 256 位元組的裝置,讀寫都是真的會改 內容。用來熟悉操作、驗證腳本,或在手邊沒有板子時開發 Plugin。

作業系統

Windows 7 SP1/8.1 以上,32-bit 與 64-bit 都有。絕大多數人要的是 64-bit, 只有舊機器才需要 32-bit。