I2C接口是由數(shù)據(jù)線SDA和時鐘線SCL構成,在標準模式下通信速度可達到100kHz,快速模式下則可以達到400kHz,增強快速模式可達到1MHz。一幀數(shù)據(jù)傳輸從開始信號開始,在結束信號后停止,在收到開始信號后總線被認為是繁忙的,當收到結束信號后,總線被認為再次空閑。I2C接口具有主機和從機模式、多主機功能、可編程建立和保持時間、時鐘延展功能、DMA存取數(shù)據(jù)、支持SMBus 2.0協(xié)議等特點。
圖1. I2C框圖
I2C接口通信
主機通信流程
主機通信初始化
1. 主機時鐘初始化 在啟動外設(I2CEN)之前,必須先設置I2Cx_CLKCTRL寄存器的各個位用以配置I2C主時鐘。 ― DIV[7:0]:I2C時鐘分頻 ― SDAD[3:0]:數(shù)據(jù)保持時間(tHD;DAT) ― SCLD[3:0]:數(shù)據(jù)建立時間(tSU;DAT) ― SCLH[7:0]:SCL高電平時間 ― SCLL[7:0]:SCL低電平時間 該寄存器的配置可以使用Artery_I2C_Timing_Configuration時鐘配置工具計算,見第三章節(jié)。 低電平控制:當檢測到SCL總線為低電平時,內部SCLL計數(shù)器開始計數(shù),當計數(shù)值達到SCLL值時,釋放SCL線,SCL線變?yōu)楦唠娖健?高電平控制:當檢測到SCL總線為高電平時,內部SCLH計數(shù)器開始計數(shù),當計數(shù)值達到SCLH值時,拉低SCL線,SCL線變?yōu)榈碗娖剑斣诟唠娖狡陂g,如果被外部總線拉低,那么內部SCLH計數(shù)器停止計數(shù),并開始低電平計數(shù),這為時鐘同步提供了條件。
圖2. 主機時鐘的產生
2. 主機通信初始化
在啟動通訊前須先設定I2C_CTRL2寄存器中的幾項參數(shù): 1) 設置傳輸字節(jié)數(shù) ― ≤255字節(jié)
配置I2C_CTRL2的RLDEN=0,關閉重載模式
配置I2C_CTRL2的CNT[7:0]=N
― >255字節(jié)
配置I2C_CTRL2的RLDEN=1,使能重載模式
配置I2C_CTRL2的CNT[7:0]=255
剩余傳輸字節(jié)數(shù)N=N-255
2) 設置傳輸結束模式 ― ASTOPEN=0:軟件結束模式,當數(shù)據(jù)傳輸完成后,I2C_STS的TDC標志置1,軟件設置GENSTOP=1或者GENSTART=1,發(fā)送STOP條件或者START條件。 ― ASTOPEN=1:自動結束模式,當數(shù)據(jù)傳輸完成后,自動發(fā)送STOP條件。 3) 設置從機地址 ― 設置尋址的從機地址值(I2C_CTRL2的SADDR) ― 設置從機地址模式(I2C_CTRL2的ADDR10)
ADDR10=0:7位地址模式
ADDR10=1:10位地址模式
4) 設置傳輸方向(I2C_CTRL2的DIR) ― DIR=0:主機接收數(shù)據(jù) ― DIR=1:主機發(fā)送數(shù)據(jù) 5) 開始傳輸 設置I2C_CTRL2的GENSTART=1,主機開始在總線上發(fā)送START條件和從機地址。
3. 主機10 bits尋址的特殊時序初始化
在10位地址傳輸模式下,I2C_CTRL2的READH10用于產生特殊時序,當READH10=1時,支持如下傳輸序:主機先發(fā)送數(shù)據(jù)給從機,然后再從從機讀取數(shù)據(jù),傳輸時序圖如下圖所示:
圖3. 10位地址的讀訪問READH10=1
主機在軟件結束模式(ASTOPEN=0)下,發(fā)送數(shù)據(jù)到從機,當數(shù)據(jù)發(fā)送完成后設置READH10=1,然后再從從機接收數(shù)據(jù)。
圖4. 10位地址的讀訪問READH10=0 ? ?
主機通信初始化軟件接口
主機通信初始化所用到的軟件接口通過獨立的函數(shù)接口實現(xiàn),如下:
i2c_init函數(shù)三個參數(shù)分別為:所使用的I2C、數(shù)字濾波值和主機時鐘配置值。 i2c_transmit_set函數(shù)用于初始化通信參數(shù),包括:所使用的I2C、從機地址、傳輸字節(jié)數(shù)、停止條件產生模式和起始條件產生模式。 i2c_addr10_mode_enable函數(shù)用于使能10位地址模式。 i2c_addr10_header_enable函數(shù)用于使能10位地址頭讀取時序,即主機發(fā)送完整的10位從機地址讀序列或主機只發(fā)送10位地址的前7位。
主機發(fā)送流程
1) I2C_TXDT數(shù)據(jù)寄存器為空,I2C_STS的TDIS=1; 2) 向TXDT數(shù)據(jù)寄存器寫入數(shù)據(jù),數(shù)據(jù)開始發(fā)送; 3) 重復1、2步驟直到發(fā)送CNT[7:0]個數(shù)據(jù); 4) 如果此時I2C_STS的TCRLD=1(重載模式),分為以下兩種情況: ― 剩余字節(jié)數(shù)N>255:向CNT寫入255,N=N-255,TCRLD被自動清0,傳輸繼續(xù); ― 剩余字節(jié)數(shù)N≤255:關閉重載模式(RLDEN=0),向CNT寫入N,TCRLD被自動清0,傳輸繼續(xù)。 5) 結束時序 ― 停止條件產生:
軟件結束模式(ASTOPEN=0):此時I2C_STS的TDC置1,設置GENSTOP=1產生STOP條件;
自動結束模式(ASTOPEN=1):自動產生STOP條件。
― 等待產生STOP條件,當STOP條件產生時,I2C_STS的STOPF置1,將I2C_CLR的STOPC寫1,清除STOPF標志,傳輸結束。
圖5. I2C主機發(fā)送流程圖
圖6. I2C主機發(fā)送時序圖 ? ?
主機發(fā)送流程軟件接口
主機發(fā)送通過獨立的函數(shù)接口實現(xiàn),如下:
i2c_master_transmit函數(shù)為i2c_application.c文件所提供的應用層接口函數(shù),參數(shù)包括:I2C結構體指針、從機地址、發(fā)送數(shù)據(jù)指針、發(fā)送數(shù)據(jù)字節(jié)數(shù)和函數(shù)超時時間。 注:此函數(shù)為Artery所提供的標準主機發(fā)送函數(shù)。用戶也可根據(jù)前述主機發(fā)送流程,自行編寫主機發(fā)送函數(shù)。
主機接收流程
1) 當收到數(shù)據(jù)后,RDBF=1,讀取RXDT數(shù)據(jù)寄存器,RDBF被自動清零; 2) 重復步驟2直到接收CNT[7:0]個數(shù)據(jù); 3) 如果此時I2C_STS的TCRLD=1(重載模式),分為以下兩種情況: ― 剩余字節(jié)數(shù)N>255:向CNT寫入255,N=N-255,TCRLD被自動清0,傳輸繼續(xù); ― 剩余字節(jié)數(shù)N≤255:關閉重載模式(RLDEN=0),向CNT寫入N,TCRLD被自動清0,傳輸繼續(xù)。 4) 當在接收到最后一個字節(jié)時,主機會自動發(fā)送一個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標志,傳輸結束。
圖7. I2C主機接收流程圖
圖8. I2C主機接收時序圖 ? ?
主機接收流程軟件接口
主機接收通過獨立的函數(shù)接口實現(xiàn),如下:
i2c_master_receive函數(shù)為i2c_application.c文件所提供的應用層接口函數(shù),參數(shù)包括:I2C結構體指針、從機地址、接收數(shù)據(jù)指針、接收數(shù)據(jù)字節(jié)數(shù)和函數(shù)超時時間。 注:此函數(shù)為Artery所提供的標準主機接收函數(shù)。用戶也可根據(jù)前述主機接收流程,自行編寫主機接收函數(shù)。
從機通信流程
從機通信初始化
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中斷狀態(tài)標志會被置1,如果ADDRIEN位為1,就會產生一個中斷。如果兩個從地址都使能,在地址匹配產生ADDR中斷時,可以查看狀態(tài)寄存器中的ADDR[6:0]來得知是OADDR1還是OADDR2被尋址了。
3. 從機字節(jié)控制模式(通常SMBus模式下才使用)
從設備可以對每個收到的字節(jié)進行應答控制。 所需配置:SCTRL=1&RLDEN=1&STRETCH=0&CNT≥1 從機字節(jié)控制流程: 1) 每收到一個字節(jié)TCRLD置位,時鐘延展于第8和第9個脈沖之間 2) 軟件讀取RXDT中的值,并決定是否置位ACK 3) 軟件重裝載CNT=1來停止時鐘延展 4) 應答或非應答信號在第9個脈沖時刻出現(xiàn)在總線上 注意: 置位SCTRL時,必須開啟時鐘延展,即STRETCH=0 CNT可以是大于1的值,來實現(xiàn)多個字節(jié)以自動ACK接收完畢后再啟動應答控制,從設備發(fā)送時推薦關閉SCTRL,此時無需字節(jié)應答控制。
從機通信初始化軟件接口
從機通信初始化所用到的軟件接口通過獨立的函數(shù)接口實現(xiàn),如下:
i2c_own_address1_set函數(shù)用于配置OADDR1地址模式以及ADDR1地址值。 i2c_own_address2_set函數(shù)用于配置ADDR2地址值以及ADDR2屏蔽位。 i2c_own_address2_enable函數(shù)用于使能ADDR2地址。 i2c_slave_data_ctrl_enable函數(shù)用于使能從機字節(jié)控制模式。 i2c_clock_stretch_enable函數(shù)用于使能從機時鐘延展功能。 i2c_reload_enable函數(shù)用于使能發(fā)送數(shù)據(jù)重載模式。
從機發(fā)送流程
1) 響應主機地址,匹配時回復ACK; 2) TXDT為空時,置位TDIS,從設備寫入發(fā)送數(shù)據(jù); 3) 每發(fā)送一個字節(jié)會收到ACK,且置位TDIS; 4) 如果收到NACK位:
— 置位NACKF,產生中斷;
— 從設備自動釋放SCL和SDA(以便主設備發(fā)送STOP或RESTART);
5) 如果收到STOP位:
— 置位STOPF,產生中斷;
當從機發(fā)送開啟時鐘延展(STRETCH=0)時,在等待ADDRF標志時和發(fā)送前一個數(shù)據(jù)的第9個時鐘脈沖后,會把TXDT中的數(shù)據(jù)拷貝到移位寄存器中,如果此時TDIS還是置位,表示TXDT沒有寫進待發(fā)送數(shù)據(jù),將發(fā)生時鐘延展,如下流程圖:
圖9. I2C從機發(fā)送流程圖
需要注意的是,在時鐘延展關閉(STRETCH=1)的情況下,如果在將要傳輸數(shù)據(jù)的第一個Bit位開始發(fā)送之前,也就是SDA邊沿產生之前,如果數(shù)據(jù)還未寫入TXDT數(shù)據(jù)寄存器,那么會發(fā)生欠載錯誤,此時I2C_STS的OUF將會置1,并將0xFF發(fā)送到總線。 為了能及時的寫入數(shù)據(jù),可以在通信開始前,先將數(shù)據(jù)寫入到DT寄存器:軟件先將TDBE置1,目的是為了清空TXDT寄存器的數(shù)據(jù),然后將第一個數(shù)據(jù)寫入TXDT寄存器,此時TDBE清零。
圖10. I2C從機發(fā)送時序圖 ?
從機發(fā)送流程軟件接口
從機發(fā)送通過獨立的函數(shù)接口實現(xiàn),如下:
指針、發(fā)送數(shù)據(jù)指針、發(fā)送數(shù)據(jù)字節(jié)數(shù)和函數(shù)超時時間。 注:此函數(shù)為Artery所提供的標準從機發(fā)送函數(shù)。用戶也可根據(jù)前述從機發(fā)送流程,自行編寫從機發(fā)送函數(shù)。
從機接收流程
1) 當收到數(shù)據(jù)后,RDBF=1,讀取RXDT數(shù)據(jù)寄存器,RDBF被自動清零; 2) 重復步驟2直到所有數(shù)據(jù)接收完成; 3) 等待收到STOP條件,當收到STOP條件時,I2C_STS的STOPF置1,將I2C_CLR 的STOPC寫1,清除STOPF標志,傳輸結束。
圖11. I2C從機接收流程圖
圖12. I2C從機接收時序圖 ? ?
從機接收流程軟件接口
從機接收通過獨立的函數(shù)接口實現(xiàn),如下:
i2c_slave_receive函數(shù)為i2c_application.c文件所提供的應用層接口函數(shù),參數(shù)包括:I2C結構體指針、接收數(shù)據(jù)指針、接收數(shù)據(jù)字節(jié)數(shù)和函數(shù)超時時間。 注:此函數(shù)為Artery所提供的標準從機接收函數(shù)。用戶也可根據(jù)前述從機接收流程,自行編寫從機接收函數(shù)。
I2C配置工具
功能簡介
I2C配置工具Artery_I2C_Timing_Configuration.exe可以實現(xiàn)對主機和從機的時鐘、數(shù)字濾波、模擬濾波配置。
資源準備
1) 軟件環(huán)境Artery_I2C_Timing_Configuration.exe 圖13. Artery I2C Timing Configuration ? ?
使用步驟
1) 選擇芯片型號 選擇當前使用的芯片型號,例如可以選擇AT32F435、AT32F437。 2) 選擇設備模式
Master:主模式,I2C作為主機;
Slave:從模式,I2C作為從機。
3) 選擇I2C速度模式
Standard-mode:標準模式,范圍0~100kHz;
Fast-mode:快速模式,范圍0~400kHz;
Fast-modePlus:增強快速模式,范圍0~1000kHz。
4) 設置I2C速度(單位kHz) 根據(jù)實際需求設置I2C通信速度,例如需要通信速度為10kHz,那么這里設置為10。 5) 設置I2C時鐘源頻率(單位kHz) 根據(jù)實際使用的I2C時鐘源頻率來配置,例如AT32435 I2C時鐘源為PCLK1,當AT32435主頻為288MHz,APB1為144MHz時,這里設置為144000。 6) 模擬濾波使能
On:打開;
Off:關閉。
模擬濾波使能后,將過濾50ns以下的脈沖。 7) 數(shù)字濾波(范圍0~15) 數(shù)字濾波時間=數(shù)字濾波值x TI2C_CLK; 其中TI2C_CLK=1/I2C時鐘源頻率。 當值為0時,數(shù)字濾波關閉,當值>0時將過濾小于數(shù)字濾波時間的脈沖。 8) 上升時間(tr單位ns) SCL和SDA總線的上升沿,如圖18所示。I2C協(xié)議中規(guī)定了在標準模式(Standard-mode)、快速模式(Fast-mode)、增強快速模式(Fast-mode Plus)下的范圍,詳情請參照表1。上升時間和上拉電阻的阻值關系很大,上拉電阻越小,上升時間越短,可以支持的通信速度就越快,但是功耗也越高。 表2中給出了一些常用上拉電阻阻值所對應的上升沿時間,實際可能會因為總線掛的設備數(shù)量、布線等差異而有所不同,僅供參考。 9) 下降時間(tf單位ns) SCL和SDA總線的下降沿,如圖18所示。I2C協(xié)議中規(guī)定了在標準模式(Standard-mode)、快速模式(Fast-mode)、增強快速模式(Fast-mode Plus)下的范圍,詳情請參照表1。 圖14.上升沿(tr)下降沿(tf)規(guī)范 表1. I2C時間規(guī)范
表2. 常用上拉電阻阻值的tr、tf參考值(VDD=3.3V)
注:該值是總線上連接兩片AT32 MCU,一個作為主機,一個作為從機測試出來的值,實際可能會因為總線掛的設備數(shù)量、布線等差異而有所不同。 10) 產生代碼 點擊產生代碼,上訴配置的值,將會以代碼的形式產生出來,如下圖紅框所示,只需要將右側輸出的代碼替換到自己的程序即可。 圖15.?代碼產生
? ?
案例 讀寫EEPROM
功能簡介
使用硬件I2C接口對EEPROM存儲設備進行讀寫訪問。
資源準備
1) 硬件環(huán)境 對應產品型號的AT-START BOARD 4.7K上拉電阻 EEPROM存儲設備 2) 軟件環(huán)境 projectat_start_f4xxexamplesi2ceeprom
軟件設計
1) 配置流程
開啟I2C外設時鐘
配置I2C所復用的GPIO
配置I2C所用的DMA通道
使能I2C外設接口
寫入EEPROM并讀取寫入的數(shù)據(jù)
比較讀寫數(shù)據(jù)內容是否正確
2)代碼介紹
main函數(shù)代碼描述
? ?
實驗效果
如若讀寫數(shù)據(jù)完全相同,則LED3會被點亮。
案例 輪詢方式通信
功能簡介
通過輪詢方式讓兩塊AT-START BOARD的I2C接口進行通信,測試作為主機或從機發(fā)送和接收數(shù)據(jù)。
資源準備
1) 硬件環(huán)境 對應產品型號的AT-START BOARD兩塊 4.7K上拉電阻 2) 軟件環(huán)境 projectat_start_f4xxexamplesi2ccommunication_poll
軟件設計
1) 配置流程
開啟I2C外設時鐘
配置I2C所復用的GPIO
使能I2C外設接口
從機準備接收數(shù)據(jù)
主機發(fā)送數(shù)據(jù)
從機準備發(fā)送數(shù)據(jù)
主機接收數(shù)據(jù)
主機從機對比發(fā)送和接收到的數(shù)據(jù)是否正確
2) 代碼介紹
main函數(shù)代碼描述
? ?
實驗效果
通過宏定義:#define MASTER_BOARD來選擇兩塊板子的主從關系;
如若主機或從機的讀寫數(shù)據(jù)完全相同,則LED3會被點亮,否則LED2會不停閃爍。
案例 中斷方式通信
功能簡介
通過中斷方式讓兩塊AT-START BOARD的I2C接口進行通信,測試作為主機或從機發(fā)送和接收數(shù)據(jù)。
資源準備
3) 硬件環(huán)境對應產品型號的AT-START BOARD兩塊 4.7K上拉電阻 4) 軟件環(huán)境 projectat_start_f4xxexamplesi2ccommunication_int
軟件設計
3) 配置流程
開啟I2C外設時鐘
配置I2C所復用的GPIO
使能I2C外設接口
使能I2C中斷
從機準備接收數(shù)據(jù)
主機發(fā)送數(shù)據(jù)
從機準備發(fā)送數(shù)據(jù)
主機接收數(shù)據(jù)
主機從機對比發(fā)送和接收到的數(shù)據(jù)是否正確
4) 代碼介紹
main函數(shù)代碼描述
主機中斷處理函數(shù)代碼描述
從機中斷處理函數(shù)代碼描述
實驗效果
通過宏定義:#define MASTER_BOARD來選擇兩塊板子的主從關系;
如若主機或從機的讀寫數(shù)據(jù)完全相同,則LED3會被點亮,否則LED2會不停閃爍。
案例 DMA方式通信
功能簡介
通過DMA方式讓兩塊AT-START BOARD的I2C接口進行通信,測試作為主機或從機發(fā)送和接收數(shù)據(jù)。
資源準備
5) 硬件環(huán)境 對應產品型號的AT-START BOARD兩塊 4.7K上拉電阻 6) 軟件環(huán)境 projectat_start_f4xxexamplesi2ccommunication_dma
軟件設計
5) 配置流程
開啟I2C外設時鐘
配置I2C所復用的GPIO
配置I2C所使用的DMA通道
使能I2C外設接口
從機準備接收數(shù)據(jù)
主機發(fā)送數(shù)據(jù)
從機準備發(fā)送數(shù)據(jù)
主機接收數(shù)據(jù)
主機從機對比發(fā)送和接收到的數(shù)據(jù)是否正確
6)代碼介紹
main函數(shù)代碼描述
主機DMA發(fā)送接收完成中斷處理函數(shù)代碼描述
? ?
實驗效果
通過宏定義:#define MASTER_BOARD來選擇兩塊板子的主從關系;
如若主機或從機的讀寫數(shù)據(jù)完全相同,則LED3會被點亮,否則LED2會不停閃爍。
審核編輯:湯梓紅
-
寄存器
+關注
關注
31文章
5401瀏覽量
122786 -
接口
+關注
關注
33文章
8885瀏覽量
152974 -
I2C
+關注
關注
28文章
1514瀏覽量
126524 -
AT32
+關注
關注
1文章
120瀏覽量
2498
原文標題:AT32講堂041 | AT32F435/437 I2C使用指南
文章出處:【微信號:AT32 MCU 雅特力科技,微信公眾號:AT32 MCU 雅特力科技】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
AT32F435/437系列安全庫區(qū)的應用原理、軟件使用方法及范例程序
AT32F435/437時鐘配置
如何提升AT32F435/437性能
AT32F435/437xx GPIO使用指南
AT32F435/437 OTGFS應用說明
AT32F435/437 DMA使用指南
AT32F435&AT32F437入門使用指南
雅特力AT32F435/437 OTGFS應用筆記

AT32講堂041 | AT32F435/437 I2C使用指南

雅特力AT32F435/F437入門使用指南

AT32F435 & AT32F437入門使用指南

評論