NXP S32K312 開發板試用 - 在串口打印介面中看到 SPI 傳輸數據

關鍵字 :開發板S32K312NXPIPLEDS32DSS32K3MCU世平SAR

NXP S32K312 開發板試用體驗第一篇

 

拿到開發板已經快一個月了,按理說早就應該發出第一篇帖子。不過這段時間適逢過年,加上在摸索開發板代碼時遇到了一些問題,直到將問題解決後才發出第一篇帖子。我這篇帖子是以有一定ARM開發經驗,但對S32K3系列以及Eclipse開發環境完全不熟悉的角度進行編寫的。總的來說,開發S32K312開發板需要三個軟體:S32DS開發環境(基於Eclipse開發環境,由NXP公司自行搭建的GCC編譯鏈)、RTD驅動代碼庫,以及Segger JLINK燒錄工具(因為S32K312晶片內核是ARM Cortex-M7,只要是ARM內核,都可以使用Segger JLINK燒錄工具進行燒錄)。

 

1. 下載S32DS&RTD驅動程式代碼庫

 

S32DS 開發環境下載地址:

https://nxp.flexnetoperations.com/control/frse/download?agree=Accept&element=6497301

 

 

 

RTD5.0 驅動程式代碼庫下載地址:

https://nxp.flexnetoperations.com/control/frse/download?agree=Accept&element=6441901

 

 


 

安裝RTD5.0庫需要透過Help選單中的Install New Software頁面進行:

 

 

RTD5.0庫安裝完成後,可以透過新建專案的方式找到NXP原廠為S32K312開發板提供的範例程式:


 

但實際上這些範例程式在編譯時會找不到源文件和標頭文件,我自己不熟悉 Eclipse 開發環境,所以僅作為參考,不會將範例程式燒錄到開發板中。


2. 新建S32K312工程並燒錄




新建專案時選對MCU型號,是S32K312,RTD庫選擇最新的5.0,I/O支援選擇不支援,GDB選項隨意,反正我不使用Eclipse內部的燒錄工具進行燒錄。
 

初始化 DIO 和 LPUART 所使用的引腳(PTB10 為 RGBLED 的紅色 LED,PTC2 和 PTC3 為 LPUART0 的收發引腳):

 


初始化DIO和LPUART模組:




LPUART 模組需要設定波特率,我這邊設定的波特率為 115200,資料位 8,停止位 1,無奇偶校驗位。

設定完成後更新原始碼,並在 main.c 檔案中新增程式碼: 

#include <stdio.h>

#include "Mcal.h"

#include "Clock_Ip.h"

#include "Siul2_Port_Ip.h"

#include "Siul2_Dio_Ip.h"

#include "Lpuart_Uart_Ip.h"

void Delay(uint32_t n)

{

static volatile uint32 DelayTimer = 0;

while (DelayTimer < n)

{

DelayTimer++;

}

DelayTimer=0;

}

 

int __io_putchar(int ch)

{

Lpuart_Uart_Ip_SyncSend(0 , (uint8_t *)&ch , 1 , 0xffff);

return (ch);

}

 

 

__attribute__((weak)) int _write(int file, char *ptr, int len)

{

int DataIdx;

 

for (DataIdx = 0; DataIdx < len; DataIdx++)

{

__io_putchar(*ptr++);

}

return len;

}

 

int main(void)

{

 

Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);

 

Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals , g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);

 

Lpuart_Uart_Ip_Init(0 , &Lpuart_Uart_Ip_xHwConfigPB_0);

printf("LPUART0.\n");

 

在 Eclipse 環境中覆寫 fputc 標準輸出函數,重載為 LPUART0 串口輸出。

找到工程生成的ELF檔案:

 

 


使用Segger JLINK燒錄工具開啟:

 

 


將 JLINK V9 和電源接上開發板,micro USB 接口連接電腦,按下 F7 進行燒錄:

 

 

 


即可看到 RGB 燈的紅燈被成功初始化,串口打印 LPUART0:

 

 

 

3. ADC SAR模組

 

開發板上有一個藍色的電位器旋鈕R78,對應的引腳是PTD4:




 

從對應關係可得知PTD4為ADCSAR模組的第19路輸入,設定ADCSAR模組的第19路輸入(映射43),資料位右對齊,14位資料:

 


設定完成後更新原始碼,並在main.c檔案中新增程式碼:

