DSPI Communication timeout issue

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

DSPI Communication timeout issue

33件の閲覧回数
bharathn3402
Contributor III

I am using the MPC5775B microcontroller with an SPI EEPROM. In my application, CAN messages are received continuously using interrupts, and SPI communication with the EEPROM is also interrupt-driven.

Under heavy CAN bus traffic (e.g., five CAN IDs are received every 1 ms), any EEPROM read operation starts timing out. I am using the DSPI_MasterTransferBlocking() API with a timeout of 10 ms. I also tried increasing the timeout value significantly, but the read operation still fails.

Interestingly, the behavior depends on the amount of data being read. When I attempt to read only a few bytes from the EEPROM, the SPI transfer times out. However, when I read an entire EEPROM page (256 bytes), the read operation completes successfully.

I also observed that if CAN traffic is stopped, the EEPROM read operation succeeds without any issues. I verified the interrupt priorities, and both the CAN and SPI interrupts are configured with the same priority level (priority 0).

I would like to understand:

  • Why do small SPI EEPROM read operations time out under heavy CAN interrupt load, while larger (256-byte) page reads complete successfully?

  • Could this be related to interrupt starvation, the implementation of DSPI_MasterTransferBlocking(), or the interaction between the CAN and DSPI interrupt handlers?

  • Is there any known limitation or recommended configuration for using interrupt-driven DSPI transfers concurrently with high-frequency CAN interrupts on the MPC5775B?

Additionally i debugged the issue by placing break points inside the DSPI_MasterTransferBlocking(),during the debug 

status_t DSPI_MasterTransferBlocking(dspi_instance_t instance,
const void * sendBuffer,
void * receiveBuffer,
uint16_t frames,
uint32_t timeout)
{
DEV_ASSERT((uint32_t)instance < (SPI_INSTANCE_COUNT + DSPI_INSTANCE_COUNT));

status_t status;
dspi_state_t * state = DSPI_state[instance];

if (state->status == DSPI_IN_PROGRESS)
{
return STATUS_BUSY;
}

state->isBlocking = true;
(void)OSIF_SemaWait(&(state->dspiSemaphore), 0);
status = DSPI_MasterTransfer(instance, sendBuffer, receiveBuffer, frames);
if (status == STATUS_SUCCESS)
{
status = OSIF_SemaWait(&(state->dspiSemaphore), timeout);
if (status != STATUS_SUCCESS)
{
(void)DSPI_AbortTransfer(instance);
state->status = DSPI_TRANSFER_FAIL;

return status;
}
}

return STATUS_SUCCESS;
}

dspi transfer status getting success, but "OSIF_SemaWait" after dspi transfer getting timeout.

