/*! ----------------------------------------------------------------------------
|
* @file deca_spi.c
|
* @brief SPI access functions
|
*
|
* @attention
|
*
|
* Copyright 2013 (c) DecaWave Ltd, Dublin, Ireland.
|
*
|
* All rights reserved.
|
*
|
* @author DecaWave
|
*/
|
#include <string.h>
|
|
#include "deca_spi.h"
|
#include "deca_sleep.h"
|
#include "deca_device_api.h"
|
#include "port.h"
|
|
|
int writetospi_serial( uint16_t headerLength,
|
const uint8_t *headerBuffer,
|
uint32_t bodylength,
|
const uint8_t *bodyBuffer
|
);
|
|
int readfromspi_serial( uint16_t headerLength,
|
const uint8_t *headerBuffer,
|
uint32_t readlength,
|
uint8_t *readBuffer );
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* Function: openspi()
|
*
|
* Low level abstract function to open and initialise access to the SPI device.
|
* returns 0 for success, or -1 for error
|
*/
|
int openspi(/*SPI_TypeDef* SPIx*/)
|
{
|
// done by port.c, default SPI used is SPI1
|
|
return 0;
|
|
} // end openspi()
|
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* Function: closespi()
|
*
|
* Low level abstract function to close the the SPI device.
|
* returns 0 for success, or -1 for error
|
*/
|
int closespi(void)
|
{
|
while (port_SPIx_busy_sending()); //wait for tx buffer to empty
|
|
port_SPIx_disable();
|
|
return 0;
|
|
} // end closespi()
|
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* Function: writetospi()
|
*
|
* Low level abstract function to write to the SPI
|
* Takes two separate byte buffers for write header and write data
|
* returns 0 for success, or -1 for error
|
*/
|
#pragma GCC optimize ("O3")
|
int writetospi_serial
|
(
|
uint16_t headerLength,
|
const uint8_t *headerBuffer,
|
uint32_t bodylength,
|
const uint8_t *bodyBuffer
|
)
|
{
|
|
int i=0;
|
|
decaIrqStatus_t stat ;
|
|
stat = decamutexon() ;
|
|
SPIx_CS_GPIO->BRR = SPIx_CS;
|
|
for(i=0; i<headerLength; i++)
|
{
|
SPIx->DR = headerBuffer[i];
|
|
while ((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
|
|
SPIx->DR ;
|
}
|
|
for(i=0; i<bodylength; i++)
|
{
|
SPIx->DR = bodyBuffer[i];
|
|
while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
|
|
SPIx->DR ;
|
}
|
|
SPIx_CS_GPIO->BSRR = SPIx_CS;
|
|
decamutexoff(stat) ;
|
|
return 0;
|
} // end writetospi()
|
|
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* Function: readfromspi()
|
*
|
* Low level abstract function to read from the SPI
|
* Takes two separate byte buffers for write header and read data
|
* returns the offset into read buffer where first byte of read data may be found,
|
* or returns -1 if there was an error
|
*/
|
#pragma GCC optimize ("O3")
|
int readfromspi_serial
|
(
|
uint16_t headerLength,
|
const uint8_t *headerBuffer,
|
uint32_t readlength,
|
uint8_t *readBuffer
|
)
|
{
|
|
int i=0;
|
|
decaIrqStatus_t stat ;
|
|
stat = decamutexon() ;
|
|
/* Wait for SPIx Tx buffer empty */
|
//while (port_SPIx_busy_sending());
|
|
SPIx_CS_GPIO->BRR = SPIx_CS;
|
|
for(i=0; i<headerLength; i++)
|
{
|
SPIx->DR = headerBuffer[i];
|
|
while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
|
|
readBuffer[0] = SPIx->DR ; // Dummy read as we write the header
|
}
|
|
for(i=0; i<readlength; i++)
|
{
|
SPIx->DR = 0; // Dummy write as we read the message body
|
|
while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
|
|
readBuffer[i] = SPIx->DR ;//port_SPIx_receive_data(); //this clears RXNE bit
|
}
|
|
SPIx_CS_GPIO->BSRR = SPIx_CS;
|
|
decamutexoff(stat) ;
|
|
return 0;
|
} // end readfromspi()
|