Date: March 20, 2011 This library is created from "LPC17xx CMSIS-Compliant Standard Peripheral Firmware Driver Library (GNU, Keil, IAR) (Jan 28, 2011)", available from NXP's website, under "All microcontrollers support documents" [[http://ics.nxp.com/support/documents/microcontrollers/?type=software]] You will need to follow [[/projects/libraries/svn/mbed/trunk/LPC1768/LPC17xx.h]] while using this library Examples provided here [[/users/frank26080115/programs/LPC1700CMSIS_Examples/]] The beautiful thing is that NXP does not place copyright protection on any of the files in here Only a few modifications are made to make it compile with the mbed online compiler, I fixed some warnings as well. This is untested as of March 20, 2011 Forum post about this library: [[/forum/mbed/topic/2030/]]

Committer:
frank26080115
Date:
Sun Mar 20 18:45:15 2011 +0000
Revision:
0:84d7747641aa

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frank26080115 0:84d7747641aa 1 /***********************************************************************//**
frank26080115 0:84d7747641aa 2 * @file lpc17xx_spi.c
frank26080115 0:84d7747641aa 3 * @brief Contains all functions support for SPI firmware library on LPC17xx
frank26080115 0:84d7747641aa 4 * @version 2.0
frank26080115 0:84d7747641aa 5 * @date 21. May. 2010
frank26080115 0:84d7747641aa 6 * @author NXP MCU SW Application Team
frank26080115 0:84d7747641aa 7 **************************************************************************
frank26080115 0:84d7747641aa 8 * Software that is described herein is for illustrative purposes only
frank26080115 0:84d7747641aa 9 * which provides customers with programming information regarding the
frank26080115 0:84d7747641aa 10 * products. This software is supplied "AS IS" without any warranties.
frank26080115 0:84d7747641aa 11 * NXP Semiconductors assumes no responsibility or liability for the
frank26080115 0:84d7747641aa 12 * use of the software, conveys no license or title under any patent,
frank26080115 0:84d7747641aa 13 * copyright, or mask work right to the product. NXP Semiconductors
frank26080115 0:84d7747641aa 14 * reserves the right to make changes in the software without
frank26080115 0:84d7747641aa 15 * notification. NXP Semiconductors also make no representation or
frank26080115 0:84d7747641aa 16 * warranty that such application will be suitable for the specified
frank26080115 0:84d7747641aa 17 * use without further testing or modification.
frank26080115 0:84d7747641aa 18 **********************************************************************/
frank26080115 0:84d7747641aa 19
frank26080115 0:84d7747641aa 20 /* Peripheral group ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 21 /** @addtogroup SPI
frank26080115 0:84d7747641aa 22 * @{
frank26080115 0:84d7747641aa 23 */
frank26080115 0:84d7747641aa 24
frank26080115 0:84d7747641aa 25 /* Includes ------------------------------------------------------------------- */
frank26080115 0:84d7747641aa 26 #include "lpc17xx_spi.h"
frank26080115 0:84d7747641aa 27 #include "lpc17xx_clkpwr.h"
frank26080115 0:84d7747641aa 28
frank26080115 0:84d7747641aa 29 /* If this source file built with example, the LPC17xx FW library configuration
frank26080115 0:84d7747641aa 30 * file in each example directory ("lpc17xx_libcfg.h") must be included,
frank26080115 0:84d7747641aa 31 * otherwise the default FW library configuration file must be included instead
frank26080115 0:84d7747641aa 32 */
frank26080115 0:84d7747641aa 33 #ifdef __BUILD_WITH_EXAMPLE__
frank26080115 0:84d7747641aa 34 #include "lpc17xx_libcfg.h"
frank26080115 0:84d7747641aa 35 #else
frank26080115 0:84d7747641aa 36 #include "lpc17xx_libcfg_default.h"
frank26080115 0:84d7747641aa 37 #endif /* __BUILD_WITH_EXAMPLE__ */
frank26080115 0:84d7747641aa 38
frank26080115 0:84d7747641aa 39 #ifdef _SPI
frank26080115 0:84d7747641aa 40
frank26080115 0:84d7747641aa 41
frank26080115 0:84d7747641aa 42 /* Public Functions ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 43 /** @addtogroup SPI_Public_Functions
frank26080115 0:84d7747641aa 44 * @{
frank26080115 0:84d7747641aa 45 */
frank26080115 0:84d7747641aa 46
frank26080115 0:84d7747641aa 47 /*********************************************************************//**
frank26080115 0:84d7747641aa 48 * @brief Setup clock rate for SPI device
frank26080115 0:84d7747641aa 49 * @param[in] SPIx SPI peripheral definition, should be LPC_SPI
frank26080115 0:84d7747641aa 50 * @param[in] target_clock : clock of SPI (Hz)
frank26080115 0:84d7747641aa 51 * @return None
frank26080115 0:84d7747641aa 52 ***********************************************************************/
frank26080115 0:84d7747641aa 53 void SPI_SetClock (LPC_SPI_TypeDef *SPIx, uint32_t target_clock)
frank26080115 0:84d7747641aa 54 {
frank26080115 0:84d7747641aa 55 uint32_t spi_pclk;
frank26080115 0:84d7747641aa 56 uint32_t prescale, temp;
frank26080115 0:84d7747641aa 57
frank26080115 0:84d7747641aa 58 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 59
frank26080115 0:84d7747641aa 60 if (SPIx == LPC_SPI){
frank26080115 0:84d7747641aa 61 spi_pclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SPI);
frank26080115 0:84d7747641aa 62 } else {
frank26080115 0:84d7747641aa 63 return;
frank26080115 0:84d7747641aa 64 }
frank26080115 0:84d7747641aa 65
frank26080115 0:84d7747641aa 66 prescale = 8;
frank26080115 0:84d7747641aa 67 // Find closest clock to target clock
frank26080115 0:84d7747641aa 68 while (1){
frank26080115 0:84d7747641aa 69 temp = target_clock * prescale;
frank26080115 0:84d7747641aa 70 if (temp >= spi_pclk){
frank26080115 0:84d7747641aa 71 break;
frank26080115 0:84d7747641aa 72 }
frank26080115 0:84d7747641aa 73 prescale += 2;
frank26080115 0:84d7747641aa 74 if(prescale >= 254){
frank26080115 0:84d7747641aa 75 break;
frank26080115 0:84d7747641aa 76 }
frank26080115 0:84d7747641aa 77 }
frank26080115 0:84d7747641aa 78
frank26080115 0:84d7747641aa 79 // Write to register
frank26080115 0:84d7747641aa 80 SPIx->SPCCR = SPI_SPCCR_COUNTER(prescale);
frank26080115 0:84d7747641aa 81 }
frank26080115 0:84d7747641aa 82
frank26080115 0:84d7747641aa 83
frank26080115 0:84d7747641aa 84 /*********************************************************************//**
frank26080115 0:84d7747641aa 85 * @brief De-initializes the SPIx peripheral registers to their
frank26080115 0:84d7747641aa 86 * default reset values.
frank26080115 0:84d7747641aa 87 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 88 * @return None
frank26080115 0:84d7747641aa 89 **********************************************************************/
frank26080115 0:84d7747641aa 90 void SPI_DeInit(LPC_SPI_TypeDef *SPIx)
frank26080115 0:84d7747641aa 91 {
frank26080115 0:84d7747641aa 92 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 93
frank26080115 0:84d7747641aa 94 if (SPIx == LPC_SPI){
frank26080115 0:84d7747641aa 95 /* Set up clock and power for SPI module */
frank26080115 0:84d7747641aa 96 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSPI, DISABLE);
frank26080115 0:84d7747641aa 97 }
frank26080115 0:84d7747641aa 98 }
frank26080115 0:84d7747641aa 99
frank26080115 0:84d7747641aa 100 /*********************************************************************//**
frank26080115 0:84d7747641aa 101 * @brief Get data bit size per transfer
frank26080115 0:84d7747641aa 102 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 103 * @return number of bit per transfer, could be 8-16
frank26080115 0:84d7747641aa 104 **********************************************************************/
frank26080115 0:84d7747641aa 105 uint8_t SPI_GetDataSize (LPC_SPI_TypeDef *SPIx)
frank26080115 0:84d7747641aa 106 {
frank26080115 0:84d7747641aa 107 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 108 return ((SPIx->SPCR)>>8 & 0xF);
frank26080115 0:84d7747641aa 109 }
frank26080115 0:84d7747641aa 110
frank26080115 0:84d7747641aa 111 /********************************************************************//**
frank26080115 0:84d7747641aa 112 * @brief Initializes the SPIx peripheral according to the specified
frank26080115 0:84d7747641aa 113 * parameters in the UART_ConfigStruct.
frank26080115 0:84d7747641aa 114 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 115 * @param[in] SPI_ConfigStruct Pointer to a SPI_CFG_Type structure
frank26080115 0:84d7747641aa 116 * that contains the configuration information for the
frank26080115 0:84d7747641aa 117 * specified SPI peripheral.
frank26080115 0:84d7747641aa 118 * @return None
frank26080115 0:84d7747641aa 119 *********************************************************************/
frank26080115 0:84d7747641aa 120 void SPI_Init(LPC_SPI_TypeDef *SPIx, SPI_CFG_Type *SPI_ConfigStruct)
frank26080115 0:84d7747641aa 121 {
frank26080115 0:84d7747641aa 122 uint32_t tmp;
frank26080115 0:84d7747641aa 123
frank26080115 0:84d7747641aa 124 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 125
frank26080115 0:84d7747641aa 126 if(SPIx == LPC_SPI){
frank26080115 0:84d7747641aa 127 /* Set up clock and power for UART module */
frank26080115 0:84d7747641aa 128 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSPI, ENABLE);
frank26080115 0:84d7747641aa 129 } else {
frank26080115 0:84d7747641aa 130 return;
frank26080115 0:84d7747641aa 131 }
frank26080115 0:84d7747641aa 132
frank26080115 0:84d7747641aa 133 // Configure SPI, interrupt is disable as default
frank26080115 0:84d7747641aa 134 tmp = ((SPI_ConfigStruct->CPHA) | (SPI_ConfigStruct->CPOL) \
frank26080115 0:84d7747641aa 135 | (SPI_ConfigStruct->DataOrder) | (SPI_ConfigStruct->Databit) \
frank26080115 0:84d7747641aa 136 | (SPI_ConfigStruct->Mode) | SPI_SPCR_BIT_EN) & SPI_SPCR_BITMASK;
frank26080115 0:84d7747641aa 137 // write back to SPI control register
frank26080115 0:84d7747641aa 138 SPIx->SPCR = tmp;
frank26080115 0:84d7747641aa 139
frank26080115 0:84d7747641aa 140 // Set clock rate for SPI peripheral
frank26080115 0:84d7747641aa 141 SPI_SetClock(SPIx, SPI_ConfigStruct->ClockRate);
frank26080115 0:84d7747641aa 142
frank26080115 0:84d7747641aa 143 // If interrupt flag is set, Write '1' to Clear interrupt flag
frank26080115 0:84d7747641aa 144 if (SPIx->SPINT & SPI_SPINT_INTFLAG){
frank26080115 0:84d7747641aa 145 SPIx->SPINT = SPI_SPINT_INTFLAG;
frank26080115 0:84d7747641aa 146 }
frank26080115 0:84d7747641aa 147 }
frank26080115 0:84d7747641aa 148
frank26080115 0:84d7747641aa 149
frank26080115 0:84d7747641aa 150
frank26080115 0:84d7747641aa 151 /*****************************************************************************//**
frank26080115 0:84d7747641aa 152 * @brief Fills each SPI_InitStruct member with its default value:
frank26080115 0:84d7747641aa 153 * - CPHA = SPI_CPHA_FIRST
frank26080115 0:84d7747641aa 154 * - CPOL = SPI_CPOL_HI
frank26080115 0:84d7747641aa 155 * - ClockRate = 1000000
frank26080115 0:84d7747641aa 156 * - DataOrder = SPI_DATA_MSB_FIRST
frank26080115 0:84d7747641aa 157 * - Databit = SPI_DATABIT_8
frank26080115 0:84d7747641aa 158 * - Mode = SPI_MASTER_MODE
frank26080115 0:84d7747641aa 159 * @param[in] SPI_InitStruct Pointer to a SPI_CFG_Type structure
frank26080115 0:84d7747641aa 160 * which will be initialized.
frank26080115 0:84d7747641aa 161 * @return None
frank26080115 0:84d7747641aa 162 *******************************************************************************/
frank26080115 0:84d7747641aa 163 void SPI_ConfigStructInit(SPI_CFG_Type *SPI_InitStruct)
frank26080115 0:84d7747641aa 164 {
frank26080115 0:84d7747641aa 165 SPI_InitStruct->CPHA = SPI_CPHA_FIRST;
frank26080115 0:84d7747641aa 166 SPI_InitStruct->CPOL = SPI_CPOL_HI;
frank26080115 0:84d7747641aa 167 SPI_InitStruct->ClockRate = 1000000;
frank26080115 0:84d7747641aa 168 SPI_InitStruct->DataOrder = SPI_DATA_MSB_FIRST;
frank26080115 0:84d7747641aa 169 SPI_InitStruct->Databit = SPI_DATABIT_8;
frank26080115 0:84d7747641aa 170 SPI_InitStruct->Mode = SPI_MASTER_MODE;
frank26080115 0:84d7747641aa 171 }
frank26080115 0:84d7747641aa 172
frank26080115 0:84d7747641aa 173 /*********************************************************************//**
frank26080115 0:84d7747641aa 174 * @brief Transmit a single data through SPIx peripheral
frank26080115 0:84d7747641aa 175 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 176 * @param[in] Data Data to transmit (must be 16 or 8-bit long,
frank26080115 0:84d7747641aa 177 * this depend on SPI data bit number configured)
frank26080115 0:84d7747641aa 178 * @return none
frank26080115 0:84d7747641aa 179 **********************************************************************/
frank26080115 0:84d7747641aa 180 void SPI_SendData(LPC_SPI_TypeDef* SPIx, uint16_t Data)
frank26080115 0:84d7747641aa 181 {
frank26080115 0:84d7747641aa 182 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 183
frank26080115 0:84d7747641aa 184 SPIx->SPDR = Data & SPI_SPDR_BITMASK;
frank26080115 0:84d7747641aa 185 }
frank26080115 0:84d7747641aa 186
frank26080115 0:84d7747641aa 187
frank26080115 0:84d7747641aa 188
frank26080115 0:84d7747641aa 189 /*********************************************************************//**
frank26080115 0:84d7747641aa 190 * @brief Receive a single data from SPIx peripheral
frank26080115 0:84d7747641aa 191 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 192 * @return Data received (16-bit long)
frank26080115 0:84d7747641aa 193 **********************************************************************/
frank26080115 0:84d7747641aa 194 uint16_t SPI_ReceiveData(LPC_SPI_TypeDef* SPIx)
frank26080115 0:84d7747641aa 195 {
frank26080115 0:84d7747641aa 196 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 197
frank26080115 0:84d7747641aa 198 return ((uint16_t) (SPIx->SPDR & SPI_SPDR_BITMASK));
frank26080115 0:84d7747641aa 199 }
frank26080115 0:84d7747641aa 200
frank26080115 0:84d7747641aa 201 /*********************************************************************//**
frank26080115 0:84d7747641aa 202 * @brief SPI Read write data function
frank26080115 0:84d7747641aa 203 * @param[in] SPIx Pointer to SPI peripheral, should be LPC_SPI
frank26080115 0:84d7747641aa 204 * @param[in] dataCfg Pointer to a SPI_DATA_SETUP_Type structure that
frank26080115 0:84d7747641aa 205 * contains specified information about transmit
frank26080115 0:84d7747641aa 206 * data configuration.
frank26080115 0:84d7747641aa 207 * @param[in] xfType Transfer type, should be:
frank26080115 0:84d7747641aa 208 * - SPI_TRANSFER_POLLING: Polling mode
frank26080115 0:84d7747641aa 209 * - SPI_TRANSFER_INTERRUPT: Interrupt mode
frank26080115 0:84d7747641aa 210 * @return Actual Data length has been transferred in polling mode.
frank26080115 0:84d7747641aa 211 * In interrupt mode, always return (0)
frank26080115 0:84d7747641aa 212 * Return (-1) if error.
frank26080115 0:84d7747641aa 213 * Note: This function can be used in both master and slave mode.
frank26080115 0:84d7747641aa 214 ***********************************************************************/
frank26080115 0:84d7747641aa 215 int32_t SPI_ReadWrite (LPC_SPI_TypeDef *SPIx, SPI_DATA_SETUP_Type *dataCfg, \
frank26080115 0:84d7747641aa 216 SPI_TRANSFER_Type xfType)
frank26080115 0:84d7747641aa 217 {
frank26080115 0:84d7747641aa 218 uint8_t *rdata8 = 0;
frank26080115 0:84d7747641aa 219 uint8_t *wdata8 = 0;
frank26080115 0:84d7747641aa 220 uint16_t *rdata16 = 0;
frank26080115 0:84d7747641aa 221 uint16_t *wdata16 = 0;
frank26080115 0:84d7747641aa 222 uint32_t stat = 0;
frank26080115 0:84d7747641aa 223 uint32_t temp;
frank26080115 0:84d7747641aa 224 uint8_t dataword;
frank26080115 0:84d7747641aa 225
frank26080115 0:84d7747641aa 226 //read for empty buffer
frank26080115 0:84d7747641aa 227 temp = SPIx->SPDR;
frank26080115 0:84d7747641aa 228 //dummy to clear status
frank26080115 0:84d7747641aa 229 temp = SPIx->SPSR;
frank26080115 0:84d7747641aa 230 dataCfg->counter = 0;
frank26080115 0:84d7747641aa 231 dataCfg->status = 0;
frank26080115 0:84d7747641aa 232
frank26080115 0:84d7747641aa 233 if(SPI_GetDataSize (SPIx) == 8)
frank26080115 0:84d7747641aa 234 dataword = 0;
frank26080115 0:84d7747641aa 235 else dataword = 1;
frank26080115 0:84d7747641aa 236 if (xfType == SPI_TRANSFER_POLLING){
frank26080115 0:84d7747641aa 237
frank26080115 0:84d7747641aa 238 if (dataword == 0){
frank26080115 0:84d7747641aa 239 rdata8 = (uint8_t *)dataCfg->rx_data;
frank26080115 0:84d7747641aa 240 wdata8 = (uint8_t *)dataCfg->tx_data;
frank26080115 0:84d7747641aa 241 } else {
frank26080115 0:84d7747641aa 242 rdata16 = (uint16_t *)dataCfg->rx_data;
frank26080115 0:84d7747641aa 243 wdata16 = (uint16_t *)dataCfg->tx_data;
frank26080115 0:84d7747641aa 244 }
frank26080115 0:84d7747641aa 245
frank26080115 0:84d7747641aa 246 while(dataCfg->counter < dataCfg->length)
frank26080115 0:84d7747641aa 247 {
frank26080115 0:84d7747641aa 248 // Write data to buffer
frank26080115 0:84d7747641aa 249 if(dataCfg->tx_data == NULL){
frank26080115 0:84d7747641aa 250 if (dataword == 0){
frank26080115 0:84d7747641aa 251 SPI_SendData(SPIx, 0xFF);
frank26080115 0:84d7747641aa 252 } else {
frank26080115 0:84d7747641aa 253 SPI_SendData(SPIx, 0xFFFF);
frank26080115 0:84d7747641aa 254 }
frank26080115 0:84d7747641aa 255 } else {
frank26080115 0:84d7747641aa 256 if (dataword == 0){
frank26080115 0:84d7747641aa 257 SPI_SendData(SPIx, *wdata8);
frank26080115 0:84d7747641aa 258 wdata8++;
frank26080115 0:84d7747641aa 259 } else {
frank26080115 0:84d7747641aa 260 SPI_SendData(SPIx, *wdata16);
frank26080115 0:84d7747641aa 261 wdata16++;
frank26080115 0:84d7747641aa 262 }
frank26080115 0:84d7747641aa 263 }
frank26080115 0:84d7747641aa 264 // Wait for transfer complete
frank26080115 0:84d7747641aa 265 while (!((stat = SPIx->SPSR) & SPI_SPSR_SPIF));
frank26080115 0:84d7747641aa 266 // Check for error
frank26080115 0:84d7747641aa 267 if (stat & (SPI_SPSR_ABRT | SPI_SPSR_MODF | SPI_SPSR_ROVR | SPI_SPSR_WCOL)){
frank26080115 0:84d7747641aa 268 // save status
frank26080115 0:84d7747641aa 269 dataCfg->status = stat | SPI_STAT_ERROR;
frank26080115 0:84d7747641aa 270 return (dataCfg->counter);
frank26080115 0:84d7747641aa 271 }
frank26080115 0:84d7747641aa 272 // Read data from SPI dat
frank26080115 0:84d7747641aa 273 temp = (uint32_t) SPI_ReceiveData(SPIx);
frank26080115 0:84d7747641aa 274
frank26080115 0:84d7747641aa 275 // Store data to destination
frank26080115 0:84d7747641aa 276 if (dataCfg->rx_data != NULL)
frank26080115 0:84d7747641aa 277 {
frank26080115 0:84d7747641aa 278 if (dataword == 0){
frank26080115 0:84d7747641aa 279 *(rdata8) = (uint8_t) temp;
frank26080115 0:84d7747641aa 280 rdata8++;
frank26080115 0:84d7747641aa 281 } else {
frank26080115 0:84d7747641aa 282 *(rdata16) = (uint16_t) temp;
frank26080115 0:84d7747641aa 283 rdata16++;
frank26080115 0:84d7747641aa 284 }
frank26080115 0:84d7747641aa 285 }
frank26080115 0:84d7747641aa 286 // Increase counter
frank26080115 0:84d7747641aa 287 if (dataword == 0){
frank26080115 0:84d7747641aa 288 dataCfg->counter++;
frank26080115 0:84d7747641aa 289 } else {
frank26080115 0:84d7747641aa 290 dataCfg->counter += 2;
frank26080115 0:84d7747641aa 291 }
frank26080115 0:84d7747641aa 292 }
frank26080115 0:84d7747641aa 293
frank26080115 0:84d7747641aa 294 // Return length of actual data transferred
frank26080115 0:84d7747641aa 295 // save status
frank26080115 0:84d7747641aa 296 dataCfg->status = stat | SPI_STAT_DONE;
frank26080115 0:84d7747641aa 297 return (dataCfg->counter);
frank26080115 0:84d7747641aa 298 }
frank26080115 0:84d7747641aa 299 // Interrupt mode
frank26080115 0:84d7747641aa 300 else {
frank26080115 0:84d7747641aa 301
frank26080115 0:84d7747641aa 302 // Check if interrupt flag is already set
frank26080115 0:84d7747641aa 303 if(SPIx->SPINT & SPI_SPINT_INTFLAG){
frank26080115 0:84d7747641aa 304 SPIx->SPINT = SPI_SPINT_INTFLAG;
frank26080115 0:84d7747641aa 305 }
frank26080115 0:84d7747641aa 306 if (dataCfg->counter < dataCfg->length){
frank26080115 0:84d7747641aa 307 // Write data to buffer
frank26080115 0:84d7747641aa 308 if(dataCfg->tx_data == NULL){
frank26080115 0:84d7747641aa 309 if (dataword == 0){
frank26080115 0:84d7747641aa 310 SPI_SendData(SPIx, 0xFF);
frank26080115 0:84d7747641aa 311 } else {
frank26080115 0:84d7747641aa 312 SPI_SendData(SPIx, 0xFFFF);
frank26080115 0:84d7747641aa 313 }
frank26080115 0:84d7747641aa 314 } else {
frank26080115 0:84d7747641aa 315 if (dataword == 0){
frank26080115 0:84d7747641aa 316 SPI_SendData(SPIx, (*(uint8_t *)dataCfg->tx_data));
frank26080115 0:84d7747641aa 317 } else {
frank26080115 0:84d7747641aa 318 SPI_SendData(SPIx, (*(uint16_t *)dataCfg->tx_data));
frank26080115 0:84d7747641aa 319 }
frank26080115 0:84d7747641aa 320 }
frank26080115 0:84d7747641aa 321 SPI_IntCmd(SPIx, ENABLE);
frank26080115 0:84d7747641aa 322 } else {
frank26080115 0:84d7747641aa 323 // Save status
frank26080115 0:84d7747641aa 324 dataCfg->status = SPI_STAT_DONE;
frank26080115 0:84d7747641aa 325 }
frank26080115 0:84d7747641aa 326 return (0);
frank26080115 0:84d7747641aa 327 }
frank26080115 0:84d7747641aa 328 }
frank26080115 0:84d7747641aa 329
frank26080115 0:84d7747641aa 330
frank26080115 0:84d7747641aa 331 /********************************************************************//**
frank26080115 0:84d7747641aa 332 * @brief Enable or disable SPIx interrupt.
frank26080115 0:84d7747641aa 333 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 334 * @param[in] NewState New state of specified UART interrupt type,
frank26080115 0:84d7747641aa 335 * should be:
frank26080115 0:84d7747641aa 336 * - ENALBE: Enable this SPI interrupt.
frank26080115 0:84d7747641aa 337 * - DISALBE: Disable this SPI interrupt.
frank26080115 0:84d7747641aa 338 * @return None
frank26080115 0:84d7747641aa 339 *********************************************************************/
frank26080115 0:84d7747641aa 340 void SPI_IntCmd(LPC_SPI_TypeDef *SPIx, FunctionalState NewState)
frank26080115 0:84d7747641aa 341 {
frank26080115 0:84d7747641aa 342 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 343 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
frank26080115 0:84d7747641aa 344
frank26080115 0:84d7747641aa 345 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 346 {
frank26080115 0:84d7747641aa 347 SPIx->SPCR |= SPI_SPCR_SPIE;
frank26080115 0:84d7747641aa 348 }
frank26080115 0:84d7747641aa 349 else
frank26080115 0:84d7747641aa 350 {
frank26080115 0:84d7747641aa 351 SPIx->SPCR &= (~SPI_SPCR_SPIE) & SPI_SPCR_BITMASK;
frank26080115 0:84d7747641aa 352 }
frank26080115 0:84d7747641aa 353 }
frank26080115 0:84d7747641aa 354
frank26080115 0:84d7747641aa 355
frank26080115 0:84d7747641aa 356 /********************************************************************//**
frank26080115 0:84d7747641aa 357 * @brief Checks whether the SPI interrupt flag is set or not.
frank26080115 0:84d7747641aa 358 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 359 * @return The new state of SPI Interrupt Flag (SET or RESET)
frank26080115 0:84d7747641aa 360 *********************************************************************/
frank26080115 0:84d7747641aa 361 IntStatus SPI_GetIntStatus (LPC_SPI_TypeDef *SPIx)
frank26080115 0:84d7747641aa 362 {
frank26080115 0:84d7747641aa 363 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 364
frank26080115 0:84d7747641aa 365 return ((SPIx->SPINT & SPI_SPINT_INTFLAG) ? SET : RESET);
frank26080115 0:84d7747641aa 366 }
frank26080115 0:84d7747641aa 367
frank26080115 0:84d7747641aa 368 /********************************************************************//**
frank26080115 0:84d7747641aa 369 * @brief Clear SPI interrupt flag.
frank26080115 0:84d7747641aa 370 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 371 * @return None
frank26080115 0:84d7747641aa 372 *********************************************************************/
frank26080115 0:84d7747641aa 373 void SPI_ClearIntPending(LPC_SPI_TypeDef *SPIx)
frank26080115 0:84d7747641aa 374 {
frank26080115 0:84d7747641aa 375 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 376
frank26080115 0:84d7747641aa 377 SPIx->SPINT = SPI_SPINT_INTFLAG;
frank26080115 0:84d7747641aa 378 }
frank26080115 0:84d7747641aa 379
frank26080115 0:84d7747641aa 380 /********************************************************************//**
frank26080115 0:84d7747641aa 381 * @brief Get current value of SPI Status register in SPIx peripheral.
frank26080115 0:84d7747641aa 382 * @param[in] SPIx SPI peripheral selected, should be LPC_SPI
frank26080115 0:84d7747641aa 383 * @return Current value of SPI Status register in SPI peripheral.
frank26080115 0:84d7747641aa 384 * Note: The return value of this function must be used with
frank26080115 0:84d7747641aa 385 * SPI_CheckStatus() to determine current flag status
frank26080115 0:84d7747641aa 386 * corresponding to each SPI status type. Because some flags in
frank26080115 0:84d7747641aa 387 * SPI Status register will be cleared after reading, the next reading
frank26080115 0:84d7747641aa 388 * SPI Status register could not be correct. So this function used to
frank26080115 0:84d7747641aa 389 * read SPI status register in one time only, then the return value
frank26080115 0:84d7747641aa 390 * used to check all flags.
frank26080115 0:84d7747641aa 391 *********************************************************************/
frank26080115 0:84d7747641aa 392 uint32_t SPI_GetStatus(LPC_SPI_TypeDef* SPIx)
frank26080115 0:84d7747641aa 393 {
frank26080115 0:84d7747641aa 394 CHECK_PARAM(PARAM_SPIx(SPIx));
frank26080115 0:84d7747641aa 395
frank26080115 0:84d7747641aa 396 return (SPIx->SPSR & SPI_SPSR_BITMASK);
frank26080115 0:84d7747641aa 397 }
frank26080115 0:84d7747641aa 398
frank26080115 0:84d7747641aa 399 /********************************************************************//**
frank26080115 0:84d7747641aa 400 * @brief Checks whether the specified SPI Status flag is set or not
frank26080115 0:84d7747641aa 401 * via inputSPIStatus parameter.
frank26080115 0:84d7747641aa 402 * @param[in] inputSPIStatus Value to check status of each flag type.
frank26080115 0:84d7747641aa 403 * This value is the return value from SPI_GetStatus().
frank26080115 0:84d7747641aa 404 * @param[in] SPIStatus Specifies the SPI status flag to check,
frank26080115 0:84d7747641aa 405 * should be one of the following:
frank26080115 0:84d7747641aa 406 - SPI_STAT_ABRT: Slave abort.
frank26080115 0:84d7747641aa 407 - SPI_STAT_MODF: Mode fault.
frank26080115 0:84d7747641aa 408 - SPI_STAT_ROVR: Read overrun.
frank26080115 0:84d7747641aa 409 - SPI_STAT_WCOL: Write collision.
frank26080115 0:84d7747641aa 410 - SPI_STAT_SPIF: SPI transfer complete.
frank26080115 0:84d7747641aa 411 * @return The new state of SPIStatus (SET or RESET)
frank26080115 0:84d7747641aa 412 *********************************************************************/
frank26080115 0:84d7747641aa 413 FlagStatus SPI_CheckStatus (uint32_t inputSPIStatus, uint8_t SPIStatus)
frank26080115 0:84d7747641aa 414 {
frank26080115 0:84d7747641aa 415 CHECK_PARAM(PARAM_SPI_STAT(SPIStatus));
frank26080115 0:84d7747641aa 416
frank26080115 0:84d7747641aa 417 return ((inputSPIStatus & SPIStatus) ? SET : RESET);
frank26080115 0:84d7747641aa 418 }
frank26080115 0:84d7747641aa 419
frank26080115 0:84d7747641aa 420
frank26080115 0:84d7747641aa 421 /**
frank26080115 0:84d7747641aa 422 * @}
frank26080115 0:84d7747641aa 423 */
frank26080115 0:84d7747641aa 424
frank26080115 0:84d7747641aa 425 #endif /* _SPI */
frank26080115 0:84d7747641aa 426
frank26080115 0:84d7747641aa 427 /**
frank26080115 0:84d7747641aa 428 * @}
frank26080115 0:84d7747641aa 429 */
frank26080115 0:84d7747641aa 430
frank26080115 0:84d7747641aa 431 /* --------------------------------- End Of File ------------------------------ */