Hi, Peter,
I think the SPI driver in SDK has issue, I pick up the code to set PCS bits in SPI driver:
In Your code, The PCS bits are modified by two initialization function:dspicomm_w25qxf_init() and dspicomm_ethsw_init() by calling the same function DSPI_DRV_MasterInit(), the PCS bits in SPIx_PUSHR register are ORed, so both of the PCS0/PCS1 bits are set, it is wrong.
I suggest you use the following code as a workaround without modifying the original SPI driver.
- int8_t dspicomm_w25qxf_init(uint32_t instance, uint32_t speed)
- {
- dspi_status_t dspiResult;
- uint32_t calculatedBaudRate;
- SPI_Type *dspiBaseAddr = g_dspiBase[instance];
-
- w25Q128FV_masterUserConfig.isChipSelectContinuous = true;
- w25Q128FV_masterUserConfig.isSckContinuous = false;
- w25Q128FV_masterUserConfig.pcsPolarity = kDspiPcs_ActiveLow;
- w25Q128FV_masterUserConfig.whichCtar = kDspiCtar0;
- w25Q128FV_masterUserConfig.whichPcs = kDspiPcs0;
-
-
- dspiResult = DSPI_DRV_MasterInit(instance,
- &w25Q128FV_masterState,
- &w25Q128FV_masterUserConfig);
- if (dspiResult != kStatus_DSPI_Success)
- ..........................................................
- }
Hope it can help you.
BR
Xiangjun Rong
- int8_t dspicomm_w25qxf_init(uint32_t instance, uint32_t speed)
- {
- dspi_status_t dspiResult;
- uint32_t calculatedBaudRate;
- SPI_Type *dspiBaseAddr = g_dspiBase[instance];
-
- w25Q128FV_masterUserConfig.isChipSelectContinuous = true;
- w25Q128FV_masterUserConfig.isSckContinuous = false;
- w25Q128FV_masterUserConfig.pcsPolarity = kDspiPcs_ActiveLow;
- w25Q128FV_masterUserConfig.whichCtar = kDspiCtar0;
- w25Q128FV_masterUserConfig.whichPcs = kDspiPcs0;
-
-
- dspiResult = DSPI_DRV_MasterInit(instance,
- &w25Q128FV_masterState,
- &w25Q128FV_masterUserConfig);
- if (dspiResult != kStatus_DSPI_Success)
- ....................................................................................
- }
The following is your original code:
//////////////////////////////////////
- int8_t dspicomm_w25qxf_init(uint32_t instance, uint32_t speed)
- {
- dspi_status_t dspiResult;
- uint32_t calculatedBaudRate;
- SPI_Type *dspiBaseAddr = g_dspiBase[instance];
-
- w25Q128FV_masterUserConfig.isChipSelectContinuous = true;
- w25Q128FV_masterUserConfig.isSckContinuous = false;
- w25Q128FV_masterUserConfig.pcsPolarity = kDspiPcs_ActiveLow;
- w25Q128FV_masterUserConfig.whichCtar = kDspiCtar0;
- w25Q128FV_masterUserConfig.whichPcs = kDspiPcs0;
-
-
- dspiResult = DSPI_DRV_MasterInit(instance,
- &w25Q128FV_masterState,
- &w25Q128FV_masterUserConfig);
- if (dspiResult != kStatus_DSPI_Success)
- ////////////////////////////////////////////////////////////////////////////////////
***************************************************************************************************************************
- static int8_t dspicomm_ethsw_init(uint32_t instance, uint32_t speed)
- {
- uint32_t calculatedBaudRate;
-
- ksz8863_masterUserConfig.isChipSelectContinuous = true;
- ksz8863_masterUserConfig.isSckContinuous = false;
- ksz8863_masterUserConfig.pcsPolarity = kDspiPcs_ActiveLow;
- ksz8863_masterUserConfig.whichCtar = kDspiCtar1;
- ksz8863_masterUserConfig.whichPcs = kDspiPcs1;
-
-
- dspiResult = DSPI_DRV_MasterInit(instance,
- &ksz8863_masterState,
- &ksz8863_masterUserConfig);
****************************************************************************************************************************
//The following is the driver code:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
dspi_status_t DSPI_DRV_MasterInit(uint32_t instance,
dspi_master_state_t * dspiState,
const dspi_master_user_config_t * userConfig)
{
uint32_t dspiSourceClock;
dspi_status_t errorCode = kStatus_DSPI_Success;
SPI_Type *base = g_dspiBase[instance];
/* Clear the run-time state struct for this instance.*/
memset(dspiState, 0, sizeof(* dspiState));
/* Note, remember to first enable clocks to the DSPI module before making any register accesses
* Enable clock for DSPI
*/
CLOCK_SYS_EnableSpiClock(instance);
/* Get module clock freq*/
dspiSourceClock = CLOCK_SYS_GetSpiFreq(instance);
/* Configure the run-time state struct with the DSPI source clock */
dspiState->dspiSourceClock = dspiSourceClock;
/* Configure the run-time state struct with the data command parameters*/
dspiState->whichCtar = userConfig->whichCtar; /* set the dspiState struct CTAR*/
dspiState->whichPcs = userConfig->whichPcs; /* set the dspiState struct whichPcs*/
dspiState->isChipSelectContinuous = userConfig->isChipSelectContinuous; /* continuous PCS*/
/* Initialize the DSPI module registers to default value, which disables the module */
DSPI_HAL_Init(base);
/* Init the interrupt sync object.*/
OSA_SemaCreate(&dspiState->irqSync, 0);
/* Initialize the DSPI module with user config */
/* Set to master mode.*/
DSPI_HAL_SetMasterSlaveMode(base, kDspiMaster);
/* Configure for continuous SCK operation*/
DSPI_HAL_SetContinuousSckCmd(base, userConfig->isSckContinuous);
/* Configure for peripheral chip select polarity*/
DSPI_HAL_SetPcsPolarityMode(base, userConfig->whichPcs, userConfig->pcsPolarity);
/* Enable fifo operation (regardless of FIFO depth) */
DSPI_HAL_SetFifoCmd(base, true, true);
..........................................................................................
}
void DSPI_HAL_SetPcsPolarityMode(SPI_Type * base, dspi_which_pcs_config_t pcs,
dspi_pcs_polarity_config_t activeLowOrHigh)
{
uint32_t temp;
temp = SPI_RD_MCR_PCSIS(base);
if (activeLowOrHigh == kDspiPcs_ActiveLow)
{
temp |= pcs; //Rong wrote: because you use
}
else /* kDspiPcsPolarity_ActiveHigh */
{
temp &= ~(unsigned)pcs;
}
SPI_BWR_MCR_PCSIS(base, temp);
}