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.

CC2640: Send longer than 8 bytes data by SPI+DMA

Part Number: CC2640

Hi

I use SPI slave + DMA to send data.  It's running well if data length shorter than 8 bytes. It will lose data if length longer than 8 types. Could you let me know to handle when longer than 8 bytes? Thanks.

void NPITLSPI_initializeTransport(Char *tRxBuf, Char *tTxBuf, npiCB_t npiCBack)

{

    SPI_Params spiParams;

 

    TransportRxBuf = tRxBuf;

    TransportTxBuf = tTxBuf;

    npiTransmitCB = npiCBack;

 

    // Configure SPI parameters

    SPI_Params_init(&spiParams);

 

    // Slave mode

    spiParams.mode = SPI_SLAVE;

    spiParams.bitRate = SPI_SLAVE_BAUD_RATE;

    spiParams.frameFormat = SPI_POL1_PHA1;

    spiParams.transferMode = SPI_MODE_CALLBACK;

    spiParams.transferCallbackFxn = NPITLSPI_CallBack;

 

    // Attempt to open SPI

    spiHandle = SPI_open(NPI_SPI_CONFIG, &spiParams);

    return;

}

 

 

static void NPITLSPI_CallBack(SPI_Handle handle, SPI_Transaction  *objTransaction)

{

    uint8 i;

    uint16 readLen = 0;

    uint16 storeTxLen = TransportTxBufLen;

   

    //Reand one byte data

    readLen = spiTransaction.count;

     //All bytes in TxBuf must be sent by this point

    //TransportTxBufLen = 0;  

    

    if ( npiTransmitCB )

    {

        npiTransmitCB(readLen,storeTxLen);

    }

   

    //if(spiTransaction.count > readLen)

    if(!SS_IS_READY)

    //if(!NPITL_checkNpiBusy())

    {

                   //Set DMA after reading one byte data

                   //NPITLSPI_readTransport();

        //TransportTxBufLen = 0;

    }

   

    if(spiTransaction.count == TransportTxBufLen)

    {

        //NPITLSPI_readTransport();

    }

   

    //Set DMA after read one byte data

    //NPITLSPI_readTransport();

   

 

}

// -----------------------------------------------------------------------------

//! \brief      This routine reads data from the transport layer

//!             and places it into the buffer.

//!

//! \return     void

// -----------------------------------------------------------------------------

void NPITLSPI_readTransport()

{

    ICall_CSState key;

    key = ICall_enterCriticalSection();

 

    //TransportTxBufLen = 0;

 

    // Clear DMA Rx buffer and clear extra Tx buffer bytes to ensure clean buffer

    //    for next RX/TX

    memset(TransportRxBuf, 0, NPI_TL_BUF_SIZE);

    memset(&TransportTxBuf[TransportTxBufLen], 0, NPI_TL_BUF_SIZE - TransportTxBufLen);

 

    // set up the SPI Transaction

    spiTransaction.txBuf = TransportTxBuf;

    spiTransaction.rxBuf = TransportRxBuf;

   

    //Set DMA at 1 byte interruption

    //spiTransaction.count = NPI_TL_BUF_SIZE;

    spiTransaction.count = 1;

   

    if(TransportTxBufLen != 0)

    {

        spiTransaction.count = TransportTxBufLen;

        //TransportTxBufLen = 0;

    }

   

    SPI_transfer(spiHandle, &spiTransaction);

 

    ICall_leaveCriticalSection(key);

}