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);
}
