AT32F405 系列 I2C 參數定解析與實作

一、概述:

雅特力 AT32F405 是一款高效能的 32 位元 ARM Cortex-M4 微控制器,它具有高達216 MHz 的 CPU 運算速度,並擁有 256 KB 的 Flash 和 102 KB 的SRAM,同時整合了獨立的 HS USB OTG 和 FS USB OTG,分別帶有內建的 PHY。此外,它還具備 1 組 QSPI、1 組 CAN 總線、8 個 UART、3 個 SPI / I²S 和1 個獨立全雙工 I²S、3 個 I²C、1 個 16 位高級定時器、7 個 16 位通用定時器、1 個 32 位元通用定時器和 2 個 16 位元基本定時器。它也擴展了一個 12 位元 16 通道高速 ADC,最高取樣率可達 2 Msps。幾乎所有的 I/O 口都能容忍 5 V  輸入訊號,並且支援多種連接埠重映射。

AT32F405 適用於工業級溫度範圍 – 40 ~ 105 °C,並提供多種封裝類型供選擇,包括 LQFP64、LQFP48、QFN48 和 QFN32 等。 它內建了 HS + FS OTG 功能,非常適合電競市場、工業自動化、USB週邊、物聯網和消費性電子等高運算和高速 USB 應用需求的設計。


圖 1 ( 註 1 )

而本章節將簡介到的 I2C 是一種串列通訊協議,用於在積體電路之間進行短距離的資料傳輸,它使用兩根線進行通信,支援多主設備和多從設備的連接,I2C 通訊包括開始訊號、位址傳輸、資料傳輸和停止訊號,它具有簡單、靈活和可靠的特點,被廣泛使用於主設備與從設備的通訊上,例如感測器、記憶體、顯示器、電源管理等。它具有簡單、靈活和可靠的特點,適用於短距離的通訊需求。

針對 I2C 協議網路上有許多文章已經有詳細介紹到,本章節將集中在雅特力所提供 AT32F405 SDK的 I2C 章節進行使用解析。


二、 需求物件:

        2.1 硬體

                2.1.1 Artery AT-START-F405 V1.0 EVK 詳細規格如下列網址所示

   https://www.arterytek.com/en/product/AT32F405.jsp

                2.1.2 Type A to CUSB Cable : 1 pcs

        2.2 軟體

                2.2.1 Keil ( IDE ) 軟體開發環境如下列網址所示

   https://www.keil.com/product/

2.2.2 Artery AT32F402_405 SDK 原廠提供的 AT-START-F405 V1.0 EVK Sample Code 如下列網址所示

                       https://www.arterychip.com/en/product/AT32F405.jsp

三、 操作方式:

3.1 先將 USB cable 的 Type C 端與 AT-START-F405 V1.0 EVK 的 CN6 對接上( 如圖 2 ),CN 6 為 EVK on board 的燒錄 IC 的 connector,同時也會對 EVK 進行供電


圖 2 ( 註 1 )

3.2 到 Artery 官網下載 AT32F405 針對 Keil 的 MDK 檔 ( 如圖 3 ),下載完畢後進行安裝

      https://www.arterytek.com/cn/product/AT32F405.jsp#Resource

圖 3

3.3 到 Artery 官網下載 AT32F402_405 SDK,下載完畢後進行解壓縮 ( 如圖 4 )


圖 4

3.4 解壓縮完畢後尋找以下路徑

…\AT32F402_405_Firmware_Library_V2.0.4\project\at_start_f405\examples\i2c\communication_poll\mdk_v5

而後執行 “ communication_poll “ ( 如圖 5 )


圖 5

3.5 開啟後點選圖 6 紅框


圖 6

        彈出 Options 視窗,並在 device 分頁下確認 IC 為 AT32F405RCT7 ( 如圖 7 )


圖 7

        而後切到 Target 分頁,將 ARM Complier 調整為 V6.21  ( 如圖 8 ),而後點選 OK 完成設定


圖 8

