1. 簡介
S32k344 具有一個 FlexIO 模塊可以模擬成 SPI、I2C、UART 等通訊協議功能,本文將從時鐘配置、FlexIO 配置、FlexIO SPI 配置、主函數編寫與模擬調試等方面講解 S32K344 FlexIO 模擬 SPI 功能。本次應用講解使用 S32 Design Studio for S32 Platform 3.4 編譯軟體搭配 SW32K3_RTD_4.4_2.0.1_DS_updatesite_D2207 版本 RTD 進行演示組件配置與代碼生成編寫,若使用其他版本軟體或 RTD 將與本文演示有所區別。
2. 時鐘配置
FlexIO 模塊時鐘被鎖定於 AIPS_PLAT_CLK 時鐘源並不可分頻,AIPS_PLAT_CLK 時鐘由 PLL PHI0 時鐘或 FIRC 時鐘經過 1-8 次分頻產生,使用工程默認時鐘分配 FlexIO 模塊時鐘為 AIPS_PLAT_CLK 時鐘經過 2 次分頻產生為 80MHz。也可以根據實際需求通過圖形化更改時鐘源與分頻係數使用其他頻率時鐘。
圖2-1 FlexIO 時鐘圖
3. FlexIO 配置
3.1 簡介
FlexIO 模塊在 S32DS RTD 內分為多個組件 Flexio_Uart、Flexio_Spi、Flexio_Pwm、Flexio_I2c、Lin 等組件為 FlexIO 模塊可模擬的功能,其中 Flexio_Mcl_Ip 是 FlexIO 模塊的微控制器組件,該組件是使用 FlexIO 模塊的基礎使用 FlexIO 模塊時需要將添加該組件並配置相關引腳。
圖3.1-1 FlexIO 模塊組件配置圖
3.2 引腳配置
使用 FlexIO 模塊模擬 SPI 功能時需要將要使用的引腳配置成相應的 FlexIO 引腳功能。
圖3.2-1 FlexIO 模擬 SPI 引腳配置圖
以上配置將在工程內 board 文件夾下生成 Siul2_Port_Ip_Cfg.c、Siul2_Port_Ip_Cfg.h、Tspc_Port_Ip_Cfg.c 和 Tspc_Port_Ip_Cfg.h 文件。Port 模塊初始化所需要代碼生成在 Siul2_Port_Ip_Cfg.c 與 Siul2_Port_Ip_Cfg.h 文件內,其中 g_pin_mux_InitConfigArr0[NUM_OF_CONFIGURED_PINS0] 結構體為 Port 模塊初始化函數所需要變量,結構體內定義配置引腳的所有信息具體內容可在 Siul2_Port_Ip_Cfg.c 內查看。
圖3.2-2 Siul2_Port_Ip_Cfg.h
圖3.2-3 Siul2_Port_Ip_Cfg.c
3.3 Flexio_Mcl_Ip 組件配置
添加 Flexio_Mcl_Ip 組件進行配置後需要注意在 General 配置欄內將 Enable Flexio Common Support 功能勾選,不勾選該選項 FlexIO 模塊的通用配置將無法作用於其它模擬功能組件使功能無法正常工作。
圖3.3-1 Flexio_Mcl_Ip 組件 General 配置
FlexIO 模塊組件下 Specific Configuration 下 FlexioCommon 配置 FlexIO 模擬功能需要使用的引腳 Flexio Pin 即對應引腳配置中的 FlexIO 的通道,如不在此配置功能運行時將不會在配置的引腳產生輸出。
圖3.3-2 Flexio 引腳通道配置
圖3.3-3 Flexio 引腳通道配置
以上配置將會在工程內的 generate 內生成相應帶有 Flexio_Mcl 名稱的頭文件與源文件,其中 Flexio_Ip_xFlexioInit 為 Mcl 模塊初始化所需要的結構體文件與 Port 模塊相似結構體具體內容可在相應的源文件內查看。
圖3.3-4 Flexio_Mcl_Ip_Cfg.h
3.4 Flexio_Spi 組件配置
Flexio_Spi 組件配置中重要的為 SpiDriver 和 SpiGeneral 配置,其中 SpiDriver 配置 SPI 功能的波特率、片選、片選有效極性、空閒時鐘極性、數據寬度等 SPI 協議參數;SpiGeneral 配置所使用的 SPI 模塊、SPI 工作模式與 MCL 配置引腳鏈接到一起。
圖3.4-1 SpiDriver 配置
圖3.4-2 SpiGeneral 配置
圖3.4-3 更新生成代碼
以上配置將會在工程內 generate 文件夾中生成帶有 Flexio_Spi 名稱的頭文件與源文件其中 Flexio 模擬 SPI 初始化函數與發送數據函數所需要的結構體在 Flexio_Spi_Ip_Sa_BOARO_InitPeripherals_PBcfg.h 內結構體相應的具體內容在相對應的源文件內查看。
圖3.4-4 Flexio_Spi_Ip_Sa_BOARO_InitPeripherals_PBcfg.h
4. 主函數編寫
各模塊初始化與功能函數在工程內 RTD 文件夾下相對應模塊名稱的頭文件與源文件內,若使用其他版本 RTD 組件則各函數名稱會有所區別調用函數需要到相應模塊文件內查找。
#include "Mcal.h"
#include "Clock_Ip.h"
#include "Siul2_Port_Ip.h"
#include "Flexio_Mcl_Ip.h"
#include "Flexio_Spi_Ip.h"
#include "IntCtrl_Ip.h" //引用必要頭文件
volatile int exit_code = 0;
#define timeout 0xFFFFFFFF //定義超時計數
ISR(MCL_FLEXIO_ISR); //FlexIO 中斷
uint8 flexiotxbuffer[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
uint8 flexiorxbuffer[8]; //FlexIO 發送接收數據緩衝區
int main(void)
{
/* Write your code here */
Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);//工程時鐘初始化函數
IntCtrl_Ip_Init(&IntCtrlConfig_0);//工程中斷初始化函數
IntCtrl_Ip_ConfigIrqRouting(&intRouteConfig);//配置工程中斷函數
Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS0,
&g_pin_mux_InitConfigArr0[NUM_OF_CONFIGURED_PINS0]);//工程引腳初始化函數
Flexio_Mcl_Ip_InitDevice(&Flexio_Ip_xFlexioInit);//FlexIO MCL 組件初始化函數
Flexio_Spi_Ip_Init(&Flexio_Spi_Ip_PhyUnitConfig_SpiPhyUnit_0_Instance_0_BOARD_InitPeripherals);
//FlexIO 模擬 SPI 初始化函數
Flexio_Spi_Ip_SyncTransmit(&Flexio_Spi_Ip_DeviceAttributes_SpiExternalDevice_0_Instance_0_BOARD_InitPeripherals,
flexiotxbuffer,flexiorxbuffer,8,timeout);//FlexIO 模擬 SPI 同步發送數據函數
while(FLEXIO_SPI_IP_BUSY==Flexio_Spi_Ip_GetStatus(0)){};//檢測 FlexIO 模擬 SPI 發送狀態函數
for(;;)
{
if(exit_code != 0)
{
break;
}
}
return exit_code;
}
5. 調試測試
將上文主函數進行編譯生成 .elf 文件並調試下載進入 S32K344EVB 內部進行調試測試並使用邏輯分析儀連接相應引腳就行信號抓取獲得波形圖。
圖5-1 邏輯分析儀抓取波形圖
由於篇幅所限本文僅介紹 S32K344 FlexIO 模塊部分內容,如想了解更多資料與設計,請聯繫我們 atu.sh@wpi-group.com。
6. 參考文獻
[1] S32K3XX Reference Manual.pdf,NXP
[2] S32K3XX Data Sheet.pdf,NXP
歡迎在博文下方留言評論,我們會及時回復您的問題。
如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:Hobo Xu/ 許寧
更多資訊,請掃碼關注我們!
評論