1. 程式人生 > >I2C 配置及應用

I2C 配置及應用

一、I2C的協議這裡就不贅述了,隨便搜一下就可以瞭解。

二、I2C的初始化

1.Enable I2C clock

configure the PSC register(if it is driven by PSC)PSC相關說明可以檢視手冊

2. Configure the PinMultiplexing registers

3. Place I2C in reset

set IRS =0 in ICMDR register

4.Configure the peripheral clock operation frequency(ICPSC)

NOTE:the frequency should be between 6.7 and 13.3MHz

5.Configure i2c master clock frequency:

configure ICCLKL , ICCLKH

7.Make sure the interrupt status register(ICSTR) is cleared:

Read ICSTR and write it back (write 1 to clear) ICSTR = ICSTR

Read ICIVR until it is 0. 

8.Take i2c controller out of reset 

set IRS=1 in ICMDR

三、I2C作為master傳送資料的配置

1. Wait until bus bit is cleared (BB =0 in ICSTR)

2.Configure ICMDR register

  • configure I2C as Master ( MST = 1 );
  • indicate the i2c configuration to be used(if TRX = 0, device configured as Data Receiver);
  • configure serial data formats( eg.  XA = 0, 7-bit addressing format );
  • set RM = 0 to disable repeat mode;
  • set DLB = 0 to disable loopback mode;
  • set FDF = 0 to disable free data format;
  • optional:disable start byte mode if addressing a fully fledged i2c device (set STB = 0 );
  • set number of bits to transfer to be 8 bits (BC = 0) ;
  • 設定模擬器斷點無響應,bus繼續執行, ICMDR中 FREE=1

3.設定傳送資料長度(位元組)ICCNT

4.Configure Slave Address( ICSAR = 7bit address)

5.Generate a START event ,followed by Slave Address,etc.(set STT =1 in ICMDR)

6.迴圈傳送資料,資料寫入ICDXR,等待ICSTR中ICXRDY=1,表明資料搬運完成。並設定超時重新初始化init(我這設定的是while迴圈不超過500000)

7. End transfer/release bus when transfer is done. Generate a STOP event (set STP = 1 in ICMDR). 

四、I2C作為master讀取資料

1. Wait until bus bit is cleared (BB =0 in ICSTR)

2.Configure ICMDR register

  • configure I2C as Master ( MST = 1 );
  • indicate the i2c configuration to be used(if TRX = 0, device configured as Data Receiver);
  • configure serial data formats( eg.  XA = 0, 7-bit addressing format );
  • set RM = 0 to disable repeat mode;
  • set DLB = 0 to disable loopback mode;
  • set FDF = 0 to disable free data format;
  • optional:disable start byte mode if addressing a fully fledged i2c device (set STB = 0 );
  • set number of bits to transfer to be 8 bits (BC = 0) ;
  • 設定模擬器斷點無響應,bus繼續執行, ICMDR中 FREE=1

3.設定傳送資料長度(位元組)ICCNT

4.Configure Slave Address( ICSAR = 7bit address)

5.Generate a START event ,followed by Slave Address,etc.(set STT =1 in ICMDR)

6.迴圈接收資料

等待ICSTR中ICRRDY=1,為1時表明資料可以讀取,並設定超時重新初始化init(我這設定的是while迴圈不超過500000),讀取ICDRR中資料。當資料為最後一個位元組時傳送NACK(ICMDR中NACKMOD=1)

7. End transfer/release bus when transfer is done. Generate a STOP event (set STP = 1 in ICMDR).