綜合範例
前面每一頁都用小範例示範單一個函式;這一頁把學過的東西串起來,看三支比較接近
實際用途的完整腳本。三支開頭都自己呼叫 i2c.addr(0x58) 連上裝置(見
I2C 讀寫),不需要任何前置指令,複製下來就能直接跑。
掃描一段暫存器並印表
-- 先設定這顆 IC 的 slave 位址,之後才能用 i2c.* 存取(見「I2C 讀寫」頁)。
i2c.addr(0x58)
-- 掃描一段暫存器並印出十六進位內容;watch.add()/remove()/clear() 示範監看
-- 清單操作(先寫入已知樣式,避免依賴未定義的初始值)。
for i = 0, 15 do
i2c.write(0x40 + i, i * 2)
end
watch.add(0x40)
watch.add(0x41)
watch.remove(0x41)
watch.clear()
for i = 0, 15 do
local v = i2c.read(0x40 + i)
log("info", string.format("reg[0x%02X] = 0x%02X", 0x40 + i, v))
end
log("info", "reg_scan done")reg[0x40] = 0x00
reg[0x41] = 0x02
reg[0x42] = 0x04
reg[0x43] = 0x06
reg[0x44] = 0x08
reg[0x45] = 0x0A
reg[0x46] = 0x0C
reg[0x47] = 0x0E
reg[0x48] = 0x10
reg[0x49] = 0x12
reg[0x4A] = 0x14
reg[0x4B] = 0x16
reg[0x4C] = 0x18
reg[0x4D] = 0x1A
reg[0x4E] = 0x1C
reg[0x4F] = 0x1E
reg_scan done先把一段位移寫入已知的樣式(不依賴裝置原本的內容,讓範例本身可驗證),示範
watch.add()/remove()/clear() 怎麼操作監看清單,接著逐一讀回這段位移並用
string.format("%02X", ...) 印成整齊的十六進位表。這種「掃一段、印出來看」的
寫法很適合用來檢查一顆新裝置的暫存器內容跟預期是不是一致。
多欄位產線判定
-- 先設定這顆 IC 的 slave 位址,之後才能用 i2c.* 存取(見「I2C 讀寫」頁)。
i2c.addr(0x58)
-- 多個位元欄位的產線驗證:每一項用 check() 記錄,最後印出總結。
i2c.write(0x50, 0xA5)
local v = i2c.read(0x50)
check(bit.band(v, 0x80) == 0x80, "bit7 set")
check(bit.band(v, 0x40) == 0x00, "bit6 clear")
check(bit.band(v, 0x20) == 0x20, "bit5 set")
check(bit.band(v, 0x0F) == 0x05, "low nibble is 0x5")
log("info", "bitfield_verify done")CHECK OK: bit7 set
CHECK OK: bit6 clear
CHECK OK: bit5 set
CHECK OK: low nibble is 0x5
bitfield_verify done寫入一個已知值後讀回,用 bit.band() 逐一檢查其中幾個獨立欄位(某幾個位元該是
1、某幾個該是 0、某個 4 位元的欄位該等於某個值),每項各自 check() 一次。這是
量產線最典型的用法:一支腳本涵蓋一整組要驗證的欄位,跑完直接看結束摘要就知道
這片板子過不過。
寫讀壓力迴圈
-- 先設定這顆 IC 的 slave 位址,之後才能用 i2c.* 存取(見「I2C 讀寫」頁)。
i2c.addr(0x58)
-- 寫讀迴圈並計數錯誤次數;poll.off()/poll.on() 這裡只是示範配對呼叫的寫法
-- (腳本執行期間背景輪詢本來就不會運作,這兩個函式對這段迴圈沒有實質影響,
-- 細節見「輪詢與監看」頁)。
poll.off()
local errors = 0
for i = 0, 31 do
local val = (i * 7) % 256
i2c.write(0x60, val)
local got = i2c.read(0x60)
if got ~= val then
errors = errors + 1
end
end
poll.on()
check(errors == 0, "stress loop had zero mismatches")
log("info", "stress_loop done, errors=" .. errors)CHECK OK: stress loop had zero mismatches
stress_loop done, errors=0在 poll.off()/poll.on() 之間跑一段連續的寫入、讀回、比對迴圈,用一個計數器
累積不相符的次數,最後用一次 check() 判斷「這一整輪迴圈有沒有出現任何一次不
相符」。這種寫法適合拿來測試匯流排在連續高頻存取下穩不穩定。
⚠ 範例外圍包的 poll.off()/poll.on() 對這段迴圈本身沒有任何影響——
腳本執行期間背景輪詢本來就不會運作,跟這兩個函式無關(細節見
「輪詢與監看」)。這裡只是示範這兩個函式配對呼叫的寫法:
先關、跑完再開,讓這支腳本結束時背景輪詢確定是開著的(不管腳本開始執行之前
是開是關);不是因為這樣寫能讓迴圈本身跑得更快或更乾淨。
接下來
到這裡,這個教學介紹過的函式與寫法都已經示範過至少一次。想查任何一個函式的 完整簽章、參數範圍與錯誤情況,見下一頁、也是最後一頁的API 參考。