Hi,guys
I want to check the SPI drive, so I have used the S32DS SDK APIs to make S32K144 transmit data to S32K142 by LPSPI0.
But now I found S32k142 couldn't get the data from S32k144, I make sure the four pins setted by S32DS Processor Expert is ok, I don't konw where the problem is, so I want some help from you,the code is as follow attachment.
Thank you very much.
Solved! Go to Solution.
Hi shenjun,
First of all, the lpspi_transfer_s32k144 SDK example demonstrates use of both LPSPI Master and Slave on a single MCU. So, there is no need to have two MCUs.
Once you have called the LPSPI_DRV_SlaveTransfer() function (S32K142), you should call the LPSPI_DRV_SlaveGetTransferStatus() until the transfer is finished before initializing another transfer.
Please check the return values of the SDK functions.
Also, I see that you use the SDK along with a bare-metal LPSPI routines on the LPSPI0 module.
I would suggest you measure the bus with an oscilloscope.
Thanks,
BR, Daniel
I measured the bus with an oscilloscope.And the master out pin displayed waveform in the oscilloscope.But the salve RX FIFO is empty by check the register RSR.
Dear shenjun,
If I understand, you are testing the example on a single MCU now.
Yes, the pins of LPSPI1 and LPSPI0 modules must be connected on the board.
What is the return status of the LPSPI_DRV_SlaveTransfer(), LPSPI_DRV_MasterTransferBlocking() functions?
Have you tried testing the example without any modification?
BR, Daniel
Dear Daniel,
Thank you for your answered in patience.But by the way , used the two MCUs beacause of the hardware board has been designed as s32k144 transfer S32k142 by lpspi0.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
s32k144 configure as master,
LPSPI_DRV_MasterInit(0, &masterState, &Send_MasterConfig0);
while(1)
{
if(STATUS_SUCCESS == LPSPI_DRV_MasterTransfer(0, &slaveDataSend, &slaveDataReceive, 1))
{
i ++;
}
}
All pins select the alt2 function
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
s32k142 configure as salve,
LPSPI_DRV_SlaveInit(0, &slaveState, &Receive_SlaveConfig0);
while(1)
{
if(STATUS_SUCCESS == LPSPI_DRV_SlaveTransfer(RECEIVE, &data, &recvdate, 1))
{
i ++;
temp = recvdate;
}
}
All pins select the alt2 function
I have seen the waveform in the oscilloscope by touch the s32k144 PTE2, but the s32k142 didn't have any receive data.
I changed the PE configure as below,
As master s32k144:
As slave s32k142:
When I used oscilloscope to touch the master S32k144 output PTE2 during the slave S32k142 powerdown,the waveform was as follow:
But when slave S32k142 work ,the waveform changed as follow:
It seems that slave S32k142 has output level , so that the wave of master S32k144 output PTE2 has been influenced !
But , I just configure the S32k142 pins as a salve , the S32k144 as a master, why? Could you help me to slove this problem,thank you very much!
Just to be sure, how exactly are the two MCUs connected?
Is S32K144 PE2 connected to S32K142 PTE1 and vice versa?
If possible, please attach the entire test projects.
Thanks,
BR, Daniel
Hi,
In the S32K142 main() function that you posted here:
https://community.nxp.com/thread/510735
You have this line:
Please remove it or change the HW connection accordingly.
Thanks,
BR, Daniel
Hi Daniel,
Actually it's the HW connection problem, I have asked the hardware engineer to fix and the problem has been solved.Thank you very much.
OK,
All pins select the alt2 function
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
s32k142 configure as salve,
LPSPI_DRV_SlaveInit(0, &slaveState, &Receive_SlaveConfig0);
while(1)
{
if(STATUS_SUCCESS == LPSPI_DRV_SlaveTransfer(RECEIVE, &data, &recvdate, 1))
{
i ++;
temp = recvdate;
}
}
Dear Daniel,
Used the two MCUs, beacause of the hardware board has been designed.By the way,demonstrates use of both LPSPI Master and Slave on a single MCU need the wires connect? Follow your advise, I code as follow ,but it cann't enter the if conditional statement.
/* Initialize LPSPI0 (Send)*/
LPSPI_DRV_MasterInit(SEND, &masterState, &Send_MasterConfig0);
/* Initialize LPSPI1 (Receive)*/
LPSPI_DRV_SlaveInit(RECEIVE, &slaveState, &Receive_SlaveConfig0);
/* Initialize ADC */
// ADC_DRV_ConfigConverter(INST_ADCONV1, &adConv1_ConvConfig0);
/* Initialize FTM */
// FTM_DRV_Init(INST_FLEXTIMER_PWM1, &flexTimer_pwm1_InitConfig, &ftmStateStruct);
// FTM_DRV_InitPwm(INST_FLEXTIMER_PWM1, &flexTimer_pwm1_PwmConfig);
while(1)
{
// ADC_DRV_ConfigChan(INST_ADCONV1, 0U, &adConv1_ChnConfig0);
// ADC_DRV_WaitConvDone(INST_ADCONV1);
/* Store the channel result into a local variable slaveDataSend*/
// ADC_DRV_GetChanResult(INST_ADCONV1, 0U, &adcRead);
// slaveDataSend = (uint8_t)adcRead;
slaveDataSend = (uint8_t)(0x0f);
LPSPI_DRV_SlaveTransfer(RECEIVE, &slaveDataSend, &slaveDataReceive, BUFFER_SIZE);
LPSPI_DRV_MasterTransferBlocking(SEND, &masterDataSend, &masterDataReceive, BUFFER_SIZE, TIMEOUT);
// FTM_DRV_UpdatePwmChannel(INST_FLEXTIMER_PWM1, 0U, FTM_PWM_UPDATE_IN_DUTY_CYCLE, masterDataReceive<<8, 0U, true);
if(0x0f == masterDataReceive)
{
uint8_t i;
i++;
}
}