DSPI Communication timeout issue

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

DSPI Communication timeout issue

111 次查看
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 项奖励
回复
1 回复

33 次查看
petervlna
NXP TechSupport
NXP TechSupport

Hello,

Based on the description, the DSPI transfer itself appears to be started successfully, because DSPI_MasterTransfer() returns STATUS_SUCCESS. The timeout occurs later while DSPI_MasterTransferBlocking() is waiting on OSIF_SemaWait() for the transfer-complete notification.

Therefore, this symptom is more likely related to the interrupt/completion handling path than to a basic DSPI start failure. In the blocking DSPI API, the transfer is started and the caller waits until the DSPI interrupt/callback path releases the semaphore. If the semaphore is not released before the timeout expires, the API reports timeout and aborts the transfer.

The fact that the issue appears only under heavy CAN interrupt load is an important clue. If CAN and DSPI interrupts are configured with the same priority, continuous CAN interrupt activity can delay DSPI interrupt servicing. For short EEPROM reads, the DSPI transaction completes very quickly, so the final DSPI interrupt and semaphore release are timing-sensitive. A longer 256-byte page read keeps the DSPI transaction active for longer and may allow the driver’s interrupt handling path to progress differently, which can explain why the larger transfer completes while the short transfer times out.

Recommended checks:

  1. Configure the DSPI interrupt with higher priority than the CAN RX interrupt and repeat the test.
  2. Keep the CAN ISR as short as possible. Move CAN frame processing out of the ISR into a task/main-loop context if possible.
  3. Verify that the DSPI ISR is entered in the failing case.
  4. Verify that the DSPI transfer-complete callback or completion path releases state->dspiSemaphore.
  5. Toggle GPIOs or use trace points in:
    1. CAN RX ISR entry/exit
    2. DSPI ISR entry/exit
    3. DSPI transfer-complete callback
    4. before and after OSIF_SemaWait()
  6. Check that the blocking DSPI API is not called from an ISR or from any context where the DSPI interrupt cannot run.
  7. As a diagnostic experiment, try a polling-based DSPI transfer or DMA-based DSPI transfer. If polling/DMA works under the same CAN load, it further supports that the issue is in interrupt scheduling/completion handling rather than in the SPI bus itself.
  8. For EEPROM accesses, also confirm that the small-read sequence keeps the required command/address/dummy/read phase and chip-select behavior according to the EEPROM protocol. However, since the failure is reported at the semaphore wait, the first focus should be the DSPI completion interrupt path.

In summary, the most likely direction is interrupt starvation or missed/delayed DSPI completion handling under high CAN interrupt load. The first practical test should be to raise the DSPI interrupt priority above CAN and instrument whether the DSPI ISR/callback posts the semaphore in the failing case.

Best regards,

Peter

