雅特力AT32F423 I2C使用指南

2024年2月6日 24点热度 0人点赞

I2C接口簡介

I2C接口是由數據線SDA和時鐘線SCL構成,在標準模式下通信速度可達到100kHz,快速模式下則可以達到400kHz,增強快速模式可達到1MHz。一幀數據傳輸從開始信號開始,在結束信號後停止,在收到開始信號後總線被認為是繁忙的,當收到結束信號後,總線被認為再次空閑。I2C接口具有主機和從機模式、多主機功能、可編程建立和保持時間、時鐘延展功能、DMA存取數據、支持SMBus 2.0協議等特點。

圖1. I2C1框圖

I2C1可透過配置CRM中PICLKS寄存器的I2C1SEL位,時鐘來源可選擇來自SYSCLK、PCLK和HICK,並且支持從Deepsleep mode喚醒,I2C1有模擬濾波器,可以濾掉50ns內的噪聲。

圖2. I2C2、I2C3框圖

I2C2/I2C3時鐘來源為PCLK,不支持Deepsleep mode喚醒並且沒有模擬濾波器。

I2C接口通信

主機通信流程

一、主機通信初始化

1. 主機時鐘初始化

在啟動外設(I2CEN)之前,必須先設置I2Cx_CLKCTRL寄存器的各個位用以配置I2C主時鐘。

― DIV[7:0]:I2C時鐘分頻;

― SDAD[3:0]:數據保持時間(tHD;DAT)

― SCLD[3:0]:數據建立時間(tSU;DAT)

― SCLH[7:0]:SCL高電平時間

― SCLL[7:0]:SCL低電平時間

該寄存器的配置可以使用
Artery_I2C_Timing_Configuration時鐘配置工具計算,見第三章節。

低電平控制:當檢測到SCL總線為低電平時,內部SCLL計數器開始計數,當計數值達到SCLL值時,釋放SCL線,SCL線變為高電平。

高電平控制:當檢測到SCL總線為高電平時,內部SCLH計數器開始計數,當計數值達到SCLH值時,拉低SCL線,SCL線變為低電平,當在高電平期間,如果被外部總線拉低,那麼內部SCLH計數器停止計數,並開始低電平計數,這為時鐘同步提供了條件。

圖3. 主機時鐘的產生

2. 主機通信初始化

在啟動通訊前須先設定I2C_CTRL2寄存器中的幾項參數:

1) 設置傳輸字節數

  • ≤255字節
  • 配置I2C_CTRL2的RLDEN=0,關閉重載模式
  • 配置I2C_CTRL2的CNT[7:0]=N
  • >255字節
  • 配置I2C_CTRL2的RLDEN=1,使能重載模式
  • 配置I2C_CTRL2的CNT[7:0]=255
  • 剩餘傳輸字節數N=N-255

2) 設置傳輸結束模式

  • ASTOPEN=0:軟件結束模式,當數據傳輸完成後,I2C_STS的TDC標志置1,軟件設置GENSTOP=1或者GENSTART=1,發送STOP條件或者START條件。
  • ASTOPEN=1:自動結束模式,當數據傳輸完成後,自動發送STOP條件。

3) 設置從機地址

  • 設置尋址的從機地址值(I2C_CTRL2的SADDR)
  • 設置從機地址模式(I2C_CTRL2的ADDR10)
  • ADDR10=0:7位地址模式
  • ADDR10=1:10位地址模式

4) 設置傳輸方向(I2C_CTRL2的DIR)

  • DIR=0:主機接收數據
  • DIR=1:主機發送數據

5) 開始傳輸

設置I2C_CTRL2的GENSTART=1,主機開始在總線上發送START條件和從機地址。

3. 主機10bits尋址的特殊時序初始化

在10位地址傳輸模式下,I2C_CTRL2的READH10用於產生特殊時序,當READH10=1時,支持如下傳輸序:主機先發送數據給從機,然後再從從機讀取數據,傳輸時序圖如下圖所示:

圖4. 10位地址的讀訪問READH10=1

主機在軟件結束模式(ASTOPEN=0)下,發送數據到從機,當數據發送完成後設置READH10=1,然後再從從機接收數據。

圖5. 10位地址的讀訪問READH10=0

