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
- 配置成master tx mode(也就是IICSTAT[7:6]配置成11)
- 把從裝置地址寫入IICDS,(第一次傳輸地址)
- IICSTAT寫入0xF0(使能傳輸)
- IICDS中配置的資料(從裝置地址7bit + 讀寫位1bit)就被髮送出去了(每傳輸完一個數據將產生一箇中斷)
- 判斷第9個clk從裝置是否有ack
- 如果從裝置有ack,恢復i2c傳輸
- IICDS = buf
- Clear pending bit
- 資料被髮送出去,繼續i2c傳輸
- 如果沒有ack, stop,返回錯誤
- IICSTAT = 0xd0
- Clear pending bit(IICCON[4])
- Delay一會兒等待停止條件生效
②Master/Receiver Mode
- 配置成master rx mode(也就是IICSTAT[7:6]配置成10)
- 把從裝置地址寫入IICDS,(第一次傳輸地址)
- IICSTAT寫入0xF0(使能傳輸)
- IICDS中配置的資料(從裝置地址7bit + 讀寫位1bit)就被髮送出去了(每傳輸完一個數據將產生一箇中斷)
- 判斷第9個clk從裝置是否有ack
- 如果從裝置有ack,恢復i2c傳輸
- Buf = IICDS
- Clear pending bit
- 資料被接受到,繼續i2c傳輸
- 如果沒有ack, stop,返回錯誤
- IICSTAT = 0x90
- Clear pending bit
- Delay一會兒
③Slave/Transmitter Mode