一、概述:
雅特力 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 ) 軟體開發環境如下列網址所示
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 到 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
圖 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 )
- i2c_status_type i2c_status : 宣告一參數格式為 i2c_status_type i2c,主要用來判斷後續 I2C function 執行時的狀態,參數架構如圖 14
圖 13
圖 14
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
圖 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
圖 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 功能
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 )
圖 27
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
將 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 功能
圖 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 )
圖 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 功能
6.3 i2c_enable 如圖 45,啟動 I2C 功能
hi2c->pbuff = pdata : 指定 I2C 傳輸的 buffer
hi2c->pcount = size : 指定 I2C 傳輸的 size
圖 48
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 傳送
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 )
五、附录:
註 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