二、主機通信初始化軟件接口

主機通信初始化所用到的軟件接口通過獨立的函數接口實現,如下:

i2c_init函數三個參數分別為:所使用的I2C、數字濾波值和主機時鐘配置值。

i2c_transmit_set函數用於初始化通信參數,包括:所使用的I2C、從機地址、傳輸字節數、停止條件產生模式和起始條件產生模式。

i2c_addr10_mode_enable函數用於使能10位地址模式。

i2c_addr10_header_enable函數用於使能10位地址頭讀取時序,即主機發送完整的10位從機地址讀序列或主機隻發送10位地址的前7位。

三、主機發送流程

1) I2C_TXDT數據寄存器為空,I2C_STS的TDIS=1;

2) 向TXDT數據寄存器寫入數據,數據開始發送;

3) 重復1、2步驟直到發送CNT[7:0]個數據;

4) 如果此時I2C_STS的TCRLD=1(重載模式),分為以下兩種情況:

  • 剩餘字節數N>255:向CNT寫入255,N=N-255,TCRLD被自動清0,傳輸繼續;
  • 剩餘字節數N≤255:關閉重載模式(RLDEN=0),向CNT寫入N,TCRLD被自動清0,傳輸繼續。

5) 結束時序

  • 停止條件產生:
  • 軟件結束模式(ASTOPEN=0):此時I2C_STS的TDC置1,設置GENSTOP=1產生STOP條件;
  • 自動結束模式(ASTOPEN=1):自動產生STOP條件。
  • 等待產生STOP條件,當STOP條件產生時,I2C_STS的STOPF置1,將I2C_CLR的STOPC寫1,清除STOPF標志,傳輸結束。

圖6. I2C主機發送流程圖

圖7. I2C主機發送時序圖

四、主機發送流程軟件接口

主機發送通過獨立的函數接口實現,如下:

i2c_master_transmit函數為i2c_application.c文件所提供的應用層接口函數,參數包括:I2C結構體指針、從機地址、發送數據指針、發送數據字節數和函數超時時間。

註:此函數為Artery所提供的標準主機發送函數。用戶也可根據前述主機發送流程,自行編寫主機發送函數。

五、主機接收流程

1) 當收到數據後,RDBF=1,讀取RXDT數據寄存器,RDBF被自動清零;

2) 重復步驟2直到接收CNT[7:0]個數據;

3) 如果此時I2C_STS的TCRLD=1(重載模式),分為以下兩種情況:

  • 剩餘字節數N>255:向CNT寫入255,N=N-255,TCRLD被自動清0,傳輸繼續;
  • 剩餘字節數N≤255:關閉重載模式(RLDEN=0),向CNT寫入N,TCRLD被自動清0,傳輸繼續。

4) 當在接收到最後一個字節時,主機會自動發送一個NACK。

5) 結束時序

  • 停止條件產生:
  • 軟件結束模式(ASTOPEN=0):此時I2C_STS的TDC置1,設置GENSTOP=1產生STOP條件;
  • 自動結束模式(ASTOPEN=1):自動產生STOP條件。
  • 等待產生STOP條件,當STOP條件產生時,I2C_STS的STOPF置1,將I2C_CLR的STOPC寫1,清除STOPF標志,傳輸結束。

圖8. I2C主機接收流程圖

圖9. I2C主機接收時序圖

六、主機接收流程軟件接口

主機接收通過獨立的函數接口實現,如下:

i2c_master_receive函數為i2c_application.c文件所提供的應用層接口函數,參數包括:I2C結構體指針、從機地址、接收數據指針、接收數據字節數和函數超時時間。

註:此函數為Artery所提供的標準主機接收函數。用戶也可根據前述主機接收流程,自行編寫主機接收函數。

從機通信流程

一、從機通信初始化

1. 從機地址配置

每個I2C從設備可同時支持2個從設備地址,由OADDR1和OADDR2指定

I2C_OADDR1

  • 通過ADDR1EN使能
  • 通過ADDR1MODE配置為7位(默認)或10位地址

