How to use S32K144 SPI0

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to use S32K144 SPI0

362 Views
leonordo
Contributor I

I have used SPI0 SPI1 SPI2 on S32K144, why only SPI0 does not work, the following is my code。

Is it because I haven't enabled SPI0 all the time?

this is my code

#define FMC_BSP_ETH1_SCK_PORT PORTE
#define FMC_BSP_ETH1_SCK_IDX (0U)
#define FMC_BSP_ETH1_SCK_MUX PORT_MUX_ALT3
#define FMC_BSP_ETH1_SCK_PDS PORT_LOW_DRIVE_STRENGTH

#define FMC_BSP_ETH1_MISO_PORT PORTE
#define FMC_BSP_ETH1_MISO_IDX (1U)
#define FMC_BSP_ETH1_MISO_MUX PORT_MUX_ALT3
#define FMC_BSP_ETH1_MISO_PDS PORT_LOW_DRIVE_STRENGTH

#define FMC_BSP_ETH1_MOSI_PORT PORTE
#define FMC_BSP_ETH1_MOSI_IDX (2U)
#define FMC_BSP_ETH1_MOSI_MUX PORT_MUX_ALT3
#define FMC_BSP_ETH1_MOSI_PDS PORT_LOW_DRIVE_STRENGTH

#define FMC_BSP_ETH1_CS_PORT PORTE
#define FMC_BSP_ETH1_CS_IDX (6U)
#define FMC_BSP_ETH1_CS_MUX PORT_MUX_AS_GPIO
#define FMC_BSP_ETH1_CS_PDS PORT_HIGH_DRIVE_STRENGTH

 

#define FMC_BSP_SPI0_PCS (LPSPI_PCS2) /*! ETH1 片选*/
#define FMC_BSP_SPI1_PCS (LPSPI_PCS3) /*! ETH2 片选*/

#define FMC_BSP_SPI_PCS_POL (LPSPI_ACTIVE_LOW) /*! 片选极性*/
#define FMC_BSP_SPI_BITCOUNT (8U) /*! 帧大小*/
#define FMC_BSP_SPI_SRC_CLK (48000000U) /*! 时钟源频率*/
#define FMC_BSP_SPI_LSBFIRST (FALSE) /*! MSB OR LSB*/
#define FMC_BSP_SPI_CLOCK_PHASE (LPSPI_CLOCK_PHASE_1ST_EDGE) /*! 数据在时钟的第几个边沿传输*/
#define FMC_BSP_SPI_SCK_PHASE (LPSPI_SCK_ACTIVE_HIGH) /*! CLK 极性*/
#define FMC_BSP_SPI_TRANSFER_TYPE (LPSPI_USING_INTERRUPTS) /*! DMA还是中断*/

 

