支援的硬體
I2C dongle
程式本身不綁定特定硬體:每一種 dongle 是一顆獨立的 adapter DLL,放在 dongles/
目錄裡,啟動時掃描。要支援一種新硬體不必改主程式。
目前隨產品出貨的有:
| 後端 | 說明 |
|---|---|
usb2i2c | ITE USB 轉 I2C(HID 介面) |
ch341 | WCH CH341T USB 轉 I2C。需先安裝 CH341PAR 驅動(程式不附驅動 DLL);多顆時以 ch341@xxxxxx 區分。讀取方式可在 config.ini 的 [CH341] 區段設 read=rs(預設)或 read=stop |
ftdi | FTDI FT2232H/FT232H/FT4232H(MPSSE)USB 轉 I2C+GPIO。需先安裝 FTDI D2XX 驅動(程式不附 ftd2xx.dll);只用 A 通道,B 通道留給 UART(COM 埠)。見下方 |
stm32dgl | STM32H743 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_set | GPIO 模式下直接驅動 SCL/SDA | scl、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_stats | UART 橋接(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 # 還給 I2CINT 事件與時間戳
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 腳 | 說明 |
|---|---|---|
| SCL | ADBUS0 | 接目標 SCL |
| SDA | ADBUS1 + ADBUS2 | 兩支腳在外部短接後接目標 SDA(ADBUS1 是輸出、ADBUS2 是輸入) |
| GND | GND | 與目標共地 |
| GPIO pin 0~4 | ADBUS3~7 | |
| GPIO pin 8~15 | ACBUS0~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。