3.6 點選 Rebuild 進行編譯  ( 如圖 9 )


圖 9

3.7 點選 Download  ( 如圖 10 ) 將編譯完成的 Code 燒錄到 AT32F405 上


圖 10

3.8 在 readme 文件中可查閱到 SDK 將 EVK 上的 PB6 定義為 SCL、PB7 定義為 SDA ( 如圖 11 )


圖 11

3.9 可以使用示波器來量測 SCL、SDA 訊號,腳位分布在圖 12 的 EVK 上


圖 12

四、SDK 參數解析:

開啟 “ communication_poll “ 點選 main.c,並搜尋 main function ( 如圖 13 )

  1. i2c_status_type i2c_status : 宣告一參數格式為 i2c_status_type i2c,主要用來判斷後續 I2C function 執行時的狀態,參數架構如圖 14

圖 13


圖 14

2. 本章節僅敘述 I2C 的參數 system_clock_config ( 如圖 15、16 ) 的部分這邊只提出幾項重點解說如下:

圖 15
圖 16

2.1 設定 PLL 的相關參數 ( 如圖 17 ):

  • PLL Source 來源設定為 HEXT,HEXT 為外部石英震盪器為 12 MHZ
  • 對照 SDK 中的計算式可以算出 PLL 設定為 216 MHZ ( 如圖 18 ),算式如下:

pll_rcs_freq = HEXT = 12 MHZ

pll_ns = 72

pll_ms = 1

pll_fr_n = 4

pll clock = ( 12 MHZ x 72 ) / ( 1 x 4 ) = 216 MHZ

圖 17

圖 18

2.2 將 APB2 參數時鐘來源設定為 pll clock,並設定 DIV 參數為 1,因此 APB2 clock 為 216 MHZ ( 如圖 19 )

2.3 將 APB1 參數時鐘來源設定為 pll clock,並設定 DIV 參數為 2,因此 APB1 clock 為 108 MHZ


圖 19

2.4 將 system clock source 設定為 pll clock  216 MHZ ( 如圖 20 )

圖 20

3. nvic_priority_group_config function 為設定中斷使用的 code,該範例不會使用到中斷功能,因此不解說

4. at32_board_init 用來設定 systick delay time、EVK 上 button、LED 的相關 function ( 如圖 21 ),解說如下:


圖 21

4.1 delay_init function ( 如圖 22 ) 解析如下:

4.1.1 systick_clock_source_config : 將 systick 的 clock source 設定為 AHBCLK ( 216 MHZ )

同時宣告 2 參數為 fac_us ( 216 )、fac_ms ( 216000 ),而後參數 fac_us 會被帶入圖 23 的 function 中

4.1.2 將參數 fac_us 作為 systick 的 LOAD參數,並將 VAL 參數歸 0,而後透過 CTRL register 最 enable 啟動systick 計數

4.1.3 再透過 do while 迴圈做 time delay 功能

4.1.4 delay 完畢後關閉 systick 計數,並將 VAL 參數歸 0,完成簡易的 time delay 功能

圖 22

圖 23

4.2 at32_led_init ( 如圖 24 ) 解析如下:

4.2.1 gpio_init_type gpio_init_struct : 宣告一參數格式為 gpio_init_type,用來作為後續 gpio init 時所需參數的變數空間,參數架構如圖 25

4.2.2 crm_periph_clock_enable : 啟動 LED GPIO Port 的 Clock

4.2.3 gpio_default_para_init : 取得 default 的 GPIO 參數,並將參數值放置到 gpio_init_struct 變數中,取得的參數如圖 26

4.2.4 針對想設定的 Pin Port 進行個別的參數設定,解析如下:

GPIO_DRIVE_STRENGTH_STRONGER : 將參數設定為 Large sourcing/sinking strength,實際細節可參閱 AT32F405/402 Series Datasheet Table 37

  GPIO_OUTPUT_PUSH_PULL : 將 GPIO 參數設定為 PUSH PULL

  GPIO_MODE_OUTPUT : 將 GPIO 模式設定為 OUTPUT