I2C_OADDR2

  • 通過ADDR2EN使能
  • 固定7位地址模式
  • 可通過ADDR2MASK[2:0]來在進行地址匹配比較時屏蔽掉0~7個LSB地址位
  • ADDR2MASK=0表示7位地址中的每一位都要參與匹配比較
  • ADDR2MASK=7表示任何非保留地址的7位地址都會被該從設備應答

2. 從機地址匹配

當I2C啟用的地址選中匹配時,ADDRF中斷狀態標志會被置1,如果ADDRIEN位為1,就會產生一個中斷。如果兩個從地址都使能,在地址匹配產生ADDR中斷時,可以查看狀態寄存器中的ADDR[6:0]來得知是OADDR1還是OADDR2被尋址了。

3. 從機字節控制模式(通常SMBus模式下才使用)

從設備可以對每個收到的字節進行應答控制。

所需配置:SCTRL=1&RLDEN=1&STRETCH=0&CNT≥1

從機字節控制流程:

1) 每收到一個字節TCRLD置位,時鐘延展於第8和第9個脈沖之間

2) 軟件讀取RXDT中的值,並決定是否置位ACK

3) 軟件重裝載CNT=1來停止時鐘延展

4) 應答或非應答信號在第9個脈沖時刻出現在總線上

註意:

置位SCTRL時,必須開啟時鐘延展,即STRETCH=0

CNT可以是大於1的值,來實現多個字節以自動ACK接收完畢後再啟動應答控制,從設備發送時推薦關閉SCTRL,此時無需字節應答控制。

二、從機通信初始化軟件接口

從機通信初始化所用到的軟件接口通過獨立的函數接口實現,如下:

i2c_own_address1_set函數用於配置OADDR1地址模式以及ADDR1地址值。

i2c_own_address2_set函數用於配置ADDR2地址值以及ADDR2屏蔽位。

i2c_own_address2_enable函數用於使能ADDR2地址。


i2c_slave_data_ctrl_enable函數用於使能從機字節控制模式。

i2c_clock_stretch_enable函數用於使能從機時鐘延展功能。

i2c_reload_enable函數用於使能發送數據重載模式。

三、從機發送流程

1) 響應主機地址,匹配時回復ACK;

2) TXDT為空時,置位TDIS,從設備寫入發送數據;

3) 每發送一個字節會收到ACK,且置位TDIS;

4) 如果收到NACK位:

  • 置位NACKF,產生中斷;
  • 從設備自動釋放SCL和SDA(以便主設備發送STOP或RESTART);

5) 如果收到STOP位:

  • 置位STOPF,產生中斷;

當從機發送開啟時鐘延展(STRETCH=0)時,在等待ADDRF標志時和發送前一個數據的第9個時鐘脈沖後,會把TXDT中的數據拷貝到移位寄存器中,如果此時TDIS還是置位,表示TXDT沒有寫進待發送數據,將發生時鐘延展,如下流程圖:

圖10. I2C從機發送流程圖

需要註意的是,在時鐘延展關閉(STRETCH=1)的情況下,如果在將要傳輸數據的第一個Bit位開始發送之前,也就是SDA邊沿產生之前,如果數據還未寫入TXDT數據寄存器,那麼會發生欠載錯誤,此時I2C_STS的OUF將會置1,並將0xFF發送到總線。

為了能及時的寫入數據,可以在通信開始前,先將數據寫入到DT寄存器:軟件先將TDBE置1,目的是為了清空TXDT寄存器的數據,然後將第一個數據寫入TXDT寄存器,此時TDBE清零。

圖11. I2C從機發送時序圖

四、從機發送流程軟件接口

從機發送通過獨立的函數接口實現,如下:

i2c_slave_transmit函數為i2c_application.c文件所提供的應用層接口函數,參數包括:I2C結構體指針、發送數據指針、發送數據字節數和函數超時時間。

註:此函數為Artery所提供的標準從機發送函數。用戶也可根據前述從機發送流程,自行編寫從機發送函數。

五、從機接收流程

1) 當收到數據後,RDBF=1,讀取RXDT數據寄存器,RDBF被自動清零;

2) 重復步驟2直到所有數據接收完成;

3) 等待收到STOP條件,當收到STOP條件時,I2C_STS的STOPF置1,將I2C_CLR的STOPC寫1,清除STOPF標志,傳輸結束。