タグ(3)
0 件の賞賛
返信
0 返答(返信)
%3CLINGO-SUB%20id%3D%22lingo-sub-2399953%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EDSPI%E9%80%9A%E4%BF%A1%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E5%95%8F%E9%A1%8C%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2399953%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E7%A7%81%E3%81%AF%20%3CSTRONG%3EMPC5775B%3C%2FSTRONG%3E%20%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%A8%20%3CSTRONG%3ESPI%20EEPROM%3C%2FSTRONG%3E%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E7%A7%81%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%AF%E3%80%81CAN%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AF%20%3CSTRONG%3E%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%3C%2FSTRONG%3E%E3%81%A7%E9%80%A3%E7%B6%9A%E7%9A%84%E3%81%AB%E5%8F%97%E4%BF%A1%E3%81%95%E3%82%8C%E3%80%81EEPROM%E3%81%A8%E3%81%AESPI%E9%80%9A%E4%BF%A1%E3%82%82%20%3CSTRONG%3E%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E9%A7%86%E5%8B%95%3C%2FSTRONG%3E%E5%9E%8B%E3%81%A7%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3ECAN%E3%83%90%E3%82%B9%E3%83%88%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%81%8C%E9%87%8D(%E4%BE%8B%3A1ms%E3%81%94%E3%81%A8%E3%81%AB5%E3%81%A4%E3%81%AECAN%20ID%E3%81%8C%E5%8F%97%E4%BF%A1%E3%81%95%E3%82%8C%E3%82%8B)%E3%81%A7%E3%81%AF%E3%80%81EEPROM%E3%81%AE%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E6%93%8D%E4%BD%9C%E3%81%AF%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%97%E5%A7%8B%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%E7%A7%81%E3%81%AF%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%3CSTRONG%3E10ms%3C%2FSTRONG%3E%E3%81%A8%E3%81%97%E3%81%A6%3CSTRONG%3EDSPI_MasterTransferBlocking()%3C%2FSTRONG%3E%20API%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E5%80%A4%E3%82%92%E5%A4%A7%E5%B9%85%E3%81%AB%E5%A2%97%E3%82%84%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E3%80%81%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E6%93%8D%E4%BD%9C%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E%E8%88%88%E5%91%B3%E6%B7%B1%E3%81%84%E3%81%93%E3%81%A8%E3%81%AB%E3%80%81%E3%81%9D%E3%81%AE%E5%8B%95%E4%BD%9C%E3%81%AF%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BE%E3%82%8C%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E9%87%8F%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%A4%89%E5%8C%96%E3%81%99%E3%82%8B%E3%80%82EEPROM%E3%81%8B%E3%82%89%E6%95%B0%E3%83%90%E3%82%A4%E3%83%88%E3%81%A0%E3%81%91%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8D%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81SPI%E8%BB%A2%E9%80%81%E3%81%8C%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%97%E3%81%8B%E3%81%97%E3%80%81EEPROM%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E5%85%A8%E4%BD%93%EF%BC%88256%E3%83%90%E3%82%A4%E3%83%88%EF%BC%89%E3%82%92%E8%AA%AD%E3%81%BF%E5%8F%96%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E6%93%8D%E4%BD%9C%E3%81%AF%E6%AD%A3%E5%B8%B8%E3%81%AB%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E%E3%81%BE%E3%81%9F%E3%80%81CAN%E3%83%88%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%81%8C%E5%81%9C%E6%AD%A2%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8EEPROM%E3%81%AE%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E6%93%8D%E4%BD%9C%E3%81%8C%E5%95%8F%E9%A1%8C%E3%81%AA%E3%81%8F%E6%88%90%E5%8A%9F%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E8%A6%B3%E5%AF%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D%E3%80%81CAN%E3%81%A8SPI%E3%81%AE%E4%B8%A1%E6%96%B9%E3%81%AE%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AF%E5%90%8C%E3%81%98%E5%84%AA%E5%85%88%E5%BA%A6%E3%83%AC%E3%83%99%E3%83%AB(%E5%84%AA%E5%85%88%E5%BA%A60)%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E%E7%90%86%E8%A7%A3%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%82%B9%E3%81%A7%E3%81%99%E3%80%82%3C%2FP%3E%3CUL%3E%3CLI%3E%3CP%3E%E3%81%AA%E3%81%9C%E5%B0%8F%E3%81%95%E3%81%AASPI%20EEPROM%E3%81%AE%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E6%93%8D%E4%BD%9C%E3%81%AFCAN%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E8%B2%A0%E8%8D%B7%E3%81%8C%E9%87%8D%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AB%E3%80%81%E3%82%88%E3%82%8A%E5%A4%A7%E3%81%8D%E3%81%AA(256%E3%83%90%E3%82%A4%E3%83%88)%E3%83%9A%E3%83%BC%E3%82%B8%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AF%E6%AD%A3%E5%B8%B8%E3%81%AB%E5%AE%8C%E4%BA%86%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F%3C%2FP%3E%3C%2FLI%3E%3CLI%3E%3CP%3E%E3%81%93%E3%82%8C%E3%81%AF%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E9%A3%A2%E9%A4%93%E3%80%81DSPI_MasterTransferBlocking()%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AFCAN%E3%81%A8DSPI%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9%E9%96%93%E3%81%AE%E7%9B%B8%E4%BA%92%E4%BD%9C%E7%94%A8%E3%81%AB%E9%96%A2%E9%80%A3%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F%3C%2FP%3E%3C%2FLI%3E%3CLI%3E%3CP%3EMPC5775B%E4%B8%8A%E3%81%A7%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E9%A7%86%E5%8B%95%E3%81%AEDSPI%E8%BB%A2%E9%80%81%E3%81%A8%E9%AB%98%E5%91%A8%E6%B3%A2CAN%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E6%97%A2%E7%9F%A5%E3%81%AE%E5%88%B6%E9%99%90%E3%82%84%E6%8E%A8%E5%A5%A8%E3%81%95%E3%82%8C%E3%82%8B%E6%A7%8B%E6%88%90%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%3F%3C%2FP%3E%3C%2FLI%3E%3C%2FUL%3E%3CP%3E%E3%81%95%E3%82%89%E3%81%AB%E3%80%81%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E4%B8%AD%E3%81%AB%20DSPI_MasterTransferBlocking()%20%E5%86%85%E3%81%AB%E3%83%96%E3%83%AC%E3%83%BC%E3%82%AF%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E5%95%8F%E9%A1%8C%E3%82%92%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%3C%2FP%3E%3CP%3Estatus_t%20DSPI_MasterTransferBlocking(dspi_instance_t%20instance%2C%3CBR%20%2F%3E%20const%20void%20*%20sendBuffer%E3%80%81%3CBR%20%2F%3E%20void%20*%20receiveBuffer%E3%80%81%3CBR%20%2F%3E%20uint16_t%20%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%80%81%3CBR%20%2F%3E%20uint32_t%20%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88)%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3EDEV_ASSERT((uint32_t)instance%20%26lt%3B%20(SPI_INSTANCE_COUNT%20%2B%20DSPI_INSTANCE_COUNT))%3B%3C%2FP%3E%3CP%3Estatus_t%20%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%3B%3CBR%20%2F%3E%20dspi_state_t%20*%20state%20%3D%20DSPI_state%5Binstance%5D%3B%3C%2FP%3E%3CP%3Eif%20(state-%26gt%3Bstatus%20%3D%3D%20DSPI_IN_PROGRESS)%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3ESTATUS_BUSY%20%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%20%7D%3C%2FP%3E%3CP%3Estate-%26gt%3BisBlocking%20%3D%20true%3B%3CBR%20%2F%3E%20(void)OSIF_SemaWait(%26amp%3B(state-%26gt%3BdspiSemaphore)%2C%200)%3B%3CBR%20%2F%3E%20status%20%3D%20DSPI_MasterTransfer(instance%2C%20sendBuffer%2C%20receiveBuffer%2C%20frames)%3B%3CBR%20%2F%3E%20if%20(status%20%3D%3D%20STATUS_SUCCESS)%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3Estatus%20%3D%20OSIF_SemaWait(%26amp%3B(state-%26gt%3BdspiSemaphore)%2C%20timeout)%3B%3CBR%20%2F%3E%20if%20(status%20!%3D%20STATUS_SUCCESS)%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3E(void)DSPI_AbortTransfer(instance)%3B%3CBR%20%2F%3E%20state-%26gt%3Bstatus%20%3D%20DSPI_TRANSFER_FAIL%3B%3C%2FP%3E%3CP%3E%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%20%7D%3CBR%20%2F%3E%20%7D%3C%2FP%3E%3CP%3ESTATUS_SUCCESS%20%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%20%7D%3CBR%20%2F%3E%3CBR%20%2F%3E%20dspi%E8%BB%A2%E9%80%81%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%81%AF%E6%88%90%E5%8A%9F%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8C%E3%80%81dspi%E8%BB%A2%E9%80%81%E5%BE%8C%E3%81%AE%E3%80%8COSIF_SemaWait%E3%80%8D%E3%81%8C%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%3C%2FP%3E%3C%2FLINGO-BODY%3E