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_ssp.c
frank26080115 0:84d7747641aa 3 * @brief Contains all functions support for SSP firmware library on LPC17xx
frank26080115 0:84d7747641aa 4 * @version 3.0
frank26080115 0:84d7747641aa 5 * @date 18. June. 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 SSP
frank26080115 0:84d7747641aa 22 * @{
frank26080115 0:84d7747641aa 23 */
frank26080115 0:84d7747641aa 24
frank26080115 0:84d7747641aa 25 /* Includes ------------------------------------------------------------------- */
frank26080115 0:84d7747641aa 26 #include "lpc17xx_ssp.h"
frank26080115 0:84d7747641aa 27 #include "lpc17xx_clkpwr.h"
frank26080115 0:84d7747641aa 28
frank26080115 0:84d7747641aa 29
frank26080115 0:84d7747641aa 30 /* If this source file built with example, the LPC17xx FW library configuration
frank26080115 0:84d7747641aa 31 * file in each example directory ("lpc17xx_libcfg.h") must be included,
frank26080115 0:84d7747641aa 32 * otherwise the default FW library configuration file must be included instead
frank26080115 0:84d7747641aa 33 */
frank26080115 0:84d7747641aa 34 #ifdef __BUILD_WITH_EXAMPLE__
frank26080115 0:84d7747641aa 35 #include "lpc17xx_libcfg.h"
frank26080115 0:84d7747641aa 36 #else
frank26080115 0:84d7747641aa 37 #include "lpc17xx_libcfg_default.h"
frank26080115 0:84d7747641aa 38 #endif /* __BUILD_WITH_EXAMPLE__ */
frank26080115 0:84d7747641aa 39
frank26080115 0:84d7747641aa 40
frank26080115 0:84d7747641aa 41 #ifdef _SSP
frank26080115 0:84d7747641aa 42
frank26080115 0:84d7747641aa 43 /* Public Functions ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 44 /** @addtogroup SSP_Public_Functions
frank26080115 0:84d7747641aa 45 * @{
frank26080115 0:84d7747641aa 46 */
frank26080115 0:84d7747641aa 47 static void setSSPclock (LPC_SSP_TypeDef *SSPx, uint32_t target_clock);
frank26080115 0:84d7747641aa 48
frank26080115 0:84d7747641aa 49 /*********************************************************************//**
frank26080115 0:84d7747641aa 50 * @brief Setup clock rate for SSP device
frank26080115 0:84d7747641aa 51 * @param[in] SSPx SSP peripheral definition, should be:
frank26080115 0:84d7747641aa 52 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 53 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 54 * @param[in] target_clock : clock of SSP (Hz)
frank26080115 0:84d7747641aa 55 * @return None
frank26080115 0:84d7747641aa 56 ***********************************************************************/
frank26080115 0:84d7747641aa 57 static void setSSPclock (LPC_SSP_TypeDef *SSPx, uint32_t target_clock)
frank26080115 0:84d7747641aa 58 {
frank26080115 0:84d7747641aa 59 uint32_t prescale, cr0_div, cmp_clk, ssp_clk;
frank26080115 0:84d7747641aa 60
frank26080115 0:84d7747641aa 61 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 62
frank26080115 0:84d7747641aa 63 /* The SSP clock is derived from the (main system oscillator / 2),
frank26080115 0:84d7747641aa 64 so compute the best divider from that clock */
frank26080115 0:84d7747641aa 65 if (SSPx == LPC_SSP0){
frank26080115 0:84d7747641aa 66 ssp_clk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SSP0);
frank26080115 0:84d7747641aa 67 } else if (SSPx == LPC_SSP1) {
frank26080115 0:84d7747641aa 68 ssp_clk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SSP1);
frank26080115 0:84d7747641aa 69 } else {
frank26080115 0:84d7747641aa 70 return;
frank26080115 0:84d7747641aa 71 }
frank26080115 0:84d7747641aa 72
frank26080115 0:84d7747641aa 73 /* Find closest divider to get at or under the target frequency.
frank26080115 0:84d7747641aa 74 Use smallest prescale possible and rely on the divider to get
frank26080115 0:84d7747641aa 75 the closest target frequency */
frank26080115 0:84d7747641aa 76 cr0_div = 0;
frank26080115 0:84d7747641aa 77 cmp_clk = 0xFFFFFFFF;
frank26080115 0:84d7747641aa 78 prescale = 2;
frank26080115 0:84d7747641aa 79 while (cmp_clk > target_clock)
frank26080115 0:84d7747641aa 80 {
frank26080115 0:84d7747641aa 81 cmp_clk = ssp_clk / ((cr0_div + 1) * prescale);
frank26080115 0:84d7747641aa 82 if (cmp_clk > target_clock)
frank26080115 0:84d7747641aa 83 {
frank26080115 0:84d7747641aa 84 cr0_div++;
frank26080115 0:84d7747641aa 85 if (cr0_div > 0xFF)
frank26080115 0:84d7747641aa 86 {
frank26080115 0:84d7747641aa 87 cr0_div = 0;
frank26080115 0:84d7747641aa 88 prescale += 2;
frank26080115 0:84d7747641aa 89 }
frank26080115 0:84d7747641aa 90 }
frank26080115 0:84d7747641aa 91 }
frank26080115 0:84d7747641aa 92
frank26080115 0:84d7747641aa 93 /* Write computed prescaler and divider back to register */
frank26080115 0:84d7747641aa 94 SSPx->CR0 &= (~SSP_CR0_SCR(0xFF)) & SSP_CR0_BITMASK;
frank26080115 0:84d7747641aa 95 SSPx->CR0 |= (SSP_CR0_SCR(cr0_div)) & SSP_CR0_BITMASK;
frank26080115 0:84d7747641aa 96 SSPx->CPSR = prescale & SSP_CPSR_BITMASK;
frank26080115 0:84d7747641aa 97 }
frank26080115 0:84d7747641aa 98
frank26080115 0:84d7747641aa 99 /**
frank26080115 0:84d7747641aa 100 * @}
frank26080115 0:84d7747641aa 101 */
frank26080115 0:84d7747641aa 102
frank26080115 0:84d7747641aa 103 /* Public Functions ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 104 /** @addtogroup SSP_Public_Functions
frank26080115 0:84d7747641aa 105 * @{
frank26080115 0:84d7747641aa 106 */
frank26080115 0:84d7747641aa 107
frank26080115 0:84d7747641aa 108 /********************************************************************//**
frank26080115 0:84d7747641aa 109 * @brief Initializes the SSPx peripheral according to the specified
frank26080115 0:84d7747641aa 110 * parameters in the SSP_ConfigStruct.
frank26080115 0:84d7747641aa 111 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 112 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 113 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 114 * @param[in] SSP_ConfigStruct Pointer to a SSP_CFG_Type structure
frank26080115 0:84d7747641aa 115 * that contains the configuration information for the
frank26080115 0:84d7747641aa 116 * specified SSP peripheral.
frank26080115 0:84d7747641aa 117 * @return None
frank26080115 0:84d7747641aa 118 *********************************************************************/
frank26080115 0:84d7747641aa 119 void SSP_Init(LPC_SSP_TypeDef *SSPx, SSP_CFG_Type *SSP_ConfigStruct)
frank26080115 0:84d7747641aa 120 {
frank26080115 0:84d7747641aa 121 uint32_t tmp;
frank26080115 0:84d7747641aa 122
frank26080115 0:84d7747641aa 123 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 124
frank26080115 0:84d7747641aa 125 if(SSPx == LPC_SSP0) {
frank26080115 0:84d7747641aa 126 /* Set up clock and power for SSP0 module */
frank26080115 0:84d7747641aa 127 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP0, ENABLE);
frank26080115 0:84d7747641aa 128 } else if(SSPx == LPC_SSP1) {
frank26080115 0:84d7747641aa 129 /* Set up clock and power for SSP1 module */
frank26080115 0:84d7747641aa 130 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP1, ENABLE);
frank26080115 0:84d7747641aa 131 } else {
frank26080115 0:84d7747641aa 132 return;
frank26080115 0:84d7747641aa 133 }
frank26080115 0:84d7747641aa 134
frank26080115 0:84d7747641aa 135 /* Configure SSP, interrupt is disable, LoopBack mode is disable,
frank26080115 0:84d7747641aa 136 * SSP is disable, Slave output is disable as default
frank26080115 0:84d7747641aa 137 */
frank26080115 0:84d7747641aa 138 tmp = ((SSP_ConfigStruct->CPHA) | (SSP_ConfigStruct->CPOL) \
frank26080115 0:84d7747641aa 139 | (SSP_ConfigStruct->FrameFormat) | (SSP_ConfigStruct->Databit))
frank26080115 0:84d7747641aa 140 & SSP_CR0_BITMASK;
frank26080115 0:84d7747641aa 141 // write back to SSP control register
frank26080115 0:84d7747641aa 142 SSPx->CR0 = tmp;
frank26080115 0:84d7747641aa 143
frank26080115 0:84d7747641aa 144 tmp = SSP_ConfigStruct->Mode & SSP_CR1_BITMASK;
frank26080115 0:84d7747641aa 145 // Write back to CR1
frank26080115 0:84d7747641aa 146 SSPx->CR1 = tmp;
frank26080115 0:84d7747641aa 147
frank26080115 0:84d7747641aa 148 // Set clock rate for SSP peripheral
frank26080115 0:84d7747641aa 149 setSSPclock(SSPx, SSP_ConfigStruct->ClockRate);
frank26080115 0:84d7747641aa 150 }
frank26080115 0:84d7747641aa 151
frank26080115 0:84d7747641aa 152 /*********************************************************************//**
frank26080115 0:84d7747641aa 153 * @brief De-initializes the SSPx peripheral registers to their
frank26080115 0:84d7747641aa 154 * default reset values.
frank26080115 0:84d7747641aa 155 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 156 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 157 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 158 * @return None
frank26080115 0:84d7747641aa 159 **********************************************************************/
frank26080115 0:84d7747641aa 160 void SSP_DeInit(LPC_SSP_TypeDef* SSPx)
frank26080115 0:84d7747641aa 161 {
frank26080115 0:84d7747641aa 162 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 163
frank26080115 0:84d7747641aa 164 if (SSPx == LPC_SSP0){
frank26080115 0:84d7747641aa 165 /* Set up clock and power for SSP0 module */
frank26080115 0:84d7747641aa 166 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP0, DISABLE);
frank26080115 0:84d7747641aa 167 } else if (SSPx == LPC_SSP1) {
frank26080115 0:84d7747641aa 168 /* Set up clock and power for SSP1 module */
frank26080115 0:84d7747641aa 169 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP1, DISABLE);
frank26080115 0:84d7747641aa 170 }
frank26080115 0:84d7747641aa 171 }
frank26080115 0:84d7747641aa 172
frank26080115 0:84d7747641aa 173 /*****************************************************************************//**
frank26080115 0:84d7747641aa 174 * @brief Get data size bit selected
frank26080115 0:84d7747641aa 175 * @param[in] SSPx pointer to LPC_SSP_TypeDef structure, should be:
frank26080115 0:84d7747641aa 176 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 177 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 178 * @return Data size, could be:
frank26080115 0:84d7747641aa 179 * - SSP_DATABIT_4: 4 bit transfer
frank26080115 0:84d7747641aa 180 * - SSP_DATABIT_5: 5 bit transfer
frank26080115 0:84d7747641aa 181 * ...
frank26080115 0:84d7747641aa 182 * - SSP_DATABIT_16: 16 bit transfer
frank26080115 0:84d7747641aa 183 *******************************************************************************/
frank26080115 0:84d7747641aa 184 uint8_t SSP_GetDataSize(LPC_SSP_TypeDef* SSPx)
frank26080115 0:84d7747641aa 185 {
frank26080115 0:84d7747641aa 186 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 187 return (SSPx->CR0 & (0xF));
frank26080115 0:84d7747641aa 188 }
frank26080115 0:84d7747641aa 189
frank26080115 0:84d7747641aa 190 /*****************************************************************************//**
frank26080115 0:84d7747641aa 191 * @brief Fills each SSP_InitStruct member with its default value:
frank26080115 0:84d7747641aa 192 * - CPHA = SSP_CPHA_FIRST
frank26080115 0:84d7747641aa 193 * - CPOL = SSP_CPOL_HI
frank26080115 0:84d7747641aa 194 * - ClockRate = 1000000
frank26080115 0:84d7747641aa 195 * - Databit = SSP_DATABIT_8
frank26080115 0:84d7747641aa 196 * - Mode = SSP_MASTER_MODE
frank26080115 0:84d7747641aa 197 * - FrameFormat = SSP_FRAME_SSP
frank26080115 0:84d7747641aa 198 * @param[in] SSP_InitStruct Pointer to a SSP_CFG_Type structure
frank26080115 0:84d7747641aa 199 * which will be initialized.
frank26080115 0:84d7747641aa 200 * @return None
frank26080115 0:84d7747641aa 201 *******************************************************************************/
frank26080115 0:84d7747641aa 202 void SSP_ConfigStructInit(SSP_CFG_Type *SSP_InitStruct)
frank26080115 0:84d7747641aa 203 {
frank26080115 0:84d7747641aa 204 SSP_InitStruct->CPHA = SSP_CPHA_FIRST;
frank26080115 0:84d7747641aa 205 SSP_InitStruct->CPOL = SSP_CPOL_HI;
frank26080115 0:84d7747641aa 206 SSP_InitStruct->ClockRate = 1000000;
frank26080115 0:84d7747641aa 207 SSP_InitStruct->Databit = SSP_DATABIT_8;
frank26080115 0:84d7747641aa 208 SSP_InitStruct->Mode = SSP_MASTER_MODE;
frank26080115 0:84d7747641aa 209 SSP_InitStruct->FrameFormat = SSP_FRAME_SPI;
frank26080115 0:84d7747641aa 210 }
frank26080115 0:84d7747641aa 211
frank26080115 0:84d7747641aa 212
frank26080115 0:84d7747641aa 213 /*********************************************************************//**
frank26080115 0:84d7747641aa 214 * @brief Enable or disable SSP peripheral's operation
frank26080115 0:84d7747641aa 215 * @param[in] SSPx SSP peripheral, should be:
frank26080115 0:84d7747641aa 216 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 217 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 218 * @param[in] NewState New State of SSPx peripheral's operation
frank26080115 0:84d7747641aa 219 * @return none
frank26080115 0:84d7747641aa 220 **********************************************************************/
frank26080115 0:84d7747641aa 221 void SSP_Cmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState)
frank26080115 0:84d7747641aa 222 {
frank26080115 0:84d7747641aa 223 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 224 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
frank26080115 0:84d7747641aa 225
frank26080115 0:84d7747641aa 226 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 227 {
frank26080115 0:84d7747641aa 228 SSPx->CR1 |= SSP_CR1_SSP_EN;
frank26080115 0:84d7747641aa 229 }
frank26080115 0:84d7747641aa 230 else
frank26080115 0:84d7747641aa 231 {
frank26080115 0:84d7747641aa 232 SSPx->CR1 &= (~SSP_CR1_SSP_EN) & SSP_CR1_BITMASK;
frank26080115 0:84d7747641aa 233 }
frank26080115 0:84d7747641aa 234 }
frank26080115 0:84d7747641aa 235
frank26080115 0:84d7747641aa 236 /*********************************************************************//**
frank26080115 0:84d7747641aa 237 * @brief Enable or disable Loop Back mode function in SSP peripheral
frank26080115 0:84d7747641aa 238 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 239 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 240 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 241 * @param[in] NewState New State of Loop Back mode, should be:
frank26080115 0:84d7747641aa 242 * - ENABLE: Enable this function
frank26080115 0:84d7747641aa 243 * - DISABLE: Disable this function
frank26080115 0:84d7747641aa 244 * @return None
frank26080115 0:84d7747641aa 245 **********************************************************************/
frank26080115 0:84d7747641aa 246 void SSP_LoopBackCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState)
frank26080115 0:84d7747641aa 247 {
frank26080115 0:84d7747641aa 248 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 249 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
frank26080115 0:84d7747641aa 250
frank26080115 0:84d7747641aa 251 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 252 {
frank26080115 0:84d7747641aa 253 SSPx->CR1 |= SSP_CR1_LBM_EN;
frank26080115 0:84d7747641aa 254 }
frank26080115 0:84d7747641aa 255 else
frank26080115 0:84d7747641aa 256 {
frank26080115 0:84d7747641aa 257 SSPx->CR1 &= (~SSP_CR1_LBM_EN) & SSP_CR1_BITMASK;
frank26080115 0:84d7747641aa 258 }
frank26080115 0:84d7747641aa 259 }
frank26080115 0:84d7747641aa 260
frank26080115 0:84d7747641aa 261 /*********************************************************************//**
frank26080115 0:84d7747641aa 262 * @brief Enable or disable Slave Output function in SSP peripheral
frank26080115 0:84d7747641aa 263 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 264 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 265 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 266 * @param[in] NewState New State of Slave Output function, should be:
frank26080115 0:84d7747641aa 267 * - ENABLE: Slave Output in normal operation
frank26080115 0:84d7747641aa 268 * - DISABLE: Slave Output is disabled. This blocks
frank26080115 0:84d7747641aa 269 * SSP controller from driving the transmit data
frank26080115 0:84d7747641aa 270 * line (MISO)
frank26080115 0:84d7747641aa 271 * Note: This function is available when SSP peripheral in Slave mode
frank26080115 0:84d7747641aa 272 * @return None
frank26080115 0:84d7747641aa 273 **********************************************************************/
frank26080115 0:84d7747641aa 274 void SSP_SlaveOutputCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState)
frank26080115 0:84d7747641aa 275 {
frank26080115 0:84d7747641aa 276 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 277 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
frank26080115 0:84d7747641aa 278
frank26080115 0:84d7747641aa 279 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 280 {
frank26080115 0:84d7747641aa 281 SSPx->CR1 &= (~SSP_CR1_SO_DISABLE) & SSP_CR1_BITMASK;
frank26080115 0:84d7747641aa 282 }
frank26080115 0:84d7747641aa 283 else
frank26080115 0:84d7747641aa 284 {
frank26080115 0:84d7747641aa 285 SSPx->CR1 |= SSP_CR1_SO_DISABLE;
frank26080115 0:84d7747641aa 286 }
frank26080115 0:84d7747641aa 287 }
frank26080115 0:84d7747641aa 288
frank26080115 0:84d7747641aa 289
frank26080115 0:84d7747641aa 290
frank26080115 0:84d7747641aa 291 /*********************************************************************//**
frank26080115 0:84d7747641aa 292 * @brief Transmit a single data through SSPx peripheral
frank26080115 0:84d7747641aa 293 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 294 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 295 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 296 * @param[in] Data Data to transmit (must be 16 or 8-bit long,
frank26080115 0:84d7747641aa 297 * this depend on SSP data bit number configured)
frank26080115 0:84d7747641aa 298 * @return none
frank26080115 0:84d7747641aa 299 **********************************************************************/
frank26080115 0:84d7747641aa 300 void SSP_SendData(LPC_SSP_TypeDef* SSPx, uint16_t Data)
frank26080115 0:84d7747641aa 301 {
frank26080115 0:84d7747641aa 302 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 303
frank26080115 0:84d7747641aa 304 SSPx->DR = SSP_DR_BITMASK(Data);
frank26080115 0:84d7747641aa 305 }
frank26080115 0:84d7747641aa 306
frank26080115 0:84d7747641aa 307
frank26080115 0:84d7747641aa 308
frank26080115 0:84d7747641aa 309 /*********************************************************************//**
frank26080115 0:84d7747641aa 310 * @brief Receive a single data from SSPx peripheral
frank26080115 0:84d7747641aa 311 * @param[in] SSPx SSP peripheral selected, should be
frank26080115 0:84d7747641aa 312 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 313 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 314 * @return Data received (16-bit long)
frank26080115 0:84d7747641aa 315 **********************************************************************/
frank26080115 0:84d7747641aa 316 uint16_t SSP_ReceiveData(LPC_SSP_TypeDef* SSPx)
frank26080115 0:84d7747641aa 317 {
frank26080115 0:84d7747641aa 318 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 319
frank26080115 0:84d7747641aa 320 return ((uint16_t) (SSP_DR_BITMASK(SSPx->DR)));
frank26080115 0:84d7747641aa 321 }
frank26080115 0:84d7747641aa 322
frank26080115 0:84d7747641aa 323 /*********************************************************************//**
frank26080115 0:84d7747641aa 324 * @brief SSP Read write data function
frank26080115 0:84d7747641aa 325 * @param[in] SSPx Pointer to SSP peripheral, should be
frank26080115 0:84d7747641aa 326 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 327 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 328 * @param[in] dataCfg Pointer to a SSP_DATA_SETUP_Type structure that
frank26080115 0:84d7747641aa 329 * contains specified information about transmit
frank26080115 0:84d7747641aa 330 * data configuration.
frank26080115 0:84d7747641aa 331 * @param[in] xfType Transfer type, should be:
frank26080115 0:84d7747641aa 332 * - SSP_TRANSFER_POLLING: Polling mode
frank26080115 0:84d7747641aa 333 * - SSP_TRANSFER_INTERRUPT: Interrupt mode
frank26080115 0:84d7747641aa 334 * @return Actual Data length has been transferred in polling mode.
frank26080115 0:84d7747641aa 335 * In interrupt mode, always return (0)
frank26080115 0:84d7747641aa 336 * Return (-1) if error.
frank26080115 0:84d7747641aa 337 * Note: This function can be used in both master and slave mode.
frank26080115 0:84d7747641aa 338 ***********************************************************************/
frank26080115 0:84d7747641aa 339 int32_t SSP_ReadWrite (LPC_SSP_TypeDef *SSPx, SSP_DATA_SETUP_Type *dataCfg, \
frank26080115 0:84d7747641aa 340 SSP_TRANSFER_Type xfType)
frank26080115 0:84d7747641aa 341 {
frank26080115 0:84d7747641aa 342 uint8_t *rdata8 = 0;
frank26080115 0:84d7747641aa 343 uint8_t *wdata8 = 0;
frank26080115 0:84d7747641aa 344 uint16_t *rdata16 = 0;
frank26080115 0:84d7747641aa 345 uint16_t *wdata16 = 0;
frank26080115 0:84d7747641aa 346 uint32_t stat = 0;
frank26080115 0:84d7747641aa 347 uint32_t tmp = 0;
frank26080115 0:84d7747641aa 348 int32_t dataword;
frank26080115 0:84d7747641aa 349
frank26080115 0:84d7747641aa 350 dataCfg->rx_cnt = 0;
frank26080115 0:84d7747641aa 351 dataCfg->tx_cnt = 0;
frank26080115 0:84d7747641aa 352 dataCfg->status = 0;
frank26080115 0:84d7747641aa 353
frank26080115 0:84d7747641aa 354
frank26080115 0:84d7747641aa 355 /* Clear all remaining data in RX FIFO */
frank26080115 0:84d7747641aa 356 while (SSPx->SR & SSP_SR_RNE){
frank26080115 0:84d7747641aa 357 tmp = (uint32_t) SSP_ReceiveData(SSPx);
frank26080115 0:84d7747641aa 358 }
frank26080115 0:84d7747641aa 359
frank26080115 0:84d7747641aa 360 // Clear status
frank26080115 0:84d7747641aa 361 SSPx->ICR = SSP_ICR_BITMASK;
frank26080115 0:84d7747641aa 362 if(SSP_GetDataSize(SSPx)>8)
frank26080115 0:84d7747641aa 363 dataword = 1;
frank26080115 0:84d7747641aa 364 else dataword = 0;
frank26080115 0:84d7747641aa 365
frank26080115 0:84d7747641aa 366 // Polling mode ----------------------------------------------------------------------
frank26080115 0:84d7747641aa 367 if (xfType == SSP_TRANSFER_POLLING){
frank26080115 0:84d7747641aa 368 if (dataword == 0){
frank26080115 0:84d7747641aa 369 rdata8 = (uint8_t *)dataCfg->rx_data;
frank26080115 0:84d7747641aa 370 wdata8 = (uint8_t *)dataCfg->tx_data;
frank26080115 0:84d7747641aa 371 } else {
frank26080115 0:84d7747641aa 372 rdata16 = (uint16_t *)dataCfg->rx_data;
frank26080115 0:84d7747641aa 373 wdata16 = (uint16_t *)dataCfg->tx_data;
frank26080115 0:84d7747641aa 374 }
frank26080115 0:84d7747641aa 375 while ((dataCfg->tx_cnt != dataCfg->length) || (dataCfg->rx_cnt != dataCfg->length)){
frank26080115 0:84d7747641aa 376 if ((SSPx->SR & SSP_SR_TNF) && (dataCfg->tx_cnt != dataCfg->length)){
frank26080115 0:84d7747641aa 377 // Write data to buffer
frank26080115 0:84d7747641aa 378 if(dataCfg->tx_data == NULL){
frank26080115 0:84d7747641aa 379 if (dataword == 0){
frank26080115 0:84d7747641aa 380 SSP_SendData(SSPx, 0xFF);
frank26080115 0:84d7747641aa 381 dataCfg->tx_cnt++;
frank26080115 0:84d7747641aa 382 } else {
frank26080115 0:84d7747641aa 383 SSP_SendData(SSPx, 0xFFFF);
frank26080115 0:84d7747641aa 384 dataCfg->tx_cnt += 2;
frank26080115 0:84d7747641aa 385 }
frank26080115 0:84d7747641aa 386 } else {
frank26080115 0:84d7747641aa 387 if (dataword == 0){
frank26080115 0:84d7747641aa 388 SSP_SendData(SSPx, *wdata8);
frank26080115 0:84d7747641aa 389 wdata8++;
frank26080115 0:84d7747641aa 390 dataCfg->tx_cnt++;
frank26080115 0:84d7747641aa 391 } else {
frank26080115 0:84d7747641aa 392 SSP_SendData(SSPx, *wdata16);
frank26080115 0:84d7747641aa 393 wdata16++;
frank26080115 0:84d7747641aa 394 dataCfg->tx_cnt += 2;
frank26080115 0:84d7747641aa 395 }
frank26080115 0:84d7747641aa 396 }
frank26080115 0:84d7747641aa 397 }
frank26080115 0:84d7747641aa 398
frank26080115 0:84d7747641aa 399 // Check overrun error
frank26080115 0:84d7747641aa 400 if ((stat = SSPx->RIS) & SSP_RIS_ROR){
frank26080115 0:84d7747641aa 401 // save status and return
frank26080115 0:84d7747641aa 402 dataCfg->status = stat | SSP_STAT_ERROR;
frank26080115 0:84d7747641aa 403 return (-1);
frank26080115 0:84d7747641aa 404 }
frank26080115 0:84d7747641aa 405
frank26080115 0:84d7747641aa 406 // Check for any data available in RX FIFO
frank26080115 0:84d7747641aa 407 while ((SSPx->SR & SSP_SR_RNE) && (dataCfg->rx_cnt != dataCfg->length)){
frank26080115 0:84d7747641aa 408 // Read data from SSP data
frank26080115 0:84d7747641aa 409 tmp = SSP_ReceiveData(SSPx);
frank26080115 0:84d7747641aa 410
frank26080115 0:84d7747641aa 411 // Store data to destination
frank26080115 0:84d7747641aa 412 if (dataCfg->rx_data != NULL)
frank26080115 0:84d7747641aa 413 {
frank26080115 0:84d7747641aa 414 if (dataword == 0){
frank26080115 0:84d7747641aa 415 *(rdata8) = (uint8_t) tmp;
frank26080115 0:84d7747641aa 416 rdata8++;
frank26080115 0:84d7747641aa 417 } else {
frank26080115 0:84d7747641aa 418 *(rdata16) = (uint16_t) tmp;
frank26080115 0:84d7747641aa 419 rdata16++;
frank26080115 0:84d7747641aa 420 }
frank26080115 0:84d7747641aa 421 }
frank26080115 0:84d7747641aa 422 // Increase counter
frank26080115 0:84d7747641aa 423 if (dataword == 0){
frank26080115 0:84d7747641aa 424 dataCfg->rx_cnt++;
frank26080115 0:84d7747641aa 425 } else {
frank26080115 0:84d7747641aa 426 dataCfg->rx_cnt += 2;
frank26080115 0:84d7747641aa 427 }
frank26080115 0:84d7747641aa 428 }
frank26080115 0:84d7747641aa 429 }
frank26080115 0:84d7747641aa 430
frank26080115 0:84d7747641aa 431 // save status
frank26080115 0:84d7747641aa 432 dataCfg->status = SSP_STAT_DONE;
frank26080115 0:84d7747641aa 433
frank26080115 0:84d7747641aa 434 if (dataCfg->tx_data != NULL){
frank26080115 0:84d7747641aa 435 return dataCfg->tx_cnt;
frank26080115 0:84d7747641aa 436 } else if (dataCfg->rx_data != NULL){
frank26080115 0:84d7747641aa 437 return dataCfg->rx_cnt;
frank26080115 0:84d7747641aa 438 } else {
frank26080115 0:84d7747641aa 439 return (0);
frank26080115 0:84d7747641aa 440 }
frank26080115 0:84d7747641aa 441 }
frank26080115 0:84d7747641aa 442
frank26080115 0:84d7747641aa 443 // Interrupt mode ----------------------------------------------------------------------
frank26080115 0:84d7747641aa 444 else if (xfType == SSP_TRANSFER_INTERRUPT){
frank26080115 0:84d7747641aa 445
frank26080115 0:84d7747641aa 446 while ((SSPx->SR & SSP_SR_TNF) && (dataCfg->tx_cnt != dataCfg->length)){
frank26080115 0:84d7747641aa 447 // Write data to buffer
frank26080115 0:84d7747641aa 448 if(dataCfg->tx_data == NULL){
frank26080115 0:84d7747641aa 449 if (dataword == 0){
frank26080115 0:84d7747641aa 450 SSP_SendData(SSPx, 0xFF);
frank26080115 0:84d7747641aa 451 dataCfg->tx_cnt++;
frank26080115 0:84d7747641aa 452 } else {
frank26080115 0:84d7747641aa 453 SSP_SendData(SSPx, 0xFFFF);
frank26080115 0:84d7747641aa 454 dataCfg->tx_cnt += 2;
frank26080115 0:84d7747641aa 455 }
frank26080115 0:84d7747641aa 456 } else {
frank26080115 0:84d7747641aa 457 if (dataword == 0){
frank26080115 0:84d7747641aa 458 SSP_SendData(SSPx, (*(uint8_t *)((uint32_t)dataCfg->tx_data + dataCfg->tx_cnt)));
frank26080115 0:84d7747641aa 459 dataCfg->tx_cnt++;
frank26080115 0:84d7747641aa 460 } else {
frank26080115 0:84d7747641aa 461 SSP_SendData(SSPx, (*(uint16_t *)((uint32_t)dataCfg->tx_data + dataCfg->tx_cnt)));
frank26080115 0:84d7747641aa 462 dataCfg->tx_cnt += 2;
frank26080115 0:84d7747641aa 463 }
frank26080115 0:84d7747641aa 464 }
frank26080115 0:84d7747641aa 465
frank26080115 0:84d7747641aa 466 // Check error
frank26080115 0:84d7747641aa 467 if ((stat = SSPx->RIS) & SSP_RIS_ROR){
frank26080115 0:84d7747641aa 468 // save status and return
frank26080115 0:84d7747641aa 469 dataCfg->status = stat | SSP_STAT_ERROR;
frank26080115 0:84d7747641aa 470 return (-1);
frank26080115 0:84d7747641aa 471 }
frank26080115 0:84d7747641aa 472
frank26080115 0:84d7747641aa 473 // Check for any data available in RX FIFO
frank26080115 0:84d7747641aa 474 while ((SSPx->SR & SSP_SR_RNE) && (dataCfg->rx_cnt != dataCfg->length)){
frank26080115 0:84d7747641aa 475 // Read data from SSP data
frank26080115 0:84d7747641aa 476 tmp = SSP_ReceiveData(SSPx);
frank26080115 0:84d7747641aa 477
frank26080115 0:84d7747641aa 478 // Store data to destination
frank26080115 0:84d7747641aa 479 if (dataCfg->rx_data != NULL)
frank26080115 0:84d7747641aa 480 {
frank26080115 0:84d7747641aa 481 if (dataword == 0){
frank26080115 0:84d7747641aa 482 *(uint8_t *)((uint32_t)dataCfg->rx_data + dataCfg->rx_cnt) = (uint8_t) tmp;
frank26080115 0:84d7747641aa 483 } else {
frank26080115 0:84d7747641aa 484 *(uint16_t *)((uint32_t)dataCfg->rx_data + dataCfg->rx_cnt) = (uint16_t) tmp;
frank26080115 0:84d7747641aa 485 }
frank26080115 0:84d7747641aa 486 }
frank26080115 0:84d7747641aa 487 // Increase counter
frank26080115 0:84d7747641aa 488 if (dataword == 0){
frank26080115 0:84d7747641aa 489 dataCfg->rx_cnt++;
frank26080115 0:84d7747641aa 490 } else {
frank26080115 0:84d7747641aa 491 dataCfg->rx_cnt += 2;
frank26080115 0:84d7747641aa 492 }
frank26080115 0:84d7747641aa 493 }
frank26080115 0:84d7747641aa 494 }
frank26080115 0:84d7747641aa 495
frank26080115 0:84d7747641aa 496 // If there more data to sent or receive
frank26080115 0:84d7747641aa 497 if ((dataCfg->rx_cnt != dataCfg->length) || (dataCfg->tx_cnt != dataCfg->length)){
frank26080115 0:84d7747641aa 498 // Enable all interrupt
frank26080115 0:84d7747641aa 499 SSPx->IMSC = SSP_IMSC_BITMASK;
frank26080115 0:84d7747641aa 500 } else {
frank26080115 0:84d7747641aa 501 // Save status
frank26080115 0:84d7747641aa 502 dataCfg->status = SSP_STAT_DONE;
frank26080115 0:84d7747641aa 503 }
frank26080115 0:84d7747641aa 504 return (0);
frank26080115 0:84d7747641aa 505 }
frank26080115 0:84d7747641aa 506
frank26080115 0:84d7747641aa 507 return (-1);
frank26080115 0:84d7747641aa 508 }
frank26080115 0:84d7747641aa 509
frank26080115 0:84d7747641aa 510 /*********************************************************************//**
frank26080115 0:84d7747641aa 511 * @brief Checks whether the specified SSP status flag is set or not
frank26080115 0:84d7747641aa 512 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 513 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 514 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 515 * @param[in] FlagType Type of flag to check status, should be one
frank26080115 0:84d7747641aa 516 * of following:
frank26080115 0:84d7747641aa 517 * - SSP_STAT_TXFIFO_EMPTY: TX FIFO is empty
frank26080115 0:84d7747641aa 518 * - SSP_STAT_TXFIFO_NOTFULL: TX FIFO is not full
frank26080115 0:84d7747641aa 519 * - SSP_STAT_RXFIFO_NOTEMPTY: RX FIFO is not empty
frank26080115 0:84d7747641aa 520 * - SSP_STAT_RXFIFO_FULL: RX FIFO is full
frank26080115 0:84d7747641aa 521 * - SSP_STAT_BUSY: SSP peripheral is busy
frank26080115 0:84d7747641aa 522 * @return New State of specified SSP status flag
frank26080115 0:84d7747641aa 523 **********************************************************************/
frank26080115 0:84d7747641aa 524 FlagStatus SSP_GetStatus(LPC_SSP_TypeDef* SSPx, uint32_t FlagType)
frank26080115 0:84d7747641aa 525 {
frank26080115 0:84d7747641aa 526 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 527 CHECK_PARAM(PARAM_SSP_STAT(FlagType));
frank26080115 0:84d7747641aa 528
frank26080115 0:84d7747641aa 529 return ((SSPx->SR & FlagType) ? SET : RESET);
frank26080115 0:84d7747641aa 530 }
frank26080115 0:84d7747641aa 531
frank26080115 0:84d7747641aa 532 /*********************************************************************//**
frank26080115 0:84d7747641aa 533 * @brief Enable or disable specified interrupt type in SSP peripheral
frank26080115 0:84d7747641aa 534 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 535 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 536 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 537 * @param[in] IntType Interrupt type in SSP peripheral, should be:
frank26080115 0:84d7747641aa 538 * - SSP_INTCFG_ROR: Receive Overrun interrupt
frank26080115 0:84d7747641aa 539 * - SSP_INTCFG_RT: Receive Time out interrupt
frank26080115 0:84d7747641aa 540 * - SSP_INTCFG_RX: RX FIFO is at least half full interrupt
frank26080115 0:84d7747641aa 541 * - SSP_INTCFG_TX: TX FIFO is at least half empty interrupt
frank26080115 0:84d7747641aa 542 * @param[in] NewState New State of specified interrupt type, should be:
frank26080115 0:84d7747641aa 543 * - ENABLE: Enable this interrupt type
frank26080115 0:84d7747641aa 544 * - DISABLE: Disable this interrupt type
frank26080115 0:84d7747641aa 545 * @return None
frank26080115 0:84d7747641aa 546 * Note: We can enable/disable multi-interrupt type by OR multi value
frank26080115 0:84d7747641aa 547 **********************************************************************/
frank26080115 0:84d7747641aa 548 void SSP_IntConfig(LPC_SSP_TypeDef *SSPx, uint32_t IntType, FunctionalState NewState)
frank26080115 0:84d7747641aa 549 {
frank26080115 0:84d7747641aa 550 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 551
frank26080115 0:84d7747641aa 552 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 553 {
frank26080115 0:84d7747641aa 554 SSPx->IMSC |= IntType;
frank26080115 0:84d7747641aa 555 }
frank26080115 0:84d7747641aa 556 else
frank26080115 0:84d7747641aa 557 {
frank26080115 0:84d7747641aa 558 SSPx->IMSC &= (~IntType) & SSP_IMSC_BITMASK;
frank26080115 0:84d7747641aa 559 }
frank26080115 0:84d7747641aa 560 }
frank26080115 0:84d7747641aa 561
frank26080115 0:84d7747641aa 562 /*********************************************************************//**
frank26080115 0:84d7747641aa 563 * @brief Check whether the specified Raw interrupt status flag is
frank26080115 0:84d7747641aa 564 * set or not
frank26080115 0:84d7747641aa 565 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 566 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 567 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 568 * @param[in] RawIntType Raw Interrupt Type, should be:
frank26080115 0:84d7747641aa 569 * - SSP_INTSTAT_RAW_ROR: Receive Overrun interrupt
frank26080115 0:84d7747641aa 570 * - SSP_INTSTAT_RAW_RT: Receive Time out interrupt
frank26080115 0:84d7747641aa 571 * - SSP_INTSTAT_RAW_RX: RX FIFO is at least half full interrupt
frank26080115 0:84d7747641aa 572 * - SSP_INTSTAT_RAW_TX: TX FIFO is at least half empty interrupt
frank26080115 0:84d7747641aa 573 * @return New State of specified Raw interrupt status flag in SSP peripheral
frank26080115 0:84d7747641aa 574 * Note: Enabling/Disabling specified interrupt in SSP peripheral does not
frank26080115 0:84d7747641aa 575 * effect to Raw Interrupt Status flag.
frank26080115 0:84d7747641aa 576 **********************************************************************/
frank26080115 0:84d7747641aa 577 IntStatus SSP_GetRawIntStatus(LPC_SSP_TypeDef *SSPx, uint32_t RawIntType)
frank26080115 0:84d7747641aa 578 {
frank26080115 0:84d7747641aa 579 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 580 CHECK_PARAM(PARAM_SSP_INTSTAT_RAW(RawIntType));
frank26080115 0:84d7747641aa 581
frank26080115 0:84d7747641aa 582 return ((SSPx->RIS & RawIntType) ? SET : RESET);
frank26080115 0:84d7747641aa 583 }
frank26080115 0:84d7747641aa 584
frank26080115 0:84d7747641aa 585 /*********************************************************************//**
frank26080115 0:84d7747641aa 586 * @brief Get Raw Interrupt Status register
frank26080115 0:84d7747641aa 587 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 588 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 589 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 590 * @return Raw Interrupt Status (RIS) register value
frank26080115 0:84d7747641aa 591 **********************************************************************/
frank26080115 0:84d7747641aa 592 uint32_t SSP_GetRawIntStatusReg(LPC_SSP_TypeDef *SSPx)
frank26080115 0:84d7747641aa 593 {
frank26080115 0:84d7747641aa 594 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 595 return (SSPx->RIS);
frank26080115 0:84d7747641aa 596 }
frank26080115 0:84d7747641aa 597
frank26080115 0:84d7747641aa 598 /*********************************************************************//**
frank26080115 0:84d7747641aa 599 * @brief Check whether the specified interrupt status flag is
frank26080115 0:84d7747641aa 600 * set or not
frank26080115 0:84d7747641aa 601 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 602 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 603 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 604 * @param[in] IntType Raw Interrupt Type, should be:
frank26080115 0:84d7747641aa 605 * - SSP_INTSTAT_ROR: Receive Overrun interrupt
frank26080115 0:84d7747641aa 606 * - SSP_INTSTAT_RT: Receive Time out interrupt
frank26080115 0:84d7747641aa 607 * - SSP_INTSTAT_RX: RX FIFO is at least half full interrupt
frank26080115 0:84d7747641aa 608 * - SSP_INTSTAT_TX: TX FIFO is at least half empty interrupt
frank26080115 0:84d7747641aa 609 * @return New State of specified interrupt status flag in SSP peripheral
frank26080115 0:84d7747641aa 610 * Note: Enabling/Disabling specified interrupt in SSP peripheral effects
frank26080115 0:84d7747641aa 611 * to Interrupt Status flag.
frank26080115 0:84d7747641aa 612 **********************************************************************/
frank26080115 0:84d7747641aa 613 IntStatus SSP_GetIntStatus (LPC_SSP_TypeDef *SSPx, uint32_t IntType)
frank26080115 0:84d7747641aa 614 {
frank26080115 0:84d7747641aa 615 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 616 CHECK_PARAM(PARAM_SSP_INTSTAT(IntType));
frank26080115 0:84d7747641aa 617
frank26080115 0:84d7747641aa 618 return ((SSPx->MIS & IntType) ? SET :RESET);
frank26080115 0:84d7747641aa 619 }
frank26080115 0:84d7747641aa 620
frank26080115 0:84d7747641aa 621 /*********************************************************************//**
frank26080115 0:84d7747641aa 622 * @brief Clear specified interrupt pending in SSP peripheral
frank26080115 0:84d7747641aa 623 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 624 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 625 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 626 * @param[in] IntType Interrupt pending to clear, should be:
frank26080115 0:84d7747641aa 627 * - SSP_INTCLR_ROR: clears the "frame was received when
frank26080115 0:84d7747641aa 628 * RxFIFO was full" interrupt.
frank26080115 0:84d7747641aa 629 * - SSP_INTCLR_RT: clears the "Rx FIFO was not empty and
frank26080115 0:84d7747641aa 630 * has not been read for a timeout period" interrupt.
frank26080115 0:84d7747641aa 631 * @return None
frank26080115 0:84d7747641aa 632 **********************************************************************/
frank26080115 0:84d7747641aa 633 void SSP_ClearIntPending(LPC_SSP_TypeDef *SSPx, uint32_t IntType)
frank26080115 0:84d7747641aa 634 {
frank26080115 0:84d7747641aa 635 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 636 CHECK_PARAM(PARAM_SSP_INTCLR(IntType));
frank26080115 0:84d7747641aa 637
frank26080115 0:84d7747641aa 638 SSPx->ICR = IntType;
frank26080115 0:84d7747641aa 639 }
frank26080115 0:84d7747641aa 640
frank26080115 0:84d7747641aa 641 /*********************************************************************//**
frank26080115 0:84d7747641aa 642 * @brief Enable/Disable DMA function for SSP peripheral
frank26080115 0:84d7747641aa 643 * @param[in] SSPx SSP peripheral selected, should be:
frank26080115 0:84d7747641aa 644 * - LPC_SSP0: SSP0 peripheral
frank26080115 0:84d7747641aa 645 * - LPC_SSP1: SSP1 peripheral
frank26080115 0:84d7747641aa 646 * @param[in] DMAMode Type of DMA, should be:
frank26080115 0:84d7747641aa 647 * - SSP_DMA_TX: DMA for the transmit FIFO
frank26080115 0:84d7747641aa 648 * - SSP_DMA_RX: DMA for the Receive FIFO
frank26080115 0:84d7747641aa 649 * @param[in] NewState New State of DMA function on SSP peripheral,
frank26080115 0:84d7747641aa 650 * should be:
frank26080115 0:84d7747641aa 651 * - ENALBE: Enable this function
frank26080115 0:84d7747641aa 652 * - DISABLE: Disable this function
frank26080115 0:84d7747641aa 653 * @return None
frank26080115 0:84d7747641aa 654 **********************************************************************/
frank26080115 0:84d7747641aa 655 void SSP_DMACmd(LPC_SSP_TypeDef *SSPx, uint32_t DMAMode, FunctionalState NewState)
frank26080115 0:84d7747641aa 656 {
frank26080115 0:84d7747641aa 657 CHECK_PARAM(PARAM_SSPx(SSPx));
frank26080115 0:84d7747641aa 658 CHECK_PARAM(PARAM_SSP_DMA(DMAMode));
frank26080115 0:84d7747641aa 659 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
frank26080115 0:84d7747641aa 660
frank26080115 0:84d7747641aa 661 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 662 {
frank26080115 0:84d7747641aa 663 SSPx->DMACR |= DMAMode;
frank26080115 0:84d7747641aa 664 }
frank26080115 0:84d7747641aa 665 else
frank26080115 0:84d7747641aa 666 {
frank26080115 0:84d7747641aa 667 SSPx->DMACR &= (~DMAMode) & SSP_DMA_BITMASK;
frank26080115 0:84d7747641aa 668 }
frank26080115 0:84d7747641aa 669 }
frank26080115 0:84d7747641aa 670
frank26080115 0:84d7747641aa 671 /**
frank26080115 0:84d7747641aa 672 * @}
frank26080115 0:84d7747641aa 673 */
frank26080115 0:84d7747641aa 674
frank26080115 0:84d7747641aa 675 #endif /* _SSP */
frank26080115 0:84d7747641aa 676
frank26080115 0:84d7747641aa 677 /**
frank26080115 0:84d7747641aa 678 * @}
frank26080115 0:84d7747641aa 679 */
frank26080115 0:84d7747641aa 680
frank26080115 0:84d7747641aa 681 /* --------------------------------- End Of File ------------------------------ */
frank26080115 0:84d7747641aa 682