This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DRV8301: F28069M + drv8301 SPI communication integrity

Part Number: DRV8301
Other Parts Discussed in Thread: MOTORWARE

As I am working on communication with a different controller over SPI I'm having troubles with data integrity.
The motor controller communicates by default on SPIA (with the drv8301Boost on J1)
I have setup the SPIB channel for the communication with a TI infineon kit with my controller as a slave.

The code is based on lab 13c of motorware.

I wrote an RX interrupt routine which reads out a 4 words FIFO buffer.
I tried reading it out word by word or 2 or 4 words at the time.

The routine does this

interrupt void spiFIFORX_ISR(void)
{

    for (loop >=0 ; loop< 1; loop++){

      data[test123] = SPI_read(halHandle->spiBHandle);
      test123++;

    }
    if (test123 >= 40){



      test123 = 0;
    }
//    else{
//           //do nothing
//    }

    rx_cnt++;
    loop =0;

    SPI_clearRxFifoInt(halHandle->spiBHandle);
    SPI_clearRxFifoOvf(halHandle->spiBHandle);
    PIE_clearInt(halHandle->pieHandle,PIE_GroupNumber_6);

}

As you can see i read out 40 words in this case one at the time from a 4 word FIFO buffer at a speed of 1megabaut.
At the receiver side i send all 40 words with the push of 1 button/
When working correctly I get 40 interrupts and my data gets filled as planned.

The issue is when i repeat the send (and increasing my speed in pushing the button) i see the data integrity failing.
I than get 39 interrupts in like 10% of the cases.

When I set the motor controller to be active (with the run identify flag) it gets even worse.
Than every time i send data i miss like 5-10 interrupts.

I'm my interpretation that means the controller is busy with different interrupts with a higher priority I would say (?)

Any idea how i can maintain my data integrity 100% of the time? Because this communication line is very critical for the system I am developing.

for reference this is my SPIB setup.

void HAL_setupSpiB(HAL_Handle handle)
{
    HAL_Obj *obj = (HAL_Obj *)handle;

    SPI_reset(obj->spiBHandle);
    SPI_resetRxFifo(obj->spiBHandle);
    SPI_resetTxFifo(obj->spiBHandle);

    SPI_disableLoopBack(obj->spiBHandle);

    SPI_enableRxFifo(obj->spiBHandle);
    SPI_enableTxFifo(obj->spiBHandle);
    SPI_enableRxFifoInt(obj->spiBHandle);
    SPI_enableTxFifoInt(obj->spiBHandle);
    SPI_enableTxFifoEnh(obj->spiBHandle);

    SPI_setRxFifoIntLevel(obj->spiBHandle, SPI_FifoLevel_4_Words);
    SPI_setTxFifoIntLevel(obj->spiBHandle, SPI_FifoLevel_4_Words);
    //SPI_setBaudRate(obj->spiaHandle, SPI_BaudRate_1_MBaud);
    SPI_setCharLength(obj->spiBHandle, SPI_CharLength_16_Bits);
    SPI_setClkPhase(obj->spiBHandle, SPI_ClkPhase_Normal);
    SPI_setClkPolarity(obj->spiBHandle, SPI_ClkPolarity_OutputRisingEdge_InputFallingEdge);
    SPI_setMode(obj->spiBHandle, SPI_Mode_Slave);
    //SPI_setPriority(obj->spiBHandle, SPI_Priority_AfterRxRxSeq);
    SPI_setTxDelay(obj->spiBHandle,0x0000);

    SPI_enableInt(obj->spiBHandle);
    SPI_enable(obj->spiBHandle);


    PIE_enableInt(obj->pieHandle, PIE_GroupNumber_6, PIE_InterruptSource_SPIBRX);
    PIE_enableInt(obj->pieHandle, PIE_GroupNumber_6, PIE_InterruptSource_SPIBTX);
    CPU_enableInt(obj->cpuHandle, CPU_IntNumber_6); // enable SCI CPU interrupt

  return;
}  // end of HAL_setupSpiB() function

greetings,

Alain