uint8_t FmcBspEthSpiPortCfg(PORT_Type *pPort, uint32_t u32Index,port_drive_strength_t tpds, port_mux_t tMux,uint8_t CSInit,uint8_t direc)
{
pin_settings_config_t tPinCtg;
//参数设置
memset(&tPinCtg, 0 ,sizeof(tPinCtg));
tPinCtg.base = pPort;
tPinCtg.pinPortIdx = u32Index;
tPinCtg.pullConfig = PORT_INTERNAL_PULL_NOT_ENABLED;
tPinCtg.passiveFilter = false;
tPinCtg.driveSelect = tpds;
tPinCtg.mux = tMux;
tPinCtg.pinLock = false;
tPinCtg.intConfig = PORT_DMA_INT_DISABLED;
tPinCtg.clearIntFlag = false;
tPinCtg.gpioBase = NULL;
if(CSInit==1)//ETH1
{
tPinCtg.gpioBase = PTE;
}
else if(CSInit==2)//ETH2
{
tPinCtg.gpioBase = PTB;
}
if(direc==1)
{
tPinCtg.direction = GPIO_INPUT_DIRECTION;
}
else if(direc==2)
{
tPinCtg.direction = GPIO_OUTPUT_DIRECTION;
}
PINS_Init(&tPinCtg);
return TRUE;
}
/**************************************************************************//**
* 获取SPI的配置参数
* @Param
* pCfg 参数存放地址
* @Param
* uIndex SPI的设备索引
* @Param
* uBaudRate 波特率 KbpS
*
* @retval
* BOOL
* @return
* 函数执行结果,成功执行,返回TRUE
*******************************************************************************/
uint8_t FmcBspEthSpiGetCfg(lpspi_master_config_t *pCfg, uint8_t uIndex, uint32_t uBaudRate)
{
uint8_t bRet = FALSE;
pCfg->bitsPerSec = uBaudRate;
pCfg->isPcsContinuous = false;
pCfg->rxDMAChannel = 255;
pCfg->txDMAChannel = 255;
pCfg->callback = NULL;
pCfg->callbackParam = NULL;

pCfg->pcsPolarity = FMC_BSP_SPI_PCS_POL;
pCfg->bitcount = FMC_BSP_SPI_BITCOUNT;
pCfg->lpspiSrcClk = FMC_BSP_SPI_SRC_CLK;
pCfg->clkPhase = FMC_BSP_SPI_CLOCK_PHASE;
pCfg->clkPolarity = FMC_BSP_SPI_SCK_PHASE;
pCfg->lsbFirst = FMC_BSP_SPI_LSBFIRST;
pCfg->transferType = FMC_BSP_SPI_TRANSFER_TYPE;
if(uIndex==0)
{
pCfg->whichPcs = FMC_BSP_SPI0_PCS;
}
else if(uIndex==1)
{
pCfg->whichPcs = FMC_BSP_SPI1_PCS;
}
bRet = TRUE;
return bRet;
}
/**************************************************************************//**
* 获取SPI状态的存取结构体
* @Param
* eIndex SPI的设备索引
* @retval
* lpspi_state_t*
* @return
* 函数执行结果,成功执行非NULL
*******************************************************************************/
lpspi_state_t *FmcBspEthGetSpiStateStruct(uint8_t uIndex)
{
lpspi_state_t *pState = NULL;
if(uIndex==0)
{
pState = &g_spi0State;
}
else if(uIndex==1)
{
pState = &g_spi1State;
}
return pState;
}
/**************************************************************************//**
* 初始化SPI外设
* @Param
* uIndex SPI的设备索引
* @Param
* uBaudRate SPI的波特率
* @retval
* BOOL
* @return
* 函数执行结果,若成功则返回TRUE,否则返回FLASE
*******************************************************************************/
uint8_t FmcBspEthSpiMasterInit(uint8_t uIndex, uint32_t uBaudRate)
{
lpspi_master_config_t spiCfg;
lpspi_state_t *pState;
if( FALSE == FmcBspEthSpiGetCfg(&spiCfg, uIndex, uBaudRate) ) {
return FALSE;
}
pState = FmcBspEthGetSpiStateStruct(uIndex);
if( NULL == pState ) {
return FALSE;
}
if( STATUS_SUCCESS == LPSPI_DRV_MasterInit(uIndex, pState, &spiCfg) ) {
return TRUE;
}
return FALSE;
}
//spi_clock
void FmcBspEthClockSPIInit(void)
{
peripheral_clock_config_t Spi0Clk = {
.clockName = PCC_LPSPI0_CLOCK,
.clkGate = true,
.clksrc=CLK_SRC_FIRC,
.frac = MULTIPLY_BY_ONE,
.divider = DIVIDE_BY_ONE,
};
peripheral_clock_config_t Spi1Clk = {
.clockName = PCC_LPSPI1_CLOCK,
.clkGate = true,
.clksrc=CLK_SRC_FIRC,
.frac = MULTIPLY_BY_ONE,
.divider = DIVIDE_BY_ONE,
};

/* Disable the peripheral clock */
PCC_SetClockMode(PCC, Spi0Clk.clockName, false);
PCC_SetClockMode(PCC, Spi1Clk.clockName, false);

/* Set peripheral clock control */
PCC_SetPeripheralClockControl(PCC,
Spi0Clk.clockName,
Spi0Clk.clkGate,
Spi0Clk.clkSrc,
Spi0Clk.divider,
Spi0Clk.frac);
PCC_SetPeripheralClockControl(PCC,
Spi1Clk.clockName,
Spi1Clk.clkGate,
Spi1Clk.clkSrc,
Spi1Clk.divider,
Spi1Clk.frac);
}
//IO init
void FmcEthSpiPortInit(void)
{
//ETH1
//CLK
FmcBspEthSpiPortCfg(FMC_BSP_ETH1_SCK_PORT,FMC_BSP_ETH1_SCK_IDX,FMC_BSP_ETH1_SCK_PDS,FMC_BSP_ETH1_SCK_MUX,1,2);
//MISO
FmcBspEthSpiPortCfg(FMC_BSP_ETH1_MISO_PORT,FMC_BSP_ETH1_MISO_IDX,FMC_BSP_ETH1_MISO_PDS,FMC_BSP_ETH1_MISO_MUX,1,1);
//MOSI
FmcBspEthSpiPortCfg(FMC_BSP_ETH1_MOSI_PORT,FMC_BSP_ETH1_MOSI_IDX,FMC_BSP_ETH1_MOSI_PDS,FMC_BSP_ETH1_MOSI_MUX,1,2);
//CS
FmcBspEthSpiPortCfg(FMC_BSP_ETH1_CS_PORT,FMC_BSP_ETH1_CS_IDX,FMC_BSP_ETH1_CS_PDS,FMC_BSP_ETH1_CS_MUX,1,2);
//初始化IO口状态
PINS_GPIO_SetPins(FMC_BSP_ETH1_CS, 1U << FMC_BSP_ETH1_CS_PIN);
// PINS_GPIO_SetPins(FMC_BSP_ETH1_CS, 1U << FMC_BSP_ETH1_SCK_IDX);//这个怎么不起作用?
//ETH2
//CLK
FmcBspEthSpiPortCfg(FMC_BSP_ETH2_SCK_PORT,FMC_BSP_ETH2_SCK_IDX,FMC_BSP_ETH2_SCK_PDS,FMC_BSP_ETH2_SCK_MUX,2,2);
//MISO
FmcBspEthSpiPortCfg(FMC_BSP_ETH2_MISO_PORT,FMC_BSP_ETH2_MISO_IDX,FMC_BSP_ETH2_MISO_PDS,FMC_BSP_ETH2_MISO_MUX,2,1);
//MOSI
FmcBspEthSpiPortCfg(FMC_BSP_ETH2_MOSI_PORT,FMC_BSP_ETH2_MOSI_IDX,FMC_BSP_ETH2_MOSI_PDS,FMC_BSP_ETH2_MOSI_MUX,2,2);
//CS
FmcBspEthSpiPortCfg(FMC_BSP_ETH2_CS_PORT,FMC_BSP_ETH2_CS_IDX,FMC_BSP_ETH2_CS_PDS,FMC_BSP_ETH2_CS_MUX,2,2);
//初始化IO口状态
PINS_GPIO_SetPins(FMC_BSP_ETH2_CS, 1U << FMC_BSP_ETH2_CS_PIN);
}