#include "Adc_Sar_Ip.h"

int main(void)
{
    。。。
    status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_0_INSTANCE , &AdcHwUnit_0);
    while (status != E_OK);

    for(Index = 0; Index <= 5; Index++)
    {
        status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_0_INSTANCE);
        if(status == E_OK)
        {
            break;
        }
    }

    。。。

    while(1)
    {
        Adc_Sar_Ip_StartConversion(ADCHWUNIT_0_INSTANCE , ADC_SAR_IP_CONV_CHAIN_NORMAL);
        while(!(Adc_Sar_Ip_GetStatusFlags(ADCHWUNIT_0_INSTANCE) & ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN))
        {
        }
        data = Adc_Sar_Ip_GetConvData(ADCHWUNIT_0_INSTANCE , 43);
        Adc_Sar_Ip_ClearStatusFlags(ADCHWUNIT_0_INSTANCE , ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN);
        printf("data = %d.\n", data);

        Siul2_Dio_Ip_WritePin(RGBLED_RED_PORT , RGBLED_RED_PIN , 1);
        Delay(1000000);
        Siul2_Dio_Ip_WritePin(RGBLED_RED_PORT , RGBLED_RED_PIN , 0);
        Delay(1000000);
    }

    。。。
}

 

可以在串口中看到對ADC引腳的讀取數據打印:


 

由於是14位資料,因此最大值為16383,旋轉旋鈕即可看到資料變化。

 
4. LPSPI模組




透過原理圖可知,LPSPI0 和 LPSPI1 這兩組 SPI 接口分別接到了開發板 J31 和 J26 的兩組母插孔上,並在引腳界面對這兩組 SPI 接口的 SCK、SIN、SOUT 共計六個引腳進行初始化:

 

 
在LPSPI模組中,初始化兩組SPIDriver和SPIGeneral,分別對應兩組不同的SPI介面,這兩個SPI介面使用獨立的設定,但資料位都是8位,且都是MSB。

 

 




 

並確保兩組AIPS時鐘都正常設定:


 


AIPS_PLAT時鐘是LPSPI0使用的,AIPS_SLOW時鐘是LPSPI1到LPSPI3使用的。

 
設定完成後更新原始碼,並在main.c檔案中新增程式碼:

 

#include "Lpspi_Ip.h"

#define LPSPI0_BUFFER_NUM 2

uint8_t lpspi0_tx_buffer[LPSPI0_BUFFER_NUM] = {0xaa , 0xab};

uint8_t lpspi0_rx_buffer[LPSPI0_BUFFER_NUM] = {0};

#define LPSPI1_BUFFER_NUM 2

uint8_t lpspi1_tx_buffer[LPSPI1_BUFFER_NUM] = {0xbb , 0xbc};

uint8_t lpspi1_rx_buffer[LPSPI1_BUFFER_NUM] = {0};

int main(void)
{
。。。

Lpspi_Ip_Init(&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_0_Instance_0);
printf("Lpspi_Ip_Init.\n");
Lpspi_Ip_SyncTransmit(
    &Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_0_Instance_0 ,
    lpspi0_tx_buffer ,
    lpspi0_rx_buffer ,
    LPSPI0_BUFFER_NUM ,
    0xffff
);
printf("lpspi0_rx_buffer = 0x%x 0x%x.\n" , lpspi0_rx_buffer[0] , lpspi0_rx_buffer[1]);

Lpspi_Ip_Init(&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_1_Instance_1);
printf("Lpspi_Ip_Init.\n");
Lpspi_Ip_SyncTransmit(
    &Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_1_Instance_1 ,
    lpspi1_tx_buffer ,
    lpspi1_rx_buffer ,
    LPSPI1_BUFFER_NUM ,
    0xffff
);
printf("lpspi1_rx_buffer = 0x%x 0x%x.\n" , lpspi1_rx_buffer[0] , lpspi1_rx_buffer[1]);

。。。
}

 

短接兩組SPI介面的SIN和SOUT介面:

 

 

可以在串口列印介面中看到SPI傳輸的數據:

 

 


文章來自「S32K312 開發板評測活動」測評者:李明

 


歡迎在文章下方留言評論,我們會及時回覆您的問題。

如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:WPIg

更多資訊,請掃碼關注我們!

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

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

參考來源

:

評論