0 项奖励
回复
%3CLINGO-SUB%20id%3D%22lingo-sub-2399953%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EDSPI%20%E9%80%9A%E4%BF%A1%E8%B6%85%E6%97%B6%E9%97%AE%E9%A2%98%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2399953%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E6%88%91%E6%AD%A3%E5%9C%A8%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%3CSTRONG%3ESPI%20EEPROM%3C%2FSTRONG%3E%E7%9A%84%3CSTRONG%3EMPC5775B%3C%2FSTRONG%3E%E5%BE%AE%E6%8E%A7%E5%88%B6%E5%99%A8%E3%80%82%E5%9C%A8%E6%88%91%E7%9A%84%E5%BA%94%E7%94%A8%E4%B8%AD%EF%BC%8CCAN%20%E6%B6%88%E6%81%AF%E9%80%9A%E8%BF%87%3CSTRONG%3E%E4%B8%AD%E6%96%AD%3C%2FSTRONG%3E%E6%8C%81%E7%BB%AD%E6%8E%A5%E6%94%B6%EF%BC%8C%E4%B8%8E%20EEPROM%20%E7%9A%84%20SPI%20%E9%80%9A%E4%BF%A1%E4%B9%9F%E6%98%AF%3CSTRONG%3E%E9%80%9A%E8%BF%87%E4%B8%AD%E6%96%AD%E9%A9%B1%E5%8A%A8%E7%9A%84%3C%2FSTRONG%3E%E3%80%82%3C%2FP%3E%3CP%3E%E5%9C%A8%20CAN%20%E6%80%BB%E7%BA%BF%E6%B5%81%E9%87%8F%E8%BE%83%E5%A4%A7%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%88%E4%BE%8B%E5%A6%82%EF%BC%8C%E6%AF%8F%201%20%E6%AF%AB%E7%A7%92%E6%8E%A5%E6%94%B6%205%20%E4%B8%AA%20CAN%20ID%EF%BC%89%EF%BC%8C%E4%BB%BB%E4%BD%95%20EEPROM%20%E8%AF%BB%E5%8F%96%E6%93%8D%E4%BD%9C%E9%83%BD%E4%BC%9A%E5%BC%80%E5%A7%8B%E8%B6%85%E6%97%B6%E3%80%82%E6%88%91%E6%AD%A3%E5%9C%A8%E4%BD%BF%E7%94%A8%3CSTRONG%3EDSPI_MasterTransferBlocking()%3C%2FSTRONG%3E%20API%EF%BC%8C%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4%E4%B8%BA%3CSTRONG%3E10%20%E6%AF%AB%E7%A7%92%3C%2FSTRONG%3E%E3%80%82%E6%88%91%E8%BF%98%E5%B0%9D%E8%AF%95%E5%A4%A7%E5%B9%85%E5%A2%9E%E5%8A%A0%E8%B6%85%E6%97%B6%E5%80%BC%EF%BC%8C%E4%BD%86%E8%AF%BB%E5%8F%96%E6%93%8D%E4%BD%9C%E4%BB%8D%E7%84%B6%E5%A4%B1%E8%B4%A5%E3%80%82%3C%2FP%3E%3CP%3E%E6%9C%89%E8%B6%A3%E7%9A%84%E6%98%AF%EF%BC%8C%E8%BF%99%E7%A7%8D%E8%A1%8C%E4%B8%BA%E5%8F%96%E5%86%B3%E4%BA%8E%E8%AF%BB%E5%8F%96%E7%9A%84%E6%95%B0%E6%8D%AE%E9%87%8F%E3%80%82%E5%BD%93%E6%88%91%E5%B0%9D%E8%AF%95%E4%BB%8E%20EEPROM%20%E4%B8%AD%E8%AF%BB%E5%8F%96%E5%87%A0%E4%B8%AA%E5%AD%97%E8%8A%82%E6%97%B6%EF%BC%8CSPI%20%E4%BC%A0%E8%BE%93%E8%B6%85%E6%97%B6%E3%80%82%E4%BD%86%E6%98%AF%EF%BC%8C%E5%BD%93%E6%88%91%E8%AF%BB%E5%8F%96%E6%95%B4%E4%B8%AA%20EEPROM%20%E9%A1%B5%EF%BC%88256%20%E5%AD%97%E8%8A%82%EF%BC%89%E6%97%B6%EF%BC%8C%E8%AF%BB%E5%8F%96%E6%93%8D%E4%BD%9C%E6%88%90%E5%8A%9F%E5%AE%8C%E6%88%90%E3%80%82%3C%2FP%3E%3CP%3E%E6%88%91%E8%BF%98%E8%A7%82%E5%AF%9F%E5%88%B0%EF%BC%8C%E5%A6%82%E6%9E%9C%20CAN%20%E9%80%9A%E4%BF%A1%E5%81%9C%E6%AD%A2%EF%BC%8CEEPROM%20%E8%AF%BB%E5%8F%96%E6%93%8D%E4%BD%9C%E5%8F%AF%E4%BB%A5%E9%A1%BA%E5%88%A9%E5%AE%8C%E6%88%90%EF%BC%8C%E6%B2%A1%E6%9C%89%E4%BB%BB%E4%BD%95%E9%97%AE%E9%A2%98%E3%80%82%E6%88%91%E5%B7%B2%E9%AA%8C%E8%AF%81%E4%B8%AD%E6%96%AD%E4%BC%98%E5%85%88%E7%BA%A7%EF%BC%8CCAN%20%E5%92%8C%20SPI%20%E4%B8%AD%E6%96%AD%E9%83%BD%E9%85%8D%E7%BD%AE%E4%B8%BA%E7%9B%B8%E5%90%8C%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7%EF%BC%88%E4%BC%98%E5%85%88%E7%BA%A7%200%EF%BC%89%E3%80%82%3C%2FP%3E%3CP%3E%E6%88%91%E6%83%B3%E4%BA%86%E8%A7%A3%EF%BC%9A%3C%2FP%3E%3CUL%3E%3CLI%3E%3CP%3E%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%20CAN%20%E4%B8%AD%E6%96%AD%E8%B4%9F%E8%BD%BD%E8%BE%83%E5%A4%A7%E6%97%B6%EF%BC%8C%E5%B0%8F%E5%B0%BA%E5%AF%B8%20SPI%20EEPROM%20%E8%AF%BB%E5%8F%96%E6%93%8D%E4%BD%9C%E4%BC%9A%E8%B6%85%E6%97%B6%EF%BC%8C%E8%80%8C%E5%A4%A7%E5%B0%BA%E5%AF%B8%EF%BC%88256%20%E5%AD%97%E8%8A%82%EF%BC%89%E9%A1%B5%E9%9D%A2%E8%AF%BB%E5%8F%96%E5%8D%B4%E8%83%BD%E6%88%90%E5%8A%9F%E5%AE%8C%E6%88%90%EF%BC%9F%3C%2FP%3E%3C%2FLI%3E%3CLI%3E%3CP%3E%E8%BF%99%E6%98%AF%E5%90%A6%E4%B8%8E%E4%B8%AD%E6%96%AD%E9%A5%A5%E9%A5%BF%E3%80%81DSPI_MasterTransferBlocking()%20%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%88%96%20CAN%20%E5%92%8C%20DSPI%20%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86%E7%A8%8B%E5%BA%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E4%BA%A4%E4%BA%92%E6%9C%89%E5%85%B3%EF%BC%9F%3C%2FP%3E%3C%2FLI%3E%3CLI%3E%3CP%3E%E5%9C%A8%20MPC5775B%20%E4%B8%8A%E5%90%8C%E6%97%B6%E4%BD%BF%E7%94%A8%E4%B8%AD%E6%96%AD%E9%A9%B1%E5%8A%A8%E7%9A%84%20DSPI%20%E4%BC%A0%E8%BE%93%E5%92%8C%E9%AB%98%E9%A2%91%20CAN%20%E4%B8%AD%E6%96%AD%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E4%BB%BB%E4%BD%95%E5%B7%B2%E7%9F%A5%E7%9A%84%E9%99%90%E5%88%B6%E6%88%96%E6%8E%A8%E8%8D%90%E9%85%8D%E7%BD%AE%EF%BC%9F%3C%2FP%3E%3C%2FLI%3E%3C%2FUL%3E%3CP%3E%E6%AD%A4%E5%A4%96%EF%BC%8C%E6%88%91%E5%9C%A8%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%80%9A%E8%BF%87%E5%9C%A8%20DSPI_MasterTransferBlocking()%20%E5%87%BD%E6%95%B0%E5%86%85%E9%83%A8%E8%AE%BE%E7%BD%AE%E6%96%AD%E7%82%B9%E6%9D%A5%E8%B0%83%E8%AF%95%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%E3%80%82%3C%2FP%3E%3CP%3Estatus_t%20DSPI_MasterTransferBlocking(dspi_instance_t%20instance%2C%3CBR%20%2F%3E%20const%20void%20*%20sendBuffer%2C%3CBR%20%2F%3E%20void%20*%20receiveBuffer%EF%BC%8C%3CBR%20%2F%3E%20uint16_t%20%E5%B8%A7%EF%BC%8C%3CBR%20%2F%3E%20uint32_t%20%E8%B6%85%E6%97%B6)%3CBR%20%2F%3E%20%7B%3CBR%20%2F%3E%20DEV_ASSERT((uint32_t)%E5%AE%9E%E4%BE%8B%20%26lt%3B%20(SPI_INSTANCE_COUNT%20%2B%20DSPI_INSTANCE_COUNT))%3B%3C%2FP%3E%3CP%3Estatus_t%20status%3B%3CBR%20%2F%3E%20dspi_state_t%20*%20state%20%3D%20DSPI_state%5Binstance%5D%3B%3C%2FP%3E%3CP%3E%E5%A6%82%E6%9E%9C%20(state-%26gt%3Bstatus%20%3D%3D%20DSPI_IN_PROGRESS)%3CBR%20%2F%3E%20%7B%3CBR%20%2F%3E%E8%BF%94%E5%9B%9E%20STATUS_BUSY%EF%BC%9B%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%E5%A6%82%E6%9E%9C%EF%BC%88%E7%8A%B6%E6%80%81%20%3D%3D%20STATUS_SUCCESS%EF%BC%89%3CBR%20%2F%3E%20%7B%3CBR%20%2F%3E%20status%20%3D%20OSIF_SemaWait(%26amp%3B(state-%26gt%3BdspiSemaphore)%2C%20timeout)%3B%3CBR%20%2F%3E%E5%A6%82%E6%9E%9C%EF%BC%88%E7%8A%B6%E6%80%81%20!%3D%20STATUS_SUCCESS%EF%BC%89%3CBR%20%2F%3E%20%7B%3CBR%20%2F%3E%20(void)DSPI_AbortTransfer(%E5%AE%9E%E4%BE%8B)%3B%3CBR%20%2F%3E%20state-%26gt%3Bstatus%20%3D%20DSPI_TRANSFER_FAIL%3B%3C%2FP%3E%3CP%3E%E8%BF%94%E5%9B%9E%E7%8A%B6%E6%80%81%EF%BC%9B%3CBR%20%2F%3E%20%7D%3CBR%20%2F%3E%20%7D%3C%2FP%3E%3CP%3E%E8%BF%94%E5%9B%9E%20STATUS_SUCCESS%EF%BC%9B%3CBR%20%2F%3E%20%7D%3CBR%20%2F%3E%3CBR%20%2F%3E%20dspi%20%E4%BC%A0%E8%BE%93%E7%8A%B6%E6%80%81%E6%98%BE%E7%A4%BA%E6%88%90%E5%8A%9F%EF%BC%8C%E4%BD%86%20dspi%20%E4%BC%A0%E8%BE%93%E5%90%8E%E5%87%BA%E7%8E%B0%E2%80%9COSIF_SemaWait%E2%80%9D%E8%B6%85%E6%97%B6%E3%80%82%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2401347%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20DSPI%20Communication%20timeout%20issue%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2401347%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E4%BD%A0%E5%A5%BD%EF%BC%8C%3C%2FP%3E%0A%3CP%3E%E6%A0%B9%E6%8D%AE%E6%8F%8F%E8%BF%B0%EF%BC%8CDSPI%20%E4%BC%A0%E8%BE%93%E6%9C%AC%E8%BA%AB%E4%BC%BC%E4%B9%8E%E5%B7%B2%E6%88%90%E5%8A%9F%E5%90%AF%E5%8A%A8%EF%BC%8C%E5%9B%A0%E4%B8%BA%20DSPI_MasterTransfer()%20%E8%BF%94%E5%9B%9E%20STATUS_SUCCESS%E3%80%82%E8%B6%85%E6%97%B6%E5%8F%91%E7%94%9F%E5%9C%A8%20DSPI_MasterTransferBlocking()%20%E7%AD%89%E5%BE%85%20OSIF_SemaWait()%20%E8%8E%B7%E5%8F%96%E4%BC%A0%E8%BE%93%E5%AE%8C%E6%88%90%E9%80%9A%E7%9F%A5%E7%9A%84%E6%97%B6%E5%80%99%E3%80%82%3C%2FP%3E%0A%3CP%3E%E5%9B%A0%E6%AD%A4%EF%BC%8C%E8%AF%A5%E7%97%87%E7%8A%B6%E6%9B%B4%E6%9C%89%E5%8F%AF%E8%83%BD%E4%B8%8E%E4%B8%AD%E6%96%AD%2F%E5%AE%8C%E6%88%90%E5%A4%84%E7%90%86%E8%B7%AF%E5%BE%84%E6%9C%89%E5%85%B3%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E4%B8%8E%E5%9F%BA%E6%9C%AC%E7%9A%84%20DSPI%20%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5%E6%9C%89%E5%85%B3%E3%80%82%E5%9C%A8%E9%98%BB%E5%A1%9E%E5%BC%8F%20DSPI%20API%20%E4%B8%AD%EF%BC%8C%E4%BC%A0%E8%BE%93%E5%BC%80%E5%A7%8B%E5%90%8E%EF%BC%8C%E8%B0%83%E7%94%A8%E8%80%85%E4%BC%9A%E7%AD%89%E5%BE%85%20DSPI%20%E4%B8%AD%E6%96%AD%2F%E5%9B%9E%E8%B0%83%E8%B7%AF%E5%BE%84%E7%89%88%E6%9C%AC%E4%BF%A1%E5%8F%B7%E9%87%8F%E3%80%82%E5%A6%82%E6%9E%9C%E5%9C%A8%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4%E5%88%B0%E6%9C%9F%E4%B9%8B%E5%89%8D%E4%BF%A1%E5%8F%B7%E9%87%8F%E6%B2%A1%E6%9C%89%E7%89%88%E6%9C%AC%EF%BC%8CAPI%20%E5%B0%86%E6%8A%A5%E5%91%8A%E8%B6%85%E6%97%B6%E5%B9%B6%E4%B8%AD%E6%AD%A2%E4%BC%A0%E8%BE%93%E3%80%82%3C%2FP%3E%0A%3CP%3E%E8%AF%A5%E9%97%AE%E9%A2%98%E4%BB%85%E5%9C%A8%20CAN%20%E4%B8%AD%E6%96%AD%E8%B4%9F%E8%BD%BD%E8%BE%83%E9%AB%98%E6%97%B6%E6%89%8D%E4%BC%9A%E5%87%BA%E7%8E%B0%EF%BC%8C%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E9%87%8D%E8%A6%81%E7%9A%84%E7%BA%BF%E7%B4%A2%E3%80%82%E5%A6%82%E6%9E%9C%20CAN%20%E5%92%8C%20DSPI%20%E4%B8%AD%E6%96%AD%E9%85%8D%E7%BD%AE%E4%B8%BA%E7%9B%B8%E5%90%8C%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7%EF%BC%8C%E5%88%99%E6%8C%81%E7%BB%AD%E7%9A%84%20CAN%20%E4%B8%AD%E6%96%AD%E6%B4%BB%E5%8A%A8%E5%8F%AF%E8%83%BD%E4%BC%9A%E5%BB%B6%E8%BF%9F%20DSPI%20%E4%B8%AD%E6%96%AD%E6%9C%8D%E5%8A%A1%E3%80%82%E5%AF%B9%E4%BA%8E%E7%9F%AD%E7%9A%84%20EEPROM%20%E8%AF%BB%E5%8F%96%EF%BC%8CDSPI%20%E4%BA%8B%E5%8A%A1%E5%AE%8C%E6%88%90%E5%BE%97%E9%9D%9E%E5%B8%B8%E5%BF%AB%EF%BC%8C%E5%9B%A0%E6%AD%A4%E6%9C%80%E7%BB%88%E7%9A%84%20DSPI%20%E4%B8%AD%E6%96%AD%E5%92%8C%E4%BF%A1%E5%8F%B7%E9%87%8F%E7%89%88%E6%9C%AC%E5%AF%B9%E6%97%B6%E9%97%B4%E9%9D%9E%E5%B8%B8%E6%95%8F%E6%84%9F%E3%80%82%E8%BE%83%E9%95%BF%E7%9A%84%20256%20%E5%AD%97%E8%8A%82%E9%A1%B5%E9%9D%A2%E8%AF%BB%E5%8F%96%E4%BC%9A%E4%BD%BF%20DSPI%20%E4%BA%8B%E5%8A%A1%E4%BF%9D%E6%8C%81%E6%B4%BB%E5%8A%A8%E7%8A%B6%E6%80%81%E6%9B%B4%E9%95%BF%E6%97%B6%E9%97%B4%EF%BC%8C%E5%B9%B6%E5%8F%AF%E8%83%BD%E5%85%81%E8%AE%B8%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86%E8%B7%AF%E5%BE%84%E4%BB%A5%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%B9%E5%BC%8F%E8%BF%9B%E8%A1%8C%EF%BC%8C%E8%BF%99%E5%8F%AF%E4%BB%A5%E8%A7%A3%E9%87%8A%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BE%83%E5%A4%A7%E7%9A%84%E4%BC%A0%E8%BE%93%E4%BC%9A%E5%AE%8C%E6%88%90%E8%80%8C%E8%BE%83%E5%B0%8F%E7%9A%84%E4%BC%A0%E8%BE%93%E4%BC%9A%E8%B6%85%E6%97%B6%E3%80%82%3C%2FP%3E%0A%3CP%3E%E5%BB%BA%E8%AE%AE%E6%A3%80%E6%9F%A5%E7%9A%84%E9%A1%B9%E7%9B%AE%EF%BC%9A%3C%2FP%3E%0A%3COL%3E%0A%3CLI%3E%E9%85%8D%E7%BD%AE%20DSPI%20%E4%B8%AD%E6%96%AD%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7%E9%AB%98%E4%BA%8E%20CAN%20RX%20%E4%B8%AD%E6%96%AD%EF%BC%8C%E7%84%B6%E5%90%8E%E9%87%8D%E5%A4%8D%E6%B5%8B%E8%AF%95%E3%80%82%3C%2FLI%3E%0A%3CLI%3E%E5%B0%BD%E9%87%8F%E7%BC%A9%E7%9F%AD%20CAN%20ISR%20%E7%9A%84%E6%89%A7%E8%A1%8C%E6%97%B6%E9%97%B4%E3%80%82%E5%A6%82%E6%9E%9C%E5%8F%AF%E8%83%BD%EF%BC%8C%E5%B0%86%20CAN%20%E5%B8%A7%E5%A4%84%E7%90%86%E4%BB%8E%20ISR%20%E7%A7%BB%E5%88%B0%E4%BB%BB%E5%8A%A1%2F%E4%B8%BB%E5%BE%AA%E7%8E%AF%E4%B8%8A%E4%B8%8B%E6%96%87%E4%B8%AD%E3%80%82%3C%2FLI%3E%0A%3CLI%3E%E7%A1%AE%E8%AE%A4%E5%9C%A8%E6%95%85%E9%9A%9C%E6%83%85%E5%86%B5%E4%B8%8B%E6%98%AF%E5%90%A6%E5%B7%B2%E8%BF%9B%E5%85%A5%20DSPI%20ISR%E3%80%82%3C%2FLI%3E%0A%3CLI%3E%E9%AA%8C%E8%AF%81%20DSPI%20%E4%BC%A0%E8%BE%93%E5%AE%8C%E6%88%90%E5%9B%9E%E8%B0%83%E6%88%96%E5%AE%8C%E6%88%90%E8%B7%AF%E5%BE%84%E6%98%AF%E5%90%A6%E7%89%88%E6%9C%AC%20state-%26gt%3BdspiSemaphore%E3%80%82%0A%0A%5B%5B%20%23%23%20completed%20%23%23%5D%5D%3C%2FLI%3E%0A%3CLI%3E%E5%88%87%E6%8D%A2%20GPIO%20%E6%88%96%E4%BD%BF%E7%94%A8%E8%B7%9F%E8%B8%AA%E7%82%B9%EF%BC%9A%0A%3COL%3E%0A%3CLI%3ECAN%20RX%20ISR%20%E5%85%A5%E5%8F%A3%2F%E5%87%BA%E5%8F%A3%3C%2FLI%3E%0A%3CLI%3EDSPI%20ISR%20%E5%87%BA%E5%85%A5%E5%8F%A3%3C%2FLI%3E%0A%3CLI%3EDSPI%20%E4%BC%A0%E8%BE%93%E5%AE%8C%E6%88%90%E5%9B%9E%E8%B0%83%3C%2FLI%3E%0A%3CLI%3E%E5%9C%A8%20OSIF_SemaWait()%20%E4%B9%8B%E5%89%8D%E5%92%8C%E4%B9%8B%E5%90%8E%3C%2FLI%3E%0A%3C%2FOL%3E%0A%3C%2FLI%3E%0A%3CLI%3E%E6%A3%80%E6%9F%A5%E9%98%BB%E5%A1%9E%E5%BC%8F%20DSPI%20API%20%E6%98%AF%E5%90%A6%E4%B8%8D%E6%98%AF%E4%BB%8E%20ISR%20%E6%88%96%E4%BB%BB%E4%BD%95%20DSPI%20%E4%B8%AD%E6%96%AD%E6%97%A0%E6%B3%95%E8%BF%90%E8%A1%8C%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87%E4%B8%AD%E8%B0%83%E7%94%A8%E7%9A%84%E3%80%82%3C%2FLI%3E%0A%3CLI%3E%E4%BD%9C%E4%B8%BA%E8%AF%8A%E6%96%AD%E5%AE%9E%E9%AA%8C%EF%BC%8C%E5%B0%9D%E8%AF%95%E5%9F%BA%E4%BA%8E%E8%BD%AE%E8%AF%A2%E7%9A%84%20DSPI%20%E4%BC%A0%E8%BE%93%E6%88%96%E5%9F%BA%E4%BA%8E%20DMA%20%E7%9A%84%20DSPI%20%E4%BC%A0%E8%BE%93%E3%80%82%E5%A6%82%E6%9E%9C%E8%BD%AE%E8%AF%A2%2FDMA%20%E5%9C%A8%E7%9B%B8%E5%90%8C%E7%9A%84%20CAN%20%E8%B4%9F%E8%BD%BD%E4%B8%8B%E5%B7%A5%E4%BD%9C%EF%BC%8C%E5%88%99%E8%BF%9B%E4%B8%80%E6%AD%A5%E8%AF%81%E6%98%8E%E9%97%AE%E9%A2%98%E5%87%BA%E5%9C%A8%E4%B8%AD%E6%96%AD%E8%B0%83%E5%BA%A6%2F%E5%AE%8C%E6%88%90%E5%A4%84%E7%90%86%E4%B8%8A%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%20SPI%20%E6%80%BB%E7%BA%BF%E6%9C%AC%E8%BA%AB%E3%80%82%3C%2FLI%3E%0A%3CLI%3E%E5%AF%B9%E4%BA%8E%20EEPROM%20%E8%AE%BF%E9%97%AE%EF%BC%8C%E8%BF%98%E8%A6%81%E7%A1%AE%E8%AE%A4%E5%B0%8F%E8%AF%BB%E5%8F%96%E5%BA%8F%E5%88%97%E6%98%AF%E5%90%A6%E6%8C%89%E7%85%A7%20EEPROM%20%E5%8D%8F%E8%AE%AE%E4%BF%9D%E6%8C%81%E6%89%80%E9%9C%80%E7%9A%84%E5%91%BD%E4%BB%A4%2F%E5%9C%B0%E5%9D%80%2F%E8%99%9A%E6%8B%9F%2F%E8%AF%BB%E5%8F%96%E9%98%B6%E6%AE%B5%E5%92%8C%E7%89%87%E9%80%89%E8%A1%8C%E4%B8%BA%E3%80%82%E7%84%B6%E8%80%8C%EF%BC%8C%E7%94%B1%E4%BA%8E%E6%95%85%E9%9A%9C%E6%98%AF%E5%9C%A8%E4%BF%A1%E5%8F%B7%E9%87%8F%E7%AD%89%E5%BE%85%E6%97%B6%E6%8A%A5%E5%91%8A%E7%9A%84%EF%BC%8C%E5%9B%A0%E6%AD%A4%E9%A6%96%E5%85%88%E5%BA%94%E8%AF%A5%E5%85%B3%E6%B3%A8%E7%9A%84%E6%98%AF%20DSPI%20%E5%AE%8C%E6%88%90%E4%B8%AD%E6%96%AD%E8%B7%AF%E5%BE%84%E3%80%82%3C%2FLI%3E%0A%3C%2FOL%3E%0A%3CP%3E%E7%BB%BC%E4%B8%8A%E6%89%80%E8%BF%B0%EF%BC%8C%E6%9C%80%E5%8F%AF%E8%83%BD%E7%9A%84%E6%96%B9%E5%90%91%E6%98%AF%20CAN%20%E4%B8%AD%E6%96%AD%E8%B4%9F%E8%BD%BD%E8%BF%87%E9%AB%98%E6%97%B6%E4%B8%AD%E6%96%AD%E9%A5%A5%E9%A5%BF%E6%88%96%20DSPI%20%E5%AE%8C%E6%88%90%E5%A4%84%E7%90%86%E4%B8%A2%E5%A4%B1%2F%E5%BB%B6%E8%BF%9F%E3%80%82%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AE%9E%E9%99%85%E6%B5%8B%E8%AF%95%E5%BA%94%E8%AF%A5%E6%98%AF%E5%B0%86%20DSPI%20%E4%B8%AD%E6%96%AD%E4%BC%98%E5%85%88%E7%BA%A7%E6%8F%90%E9%AB%98%E5%88%B0%20CAN%20%E4%B9%8B%E4%B8%8A%EF%BC%8C%E5%B9%B6%E6%A3%80%E6%B5%8B%20DSPI%20ISR%2F%E5%9B%9E%E8%B0%83%E5%9C%A8%E5%A4%B1%E8%B4%A5%E6%83%85%E5%86%B5%E4%B8%8B%E6%98%AF%E5%90%A6%E5%8F%91%E5%B8%83%E4%BF%A1%E5%8F%B7%E9%87%8F%E3%80%82%3C%2FP%3E%0A%3CP%3E%E9%A1%BA%E7%A5%9D%E5%95%86%E7%A5%BA%EF%BC%81%3C%2FP%3E%0A%3CP%3EPeter%3C%2FP%3E%3C%2FLINGO-BODY%3E