/***************************************************************************//**
* 使用片选
* @Param uDev,ETH1/ETH2
* @retval
* VOID
* @return
* VOID
*******************************************************************************/
void SpiEthCsEnable(uint8_t uDev)
{
if(uDev==0) {
// PINS_GPIO_SetPins(FMC_BSP_ETH1_CS, 1U << FMC_BSP_ETH1_CS_PIN);
PINS_GPIO_ClearPins(FMC_BSP_ETH1_CS, 1U << FMC_BSP_ETH1_CS_PIN);
} else {
// PINS_GPIO_SetPins(FMC_BSP_ETH2_CS, 1U << FMC_BSP_ETH2_CS_PIN);
PINS_GPIO_ClearPins(FMC_BSP_ETH2_CS, 1U << FMC_BSP_ETH2_CS_PIN);
}
}
/***************************************************************************//**
* 失能片选
* @Param uDev,ETH1/ETH2
* @retval
* VOID
* @return
* VOID
*******************************************************************************/
void SpiEthCsDisable(uint8_t uDev)
{
if(uDev==0) {
// PINS_GPIO_ClearPins(FMC_BSP_ETH1_CS, 1U << FMC_BSP_ETH1_CS_PIN);
PINS_GPIO_SetPins(FMC_BSP_ETH1_CS, 1U << FMC_BSP_ETH1_CS_PIN);
} else {
// PINS_GPIO_ClearPins(FMC_BSP_ETH2_CS, 1U << FMC_BSP_ETH2_CS_PIN);
PINS_GPIO_SetPins(FMC_BSP_ETH2_CS, 1U << FMC_BSP_ETH2_CS_PIN);
}
}

0 Kudos
1 Reply

345 Views
VaneB
NXP TechSupport
NXP TechSupport

Hi @leonordo 

It is essential to enable the module for its operation.

I suggest looking at the LPSPI examples included in the SDK and RTD for reference for your project.

 

B.R.

VaneB

0 Kudos