Hi,
I'm developing SPI functions with S32K3 evaluation board and trying to send 9 commands in a row with 15 bytes per command without DMA involved. The MCAL used in this project is "SW32K3_RTD_4.4_2.0.2"
The SPI is working properly without receive CAN messages. But when the controller starts to receive CAN messages, the transmited SPI data seems to be interrupted frequently. (The interrupt priority of CAN is 5 and the SPI is 3.)
Can anyone tell me why this happened and how to identify which function the SPI is interrupted by.
Normal SPI Command
Interrupted SPI command
Thanks.
Hi @YL005
With the information you gave us, it seems that CAN may be interrupting the data transmission of SPI. To verify this, could you share your code with us so we can check it in detail?
B.R.
VaneB
Hi VaneB,
Sorry for the late reply. Sorry, I can't provide the code I used, because there is some information related to our project. But I can share the interrupt configuration with the priority of the CAN and SPI as the attached files. The CAN messages are received by CAN0 and SPI is transmitted by SPI5.
Hi @YL005
Can you elaborate more on how you are managing the SPI IRQ? Are you receiving/sending the SPI frame on the IRQ Handler or outside?
Hi,
I found out that another interrupt is also weird
The PIT notification should be called every 1ms, and I flip a 1ms flag in the callback function as follow
void Gpt_PitNotification_PIT0_CH0(void) {
fs_f_us1msFastTask ^= 1;
}
The flag record by lauterbach as the figure attached.
In my point of view, I would say that there's someone has higher priority of the PIT or SPI.
Attached is the configuration of interrupts, I can't find any clue about it.
Please tell my if you have any further ideas.
Thanks a lot.
Hi @YL005
From the document, you shared only the interrupts of PIT0, FlexCan 1 to 5, LPSPI0 and LPSPI5.
One possibility is that PIT0, the one with the highest priority, should not be interrupted by another, but it could interrupt FlexCan and LPSPI.
Also, having so many interruptions, you must manage these well so they do not overlap.
What I suggest is to leave your project with the main peripherals and go together with the others to find at what point the problem is generated
Hi @VaneB,
Thanks for your advice.
I have a further question about the interrupt of SPI.
In the post below I notice that I setup the "asynchronous mode" but sent the SPI data with "Synchronout mode". Can you tell where can I find the example of transmit SPI data with asynchronous mode?
Hi @YL005
Included in the RTDs are examples of LSPI.
Sorry for lately reply.
I use the following API to initial the SPI driver.
/* Initialize the Spi driver */
Spi_Init(NULL_PTR);
/* Set Spi mode */
Spi_SetAsyncMode(SPI_INTERRUPT_MODE);
Then use the following API to send and receive SPI command.
Spi_SetupEB(SpiConf_SpiChannel_SpiChannel_HostSPI, TxChBuf, receiveData, 15u);
statusHost = Spi_SyncTransmit(SpiConf_SpiSequence_SpiSequence_Host);
Hi @YL005
According to the information you provided me, I can see that you are using synchronous and asynchronous communication functions. Are you using both types of communication?
No, the transmit API I used in runtime is synchronize only
statusHost = Spi_SyncTransmit(SpiConf_SpiSequence_SpiSequence_Host);