led_gpio_pin[led] : 透過 led_gpio_pin Table list 選擇對應的 GPIO Pin ( 如圖 27 )

GPIO_PULL_NONE : 將 GPIO Pull up and down 參數設定為 no Pull up or Pull down

gpio_init function:將 gpio_init_struct 的參數設定到 GPIO 的 Port 中,led_gpio_port  ( 如圖 27 )

圖 24
圖 25
圖 26



圖 27
5. i2cx = I2Cx_PORT 解析:

hi2cx 的結構式被宣告為 i2c_handle_type,而 i2c_handle_type 結構式如圖 28

hi2cx.i2cx = I2Cx_PORT:其中 i2cx 宣告為 I2Cx_PORT,對應 main code 中的 define I2Cx_PORT 被宣告為 I2C1,表示 SDK 範例中使用到的 I2C 為 AT32F405 的第 1 組 I2C


圖 28

6. i2c_config function 解析:

將 hi2cx 參數帶入i2c_config function 中,可查看到圖 29 的其他 function,解析如下:

6.1 i2c_reset : 將 hi2c->i2cx 參數帶到 i2c_reset 中,function 會取得 CRM_I2C1_PERIPH_RESET 參數 ( 如圖 30 ),而後帶入 crm_periph_reset function 中

6.1.1 CRM_I2C1_PERIPH_RESET 參數為 MAKE_VALUE(0x20, 21) ( 如圖 31 ),而計算後得到 0x00200015 值

6.1.2 將 CRM_I2C1_PERIPH_RESET 參數 0x00200015 帶回 crm_periph_reset,參數會再帶到 CRM_REG 與 CRM_REG_BIT 中  ( 如圖 32 )

6.1.3 查閱到 CRM_REG 會帶到 PERIPH_REG 中,將參數 0x00200015 帶入,得到 CRM_BASE ( 0x40023800 ) + 0x20 ( 如圖 33 ),參數 0x00200015  帶到 CRM_REG_BIT 得到 0x200000,對應圖 34、35 得到 I2C1 reset 功能

圖 29

圖 30
圖 31
圖 32

圖 33

圖 34 ( 註 2 )


圖 35  ( 註 3 )

6.2 查看 i2c_lowlevel_init function ( 如圖 36 ),本章節針對 I2C 的 register 設定進行解析,GPIO 的部分會簡易帶過,解析如下:

          6.2.1 開啟 I2C1、GPIO_SCL、GPIO_SDA Port 的 Clock

          6.2.2 將 GPIO_SCL、GPIO_SDA 設定到Pin mux 中

          6.2.3 將 GPIO_SCL、GPIO_SDA 設定到 Pin 中

          6.2.4 查看 i2c_init function ( 如圖 37 ) :

i2c_x->ctrl1_bit.i2cen = FALSE : 設定 I2C 參數前先確認 I2C 功能已關閉  ( 如圖 38 )

i2c_x->clkctrl = clk : 將參數 clk 設定到 I2C IP 中,SDK clk 參數為 0x90F03030,經過換算與排列 ( 如圖 39 ),狀態如下:

        DIVL = 0x9

        DIVH = 0

SCLD = 0xF

SDAD = 0

SCLH = 0x30

SCLL = 0x30

查看到 AT32F402/405 Series Reference Manual 的 Fig 11-3 ( 如圖 40 ),可得知 I2C 的通訊時脈可透過 SCLH、SCLL 進行設定,並將上述參數帶到 AT32F402/405 Series Reference Manual Page 145、146 中的公式進行解析  ( 如圖 41、42 ),可得到 I2C 的通訊時脈約為 95.2 kHz

i2c_x->ctrl1_bit.dflt = dfilters : 將參數 0xF 帶到 I2C register 中 ( 如圖 43 )

圖 36
圖 37


圖 38  ( 註 4 )


圖 39  ( 註 5 )


