最近正從xilinx 轉向使用 Lattice, Lattice 官網有提供相當豐富的SOURCE CODE可做參考。
我所使用的IC系列是 MachXO2 ,裡面的I2C 版本又細分成"普通的I2C版本"跟"整合wishbone的I2C版本",目前想先測試簡單一點的版本,之後有空再使用wishbone的版本,畢竟之後如果要讀寫內部的FLASH空間,還是得透過wishbone的介面(而且這顆IC裡面的EFB模組有硬核的I2C,之後使用應該會比較省資源)。
i2c_slave.v 是此模組的名稱,有興趣的朋友可以自己去下載來研究。
module i2c_slave (XRESET, ready, start, stop, data_in, data_out, r_w, data_vld, scl_in, scl_oe, sda_in, sda_oe);
注意到宣告的模組裡面的”scl_in”,之後程式碼內部的觸發訊號,全部都是以此I2C的CLK輸入訊號來動作的,內部並沒有透過外部的Global_Clk來貫穿整體的時序.
在之前的使用中,如果直接將外部的IO直接拉到此模組的輸入端,會有機會觸發錯誤的問題。
解決的方式,便是在外部的模組中,先將輸入訊號經過內部的 register 經過兩級之後,會大幅減少metastability的問題。
目前筆者墊了兩級之後,問題便解決了。
但之後應該還是會改寫原廠所寫的方式,改以Global_Clk來作為觸發,將SCL、SDA兩根IO拉進來做同步設計。

沒有留言:
張貼留言