Dear NXP,
I am working on DSPI communication with the KIT20XS4200EVBE using the MPC5748G calypso microcontroller.
I have a problem with the DSPI_MasterTransfer function and, I don't have any idea why my oscilloscope captures the same frame.
I am using the S32DS design to generate the code using the graphical interface offered by NXP. I have a PIT interrupt coming each 10ms. in the interrupt service routine, I call des_MC20XS4200_PwmUpdate. in the des_MC20XS4200_PwmUpdate function, I use the DSPI_MasterTransfer(INST_DSPI1, ptr, RXbuffer, 1); to send the pointer to the uint16 variable.
My buffer has one value to send and receive.
uint16_t des_MC20XS4200_PwmUpdate(XS_SpdInRegsDataPtr XS_SpdInRegsData, uint16_t duty)
{
uint16_t status;
uint16_t channel;
uint16_t *ptr;
uint16_t des_status = STATUS_SUCCESS;
//watchDog = 0;
for (channel = 0; channel < XS_MAX_HS; channel++)
{
XS_SpdInRegsData[channel].XS_PwmIn.u3RAddr = XS_SPD_PWMR_ADDR;
XS_SpdInRegsData[channel].XS_PwmIn.u8PWM = (uint8_t)0x00ff&duty;
XS_SpdInRegsData[channel].XS_PwmIn.u1A0 = channel;
XS_SpdInRegsData[channel].XS_PwmIn.u1WDIN = watchDog;
XS_SpdInRegsData[channel].XS_PwmIn.u1P = u16_XS_iParityCalc((uint16_t)XS_SpdInRegsData[channel].XS_PwmIn.All);
ptr = (uint16_t*)&XS_SpdInRegsData[channel].XS_PwmIn.All;
des_status = DSPI_MasterTransfer(INST_DSPI1, ptr, RXbuffer, 1);
watchDog ^=1;
}
return status;
}
My issue is when I break the counter execution in line 130(just before calling the DSPI_MasterTransfer ), I could see that my variable is changing, but in the scope inspector, the DSPI send always the same value.
*ptr = 0x88FF in the first iteration of the for loop
*ptr = 0x28FF in the second iteration of the for loop.
In the SPI scope inspector, I have this frame.
0ms I have this frame,
in 10ms I have the same TX frame.
I pushed my code to git if you want to see the project.
https://gitlab.com/tarik_semrade/mcxs2000.git
Thank you in advance for you help,
S.Tarik
Hello Petr,
Thank you for your replay,
Your proposition works for me and, I have another solution for this issue using the code I posted.
The solution is to use a flag in the ISR and add an infinite loop in the main function with a test on that flag to call the function every 10ms...
The thing is the DSPI uses the interrupt for receiving and transmitting, my idea is related to nested interrupts.
I am not sure but, I think that in the PIT interrupt other interrupts are maskable and the transmission is established after coming out of the PIT ISR.
What do you think?
Thank you!
S.Tarik