圖 40  ( 註 6 )


圖 41  ( 註 7 )


圖 42  ( 註 7 )


圖 43  ( 註 4 )

6.2.5 i2c_own_address1_set 解析如下 ( 圖 44 ):

i2c_x->oaddr1_bit.addr1mode = mode : I2C 的 address mode 設定為7BIT

i2c_x->oaddr1_bit.addr1 = address & 0x03FF : 設定 AT32F405 自己的 address 為 0xA0

i2c_x->oaddr1_bit.addr1en = TRUE : 開啟 AT32F405 address 功能

圖 44

6.3 i2c_enable 如圖 45,啟動 I2C 功能

圖 45  ( 註 4 )

6.4 at32_button_press : 這邊會等待 USER_BUTTON ( EVK 上的B2 ) 被按壓,在沒被按壓的情況下,程式不會往下執行 ( 如圖 46 )
6.5 i2c_master_transmit 解析如下 :

hi2c->pbuff = pdata : 指定 I2C 傳輸的 buffer

hi2c->pcount = size : 指定 I2C 傳輸的 size

6.5.1 i2c_wait_flag 解析如下 ( 如圖 47 ) : 將 I2C_BUSYF_FLAG 帶入,如果執行 i2c_master_transmit 的當下,i2c_flag_get 到的狀態如果為 busy 時,則執行 while 迴圈進行 timeout 等待,但如果 timeout 值被扣到 0 時,則會進行 timeout error code return ( 如圖 48 );else 的部分因為目前狀態不會執行因此不解析

6.5.2 i2c_start_transfer解析如下 ( 如圖 49、50 ) : 將 hi2c->pcount 設定到 hi2c->psize,並執行 i2c_transmit_set,設定一變數 temp,並將 I2C_CTRL2 的參數複製到 temp 中,並將 temp 除了 ADDR10、READH10、NACKEN、PECTEN 以外的參數規 0,再把 address、rld_stop、start、cnt 參數設定到 temp 中,而後 update 到 I2C_CTRL2 中

圖 46
圖 47


圖 48

圖 49
圖 50

6.5.3 hi2c->pcount 大於 0 時會持續進行 I2C 傳輸 ( 如圖 51 ),解析如下 :

6.5.3.1 與步驟 6.5.1 相同

6.5.3.2 將 hi2c->pbuff 設定到 I2C_TXDT 中,並將 hi2c->psize 與 hi2c->pcount 遞減一

6.5.3.3 當 hi2c->psize 與 hi2c->pcount 與設定不符時會停止 I2C 傳送

圖 51

6.5.3.4 與步驟 6.5.1 相同

6.5.3.5 清除 I2C 傳輸完成的 flag

6.5.3.6 清除 I2C _CTRL2 的 saddr、readh10、cnt、rlden、dir register ( 如圖 53 )

圖 52
圖 53

6.6 i2c_master_receive 程式內碼解析方式與 i2c_master_transmit 相同,後續就不做解析,後續的 code 會做傳輸與接收 buffer 的比較,礙於沒有 device 可以做通訊 DEMO 因此 buffer 的比較部分部解析。
圖 54

五、附录:

註 1:作者:Artery Technology;出處:Artery 文件 AN0184 的 Fig.1

註 2:作者:Artery Technology;出處:Artery 文件 AT32F402_405 Series Reference Manual 的 Table 4-1

註 3:作者:Artery Technology;出處:Artery 文件 AT32F402_405 Series Reference Manual 的 Page 67

註 4:作者:Artery Technology;出處:Artery 文件 AT32F402_405 Series Reference Manual 的 Page 166

註 5:作者:Artery Technology;出處:Artery 文件 AT32F402_405 Series Reference Manual 的 Page 168

註 6:作者:Artery Technology;出處:Artery 文件 AT32F402_405 Series Reference Manual 的 Figure 11-3

註 7:作者:Artery Technology;出處:Artery 文件 AT32F402_405 Series Reference Manual 的 Page 145、146

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能