/*! ---------------------------------------------------------------------------- * @file deca_spi.c * @brief SPI access functions * * @attention * * Copyright 2013 (c) DecaWave Ltd, Dublin, Ireland. * * All rights reserved. * * @author DecaWave */ #include #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; iDR = headerBuffer[i]; while ((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET); SPIx->DR ; } for(i=0; iDR = 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; iDR = 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; iDR = 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()