圖12. I2C從機接收流程圖

圖13. I2C從機接收時序圖

六、從機接收流程軟件接口

從機接收通過獨立的函數接口實現,如下:

i2c_slave_receive函數為i2c_application.c文件所提供的應用層接口函數,參數包括:I2C結構體指針、接收數據指針、接收數據字節數和函數超時時間。

註:此函數為Artery所提供的標準從機接收函數。用戶也可根據前述從機接收流程,自行編寫從機接收函數。

喚醒深睡眠模式

F423上有3個I2C,其中隻有I2C1支持在被尋址到時將系統從深睡眠模式(DEEPSLEEP)喚醒。使用此功能的配置步驟:

1) 使能I2C喚醒深睡眠模式功能(I2C1_CTRL1的WAKEUPEN位置1)

2) 數字濾波器值設置為0(I2C1_CTRL1的DFLT位設為0)

3) 開啟時鐘延展模式(I2C1_CTRL1的STRETCH位設為0)

4) I2C時鐘選擇HICK(CRM_MISC2的I2C1SEL位)

關於F423喚醒深睡眠模式更多詳細信息請參考《
AN0163_AT32F423_PWC_Application_Note》

I2C配置工具

功能簡介

I2C配置工具
Artery_I2C_Timing_Configuration.exe可以實現對主機和從機的時鐘、數字濾波、模擬濾波配置。

資源準備

1) 軟件環境
Artery_I2C_Timing_Configuration.exe

圖14. Artery I2C Timing Configuration

使用步驟

1) 選擇芯片型號

選擇當前使用的芯片型號,例如可以選擇AT32F423。

2) 選擇設備模式

  • Master:主模式,I2C作為主機;
  • Slave:從模式,I2C作為從機。

3) 選擇I2C速度模式

  • Standard-mode:標準模式,范圍0~100kHz;
  • Fast-mode:快速模式,范圍0~400kHz;
  • Fast-mode Plus:增強快速模式,范圍0~1000kHz。

4) 設置I2C速度(單位kHz)

根據實際需求設置I2C通信速度,例如需要通信速度為10kHz,那麼這裡設置為10。

5) 設置I2C時鐘源頻率(單位kHz)

根據實際使用的I2C時鐘源頻率來配置,例如AT32F423 I2C時鐘源為PCLK1,當AT32F423主頻為96MHz,APB1為96MHz時,這裡設置為96000。

6) 模擬濾波使能

  • On:打開;
  • Off:關閉。

模擬濾波使能後,將過濾50ns以下的脈沖。

7) 數字濾波(范圍0~15)

數字濾波時間=數字濾波值x TI2C_CLK;

其中TI2C_CLK=1/I2C時鐘源頻率。

當值為0時,數字濾波關閉,當值>0時將過濾小於數字濾波時間的脈沖。

8) 上升時間(tr單位ns)

SCL和SDA總線的上升沿,如圖18所示。I2C協議中規定了在標準模式(Standard-mode)、快速模式(Fast-mode)、增強快速模式(Fast-mode Plus)下的范圍,詳情請參照表1。上升時間和上拉電阻的阻值關系很大,上拉電阻越小,上升時間越短,可以支持的通信速度就越快,但是功耗也越高。

表2中給出了一些常用上拉電阻阻值所對應的上升沿時間,實際可能會因為總線掛的設備數量、佈線等差異而有所不同,僅供參考。

9) 下降時間(tf單位ns)

SCL和SDA總線的下降沿,如圖18所示。I2C協議中規定了在標準模式(Standard-mode)、快速模式(Fast-mode)、增強快速模式(Fast-mode Plus)下的范圍,詳情請參照表1。

圖15. 上升沿(tr)下降沿(tf)規范

表1. I2C時間規范

表2. 常用上拉電阻阻值的tr、tf參考值(VDD=3.3V)

註:該值是總線上連接兩片AT32 MCU,一個作為主機,一個作為從機測試出來的值,實際可能會因為總線掛的設備數量、佈線等差異而有所不同。

10) 產生代碼

點擊產生代碼,上訴配置的值,將會以代碼的形式產生出來,如下圖紅框所示,隻需要將右側輸出的代碼替換到自己的程序即可。

圖16. 代碼產生