FPGA sample - Lattice I2C IP (EFB) #1


Lattice I2C IP

話說原本使用 Verlog 寫了 I2C Slave 模組功能正常沒有太多的問題,有天同事問我如何做 I2C-stress 測試,協助設計了幾個指令,長時間 I2C 讀取測試,測試結果使用 Verlog I2C Slave 模組居然有幾次沒有 acknowledge,於是花了時間研讀 Lattice I2C IP (EFB),把原本的模組更換成 Lattice I2C IP,通過了 I2C-stress 的測試。當然,原本 Verlog I2C Slave 模組程式碼,也找到問題所在,修正並通過 I2C-stress 驗證。

EFB Block Diagram

Lattice 提供了一個 EFB-IP (Embedded Function Block)提供了 Serial Peripheral Interface (SPI),兩組 I2C (可以設定為 Master/Slave) 和 Timer/Counter。因此,在使用 EFB-IP 就和編寫 MCU 模組程式很像,要先做 EFB-IP 初始化(功能設定),再控制 EFB-IP 完成 I2C 功能。

Block Diagram            


程式開發者利用 Wishbone bus 來初始化和控制 EFB-IP,Wishbone bus 包含 Wishbone address,Wishbone data input/output 和控制訊號,再使用 I2C_SDA/I2C_SCL 來連接外面的 I2C 裝置。

Wishbone bus 透過讀寫 EFB-IP 的暫存器來完成初始化和讀寫外部的 I2C  裝置,存取 EFI-IP 的訊號流程順序。

EFB-IP Register

wb_adr

Description

MICO_EFB_I2C_CR

0x40

0x4A

Control Register

b[7] : I2C controller enable

b[6] : I2C GC mode enable (I2C 廣播模式)

b[5] : I2C controller wake-up enable

MICO_EFB_I2C_CMDR

0x41

0x4B

Command Register

b[7] : STA - Generate (Repeated) START condition 

b[6] : STO - Generate STOP condition

b[5] : RD - I2C read from slave

b[4] : WR - I2C write to slave

b[3] : ACK - I2C Acknowledge. 0=Send ACK / 1=Send NACK

b[2] : CKSDIS - Clock Stretching disable. 0=Enabled / 1=Disabled

MICO_EFB_I2C_BLOR

0x42

0x4C

Clock Pre-scale Register

MICO_EFB_I2C_BHIR

0x43

0x4D

Clock Pre-scale Register

MICO_EFB_I2C_TXDR

0x44

0x4E

Transmit Data Register

MICO_EFB_I2C_SR

0x45

0x4F

Status Register

b[7] : TIP - Transmitting In Progress. 1=completed / 0=in progress

b[6] : BUSY - Bus busy

b[5] : RARC - Received Acknowledge. 1=No Ack / 0=Ack

b[4] : SRW - Slave RW. 1=Master recv and Slave tran / 0= Master tran and Slave recv

b[3] : ARBL - Arbitration Lost. 1=Lost / 0=Normal

b[2] : TRRDY - Transmitter or Receiver Ready. 1=ready / 0=not ready 

b[1] : TROE - Transmitter or Receiver Overrun. 1=Overrun / 0=Normal

b[0] : HGC - Hardware General Call Received. 1=Hardware GC / 0=No Hardware GC

MICO_EFB_I2C_GCDR

0x46

0x50

General Call Register

MICO_EFB_I2C_RXDR

0x47

0x51

Receive Data Register

MICO_EFB_I2C_IRQSR

0x48

0x52

IRQ

MICO_EFB_I2C_IRQENR

0x49

0x53

IRQ Enable

 

EFB-IP I2C Slave mode 的 state machine

  • EFB-IP I2C Slave 的初始化,由 state #0 - state #3
  • EFB-IP 接收到 start-bit , address 和 command 到 state #8,經過驗證 command 的正確後達到 state #12,   

  • I2C Write Protocol 在 state #14 讀取資料,完成資料讀取,進入 NACK 和 stop-bit 到 state #17 完成 data packet.

  • I2C Read Protocol 由 state #2 到 state #12 完成 repeat start-bit 和 address 都正確後,然後填入資料,完成資料傳輸,進入 NACK 和 stop-bit 到 state #17 完成 data packet.


留言

這個網誌中的熱門文章

EC 所需知識 - SMBUS

EC 所需知識 - KBC

EC 所需知識 - LPC