1. 程式人生 > 其它 >s3c2440裸機-I2c程式設計-2.i2c控制器

s3c2440裸機-I2c程式設計-2.i2c控制器

1.I2c主控與從裝置關係

對於寫操作,主控作為transmitter,從裝置作為receiver

對於讀操作,主控作為receiver, 從裝置作為transmitter

2.I2c控制器

2.1總框圖

Pclk = 50Mhz, 經過prescaler分頻,可以得到SCL。

IICSTAT:發出S(start)訊號或者P(stop)訊號。

Data Bus可以把資料寫入IICDS暫存器,然後會自動產生SCL,並且會將8位資料從SDA同步給slave dev,

在資料傳送出去後,在第9個SCL時鐘,會受到slave dev的ack應答,可以通過查詢IICSTAT來判斷是否有ACK迴應。

當slave dev迴應ACK後,那麼又可以繼續傳送資料,繼續寫入據到IICDS。

當主控想結束,設定IICSTAT發出P訊號。

2.2 暫存器介紹

1.IICCON(用來配置i2c時鐘)

Bit[7]: 對於傳送模式,不需要配置ack訊號,ack是接收者傳送回來的應答。對於接受模式,設定成1,讓它在第9個CLK發出ack訊號(拉低sda)。

Bit[6]:SCL時鐘源,pclk分頻即可

Bit[5]:中斷使能,使用i2c時要去enable

Bit[4]:中斷狀態標識 表示中斷有沒有結束,當該bit讀出來是1時,SCL被拉低表示busy,也就是i2c中斷還在處理中。當i2c中斷處理結束後,可以將該bit 清0,釋放出SCL。

Bit[3:0]:i2c時鐘分頻係數配置,SCL時鐘 = IICCLK/(IICCON[3:0]+1)

2.IICSTAT(配置模式,S,P訊號,查詢是否有ack)

bit[7:6]:模式選擇

Bit[5]:當讀的時候,0表示not busy,1表示busy

當寫的時候,0表示寫入STOP, 1表示寫入START

Bit[4] : 資料輸出使能,0:表示disable, 1表示enable

Bit[3]:仲裁flag

Bit[0]:表示i2c總線上的第9個時鐘週期有沒有ack,1表示有ack, 0表示無ack

3.IICADD(配置從機地址)

4.IICDS: (儲存的是要傳送或已經接收的資料)

3. 讀寫操作流程

The following steps must be executed before any IIC Tx/Rx operations.

1. Write own slave address on IICADD register, if needed.

2. Set IICCON register.

a) Enable interrupt

b) Define SCL period

3. Set IICSTAT to enable Serial Output

在操作tx,rx前,要先執行以下幾步驟:

1.IICADD寫入從裝置地址

2.設定IICCON,設定時鐘,使能中斷

3.設定IICSTAT,使能傳輸

操作模式:

The S3C2440A IIC-bus interface has four operation modes:

— Master transmitter mode

— Master receive mode

— Slave transmitter mode

— Slave receive mode

①Master/Transmitter Mode

  1. 配置成master tx mode(也就是IICSTAT[7:6]配置成11)
  1. 把從裝置地址寫入IICDS,(第一次傳輸地址)
  2. IICSTAT寫入0xF0(使能傳輸)
  3. IICDS中配置的資料(從裝置地址7bit + 讀寫位1bit)就被髮送出去了(每傳輸完一個數據將產生一箇中斷)
  4. 判斷第9個clk從裝置是否有ack
    1. 如果從裝置有ack,恢復i2c傳輸
      1. IICDS = buf
      2. Clear pending bit
      3. 資料被髮送出去,繼續i2c傳輸
    1. 如果沒有ack, stop,返回錯誤
      1. IICSTAT = 0xd0
      2. Clear pending bit(IICCON[4])
      3. Delay一會兒等待停止條件生效

②Master/Receiver Mode

  1. 配置成master rx mode(也就是IICSTAT[7:6]配置成10)
  1. 把從裝置地址寫入IICDS,(第一次傳輸地址)
  2. IICSTAT寫入0xF0(使能傳輸)
  3. IICDS中配置的資料(從裝置地址7bit + 讀寫位1bit)就被髮送出去了(每傳輸完一個數據將產生一箇中斷)
  4. 判斷第9個clk從裝置是否有ack
    1. 如果從裝置有ack,恢復i2c傳輸
      1. Buf = IICDS
      2. Clear pending bit
      3. 資料被接受到,繼續i2c傳輸
    1. 如果沒有ack, stop,返回錯誤
      1. IICSTAT = 0x90
      2. Clear pending bit
      3. Delay一會兒

③Slave/Transmitter Mode

④Slave/Receiver Mode