OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [CORTEX_STM32F103_IAR/] [STM32F10xFWLib/] [src/] [stm32f10x_spi.c] - Blame information for rev 582

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 582 jeremybenn
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
2
* File Name          : stm32f10x_spi.c
3
* Author             : MCD Application Team
4
* Date First Issued  : 09/29/2006
5
* Description        : This file provides all the SPI firmware functions.
6
********************************************************************************
7
* History:
8
* 04/02/2007: V0.2
9
* 02/05/2007: V0.1
10
* 09/29/2006: V0.01
11
********************************************************************************
12
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
13
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
14
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
15
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
16
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
17
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
18
*******************************************************************************/
19
 
20
/* Includes ------------------------------------------------------------------*/
21
#include "stm32f10x_spi.h"
22
#include "stm32f10x_rcc.h"
23
 
24
/* Private typedef -----------------------------------------------------------*/
25
/* Private define ------------------------------------------------------------*/
26
/* SPI SPE mask */
27
#define CR1_SPE_Set          ((u16)0x0040)
28
#define CR1_SPE_Reset        ((u16)0xFFBF)
29
 
30
/* SPI CRCNext mask */
31
#define CR1_CRCNext_Set      ((u16)0x1000)
32
 
33
/* SPI CRCEN mask */
34
#define CR1_CRCEN_Set        ((u16)0x2000)
35
#define CR1_CRCEN_Reset      ((u16)0xDFFF)
36
 
37
/* SPI SSOE mask */
38
#define CR2_SSOE_Set        ((u16)0x0004)
39
#define CR2_SSOE_Reset      ((u16)0xFFFB)
40
 
41
/* SPI registers Masks */
42
#define CR1_CLEAR_Mask       ((u16)0x3040)
43
 
44
/* Private macro -------------------------------------------------------------*/
45
/* Private variables ---------------------------------------------------------*/
46
/* Private function prototypes -----------------------------------------------*/
47
/* Private functions ---------------------------------------------------------*/
48
 
49
/*******************************************************************************
50
* Function Name  : SPI_DeInit
51
* Description    : Deinitializes the SPIx peripheral registers to their default
52
*                  reset values.
53
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
54
* Output         : None
55
* Return         : None
56
*******************************************************************************/
57
void SPI_DeInit(SPI_TypeDef* SPIx)
58
{
59
  switch (*(u32*)&SPIx)
60
  {
61
    case SPI1_BASE:
62
      /* Enable SPI1 reset state */
63
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);
64
      /* Release SPI1 from reset state */
65
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE);
66
      break;
67
 
68
    case SPI2_BASE:
69
      /* Enable SPI2 reset state */
70
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
71
      /* Release SPI2 from reset state */
72
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);
73
      break;
74
 
75
    default:
76
      break;
77
  }
78
}
79
 
80
/*******************************************************************************
81
* Function Name  : SPI_Init
82
* Description    : Initializes the SPIx according to the specified parameters
83
*                  in the SPI_InitStruct.
84
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
85
*                  - SPI_InitStruct: pointer to a SPI_InitTypeDef structure that
86
*                    contains the configuration information for the specified
87
*                    SPI peripheral.
88
* Output         : None
89
* Return         : None
90
******************************************************************************/
91
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct)
92
{
93
  u16 tmpreg = 0;
94
 
95
  /* Check the parameters */
96
  assert(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction));
97
  assert(IS_SPI_MODE(SPI_InitStruct->SPI_Mode));
98
  assert(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize));
99
  assert(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL));
100
  assert(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA));
101
  assert(IS_SPI_NSS(SPI_InitStruct->SPI_NSS));
102
  assert(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler));
103
  assert(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit));
104
  assert(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial));
105
 
106
/*---------------------------- SPIx CR1 Configuration ------------------------*/
107
  /* Get the SPIx CR1 value */
108
  tmpreg = SPIx->CR1;
109
  /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */
110
  tmpreg &= CR1_CLEAR_Mask;
111
  /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler
112
     master/salve mode, CPOL and CPHA */
113
  /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */
114
  /* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */
115
  /* Set LSBFirst bit according to SPI_FirstBit value */
116
  /* Set BR bits according to SPI_BaudRatePrescaler value */
117
  /* Set CPOL bit according to SPI_CPOL value */
118
  /* Set CPHA bit according to SPI_CPHA value */
119
  tmpreg |= (u16)((u32)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode |
120
                  SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL |
121
                  SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS |
122
                  SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit);
123
  /* Write to SPIx CR1 */
124
  SPIx->CR1 = tmpreg;
125
 
126
/*---------------------------- SPIx CRCPOLY Configuration --------------------*/
127
  /* Write to SPIx CRCPOLY */
128
  SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial;
129
}
130
 
131
/*******************************************************************************
132
* Function Name  : SPI_StructInit
133
* Description    : Fills each SPI_InitStruct member with its default value.
134
* Input          : - SPI_InitStruct : pointer to a SPI_InitTypeDef structure
135
*                    which will be initialized.
136
* Output         : None
137
* Return         : None
138
*******************************************************************************/
139
void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct)
140
{
141
/*--------------- Reset SPI init structure parameters values -----------------*/
142
  /* Initialize the SPI_Direction member */
143
  SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex;
144
 
145
  /* initialize the SPI_Mode member */
146
  SPI_InitStruct->SPI_Mode = SPI_Mode_Slave;
147
 
148
  /* initialize the SPI_DataSize member */
149
  SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b;
150
 
151
  /* Initialize the SPI_CPOL member */
152
  SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low;
153
 
154
  /* Initialize the SPI_CPHA member */
155
  SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge;
156
 
157
  /* Initialize the SPI_NSS member */
158
  SPI_InitStruct->SPI_NSS = SPI_NSS_Hard;
159
 
160
  /* Initialize the SPI_BaudRatePrescaler member */
161
  SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
162
 
163
  /* Initialize the SPI_FirstBit member */
164
  SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB;
165
 
166
  /* Initialize the SPI_CRCPolynomial member */
167
  SPI_InitStruct->SPI_CRCPolynomial = 7;
168
}
169
 
170
/*******************************************************************************
171
* Function Name  : SPI_Cmd
172
* Description    : Enables or disables the specified SPI peripheral.
173
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
174
*                  - NewState: new state of the SPIx peripheral.
175
*                    This parameter can be: ENABLE or DISABLE.
176
* Output         : None
177
* Return         : None
178
*******************************************************************************/
179
void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)
180
{
181
  /* Check the parameters */
182
  assert(IS_FUNCTIONAL_STATE(NewState));
183
 
184
  if (NewState != DISABLE)
185
  {
186
    /* Enable the selected SPI peripheral */
187
    SPIx->CR1 |= CR1_SPE_Set;
188
  }
189
  else
190
  {
191
    /* Disable the selected SPI peripheral */
192
    SPIx->CR1 &= CR1_SPE_Reset;
193
  }
194
}
195
 
196
/*******************************************************************************
197
* Function Name  : SPI_ITConfig
198
* Description    : Enables or disables the specified SPI interrupts.
199
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
200
*                  - SPI_IT: specifies the SPI interrupts sources to be enabled
201
*                    or disabled.
202
*                    This parameter can be one of the following values:
203
*                       - SPI_IT_TXE: Tx buffer empty interrupt mask
204
*                       - SPI_IT_RXNE: Rx buffer not empty interrupt mask
205
*                       - SPI_IT_ERR: Error interrupt mask
206
*                  - NewState: new state of the specified SPI interrupts.
207
*                    This parameter can be: ENABLE or DISABLE.
208
* Output         : None
209
* Return         : None
210
*******************************************************************************/
211
void SPI_ITConfig(SPI_TypeDef* SPIx, u8 SPI_IT, FunctionalState NewState)
212
{
213
  u16 itpos = 0, itmask = 0 ;
214
 
215
  /* Check the parameters */
216
  assert(IS_FUNCTIONAL_STATE(NewState));
217
  assert(IS_SPI_CONFIG_IT(SPI_IT));
218
 
219
  /* Get the SPI IT index */
220
  itpos = SPI_IT >> 4;
221
  /* Set the IT mask */
222
  itmask = (u16)((u16)1 << itpos);
223
 
224
  if (NewState != DISABLE)
225
  {
226
    /* Enable the selected SPI interrupt */
227
    SPIx->CR2 |= itmask;
228
  }
229
  else
230
  {
231
    /* Disable the selected SPI interrupt */
232
    SPIx->CR2 &= (u16)~itmask;
233
  }
234
}
235
 
236
/*******************************************************************************
237
* Function Name  : SPI_DMACmd
238
* Description    : Enables or disables the SPIx’s DMA interface.
239
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
240
*                  - SPI_DMAReq: specifies the SPI DMA transfer request to be
241
*                    enabled or disabled.
242
*                    This parameter can be any combination of the following values:
243
*                       - SPI_DMAReq_Tx: Tx buffer DMA transfer request
244
*                       - SPI_DMAReq_Rx: Rx buffer DMA transfer request
245
*                  - NewState: new state of the selected SPI DMA transfer request.
246
*                    This parameter can be: ENABLE or DISABLE.
247
* Output         : None
248
* Return         : None
249
*******************************************************************************/
250
void SPI_DMACmd(SPI_TypeDef* SPIx, u16 SPI_DMAReq, FunctionalState NewState)
251
{
252
  /* Check the parameters */
253
  assert(IS_FUNCTIONAL_STATE(NewState));
254
  assert(IS_SPI_DMA_REQ(SPI_DMAReq));
255
 
256
  if (NewState != DISABLE)
257
  {
258
    /* Enable the selected SPI DMA requests */
259
    SPIx->CR2 |= SPI_DMAReq;
260
  }
261
  else
262
  {
263
    /* Disable the selected SPI DMA requests */
264
    SPIx->CR2 &= (u16)~SPI_DMAReq;
265
  }
266
}
267
 
268
/*******************************************************************************
269
* Function Name  : SPI_SendData
270
* Description    : Transmits a Data through the SPIx peripheral.
271
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
272
*                  - Data : Data to be transmitted..
273
* Output         : None
274
* Return         : None
275
*******************************************************************************/
276
void SPI_SendData(SPI_TypeDef* SPIx, u16 Data)
277
{
278
  /* Write in the DR register the data to be sent */
279
  SPIx->DR = Data;
280
}
281
 
282
/*******************************************************************************
283
* Function Name  : SPI_ReceiveData
284
* Description    : Returns the most recent received data by the SPIx peripheral.
285
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
286
* Output         : None
287
* Return         : The value of the received data.
288
*******************************************************************************/
289
u16 SPI_ReceiveData(SPI_TypeDef* SPIx)
290
{
291
  /* Return the data in the DR register */
292
  return SPIx->DR;
293
}
294
 
295
/*******************************************************************************
296
* Function Name  : SPI_NSSInternalSoftwareConfig
297
* Description    : Configures internally by software the NSS pin for the selected
298
*                  SPI.
299
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
300
*                  - SPI_NSSInternalSoft: specifies the SPI NSS internal state.
301
*                    This parameter can be one of the following values:
302
*                       - SPI_NSSInternalSoft_Set: Set NSS pin internally
303
*                       - SPI_NSSInternalSoft_Reset: Reset NSS pin internally
304
* Output         : None
305
* Return         : None
306
*******************************************************************************/
307
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, u16 SPI_NSSInternalSoft)
308
{
309
  /* Check the parameters */
310
  assert(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft));
311
 
312
  if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset)
313
  {
314
    /* Set NSS pin internally by software */
315
    SPIx->CR1 |= SPI_NSSInternalSoft_Set;
316
  }
317
  else
318
  {
319
    /* Reset NSS pin internally by software */
320
    SPIx->CR1 &= SPI_NSSInternalSoft_Reset;
321
  }
322
}
323
 
324
/*******************************************************************************
325
* Function Name  : SPI_SSOutputCmd
326
* Description    : Enables or disables the SS output for the selected SPI.
327
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
328
*                  - NewState: new state of the SPIx SS output.
329
*                    This parameter can be: ENABLE or DISABLE.
330
* Output         : None
331
* Return         : None
332
*******************************************************************************/
333
void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState)
334
{
335
  /* Check the parameters */
336
  assert(IS_FUNCTIONAL_STATE(NewState));
337
 
338
  if (NewState != DISABLE)
339
  {
340
    /* Enable the selected SPI SS output */
341
    SPIx->CR2 |= CR2_SSOE_Set;
342
  }
343
  else
344
  {
345
    /* Disable the selected SPI SS output */
346
    SPIx->CR2 &= CR2_SSOE_Reset;
347
  }
348
}
349
 
350
/*******************************************************************************
351
* Function Name  : SPI_DataSizeConfig
352
* Description    : Configures the data size for the selected SPI.
353
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
354
*                  - SPI_DataSize: specifies the SPI data size.
355
*                    This parameter can be one of the following values:
356
*                       - SPI_DataSize_16b: Set data frame format to 16bit
357
*                       - SPI_DataSize_8b: Set data frame format to 8bit
358
* Output         : None
359
* Return         : None
360
*******************************************************************************/
361
void SPI_DataSizeConfig(SPI_TypeDef* SPIx, u16 SPI_DataSize)
362
{
363
  /* Check the parameters */
364
  assert(IS_SPI_DATASIZE(SPI_DataSize));
365
 
366
  if (SPI_DataSize != SPI_DataSize_8b)
367
  {
368
    /* Set data frame format to 16bit */
369
    SPIx->CR1 |= SPI_DataSize_16b;
370
  }
371
  else
372
  {
373
    /* Set data frame format to 8bit */
374
    SPIx->CR1 &= SPI_DataSize_8b;
375
  }
376
}
377
 
378
/*******************************************************************************
379
* Function Name  : SPI_TransmitCRC
380
* Description    : Transmit the SPIx CRC value.
381
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
382
* Output         : None
383
* Return         : None
384
*******************************************************************************/
385
void SPI_TransmitCRC(SPI_TypeDef* SPIx)
386
{
387
  /* Enable the selected SPI CRC transmission */
388
  SPIx->CR1 |= CR1_CRCNext_Set;
389
}
390
 
391
/*******************************************************************************
392
* Function Name  : SPI_CalculateCRC
393
* Description    : Enables or disables the CRC value calculation of the
394
*                  transfered bytes.
395
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
396
*                  - NewState: new state of the SPIx CRC value calculation.
397
*                    This parameter can be: ENABLE or DISABLE.
398
* Output         : None
399
* Return         : None
400
*******************************************************************************/
401
void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState)
402
{
403
  /* Check the parameters */
404
  assert(IS_FUNCTIONAL_STATE(NewState));
405
 
406
  if (NewState != DISABLE)
407
  {
408
    /* Enable the selected SPI CRC calculation */
409
    SPIx->CR1 |= CR1_CRCEN_Set;
410
  }
411
  else
412
  {
413
    /* Disable the selected SPI CRC calculation */
414
    SPIx->CR1 &= CR1_CRCEN_Reset;
415
  }
416
}
417
 
418
/*******************************************************************************
419
* Function Name  : SPI_GetCRC
420
* Description    : Returns the transmit or the receive CRC register value for
421
*                  the specified SPI.
422
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
423
*                  - SPI_CRC: specifies the CRC register to be read.
424
*                    This parameter can be one of the following values:
425
*                       - SPI_CRC_Tx: Selects Tx CRC register
426
*                       - SPI_CRC_Rx: Selects Rx CRC register
427
* Output         : None
428
* Return         : The selected CRC register value..
429
*******************************************************************************/
430
u16 SPI_GetCRC(SPI_TypeDef* SPIx, u8 SPI_CRC)
431
{
432
  u16 crcreg = 0;
433
 
434
  /* Check the parameters */
435
  assert(IS_SPI_CRC(SPI_CRC));
436
 
437
  if (SPI_CRC != SPI_CRC_Rx)
438
  {
439
    /* Get the Tx CRC register */
440
    crcreg = SPIx->TXCRCR;
441
  }
442
  else
443
  {
444
    /* Get the Rx CRC register */
445
    crcreg = SPIx->RXCRCR;
446
  }
447
 
448
  /* Return the selected CRC register */
449
  return crcreg;
450
}
451
 
452
/*******************************************************************************
453
* Function Name  : SPI_GetCRCPolynomial
454
* Description    : Returns the CRC Polynomial register value for the specified SPI.
455
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
456
* Output         : None
457
* Return         : The CRC Polynomial register value.
458
*******************************************************************************/
459
u16 SPI_GetCRCPolynomial(SPI_TypeDef* SPIx)
460
{
461
  /* Return the CRC polynomial register */
462
  return SPIx->CRCPR;
463
}
464
 
465
/*******************************************************************************
466
* Function Name  : SPI_BiDirectionalLineConfig
467
* Description    : Selects the data transfer direction in bi-directional mode
468
*                  for the specified SPI.
469
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
470
*                  - SPI_Direction: specifies the data transfer direction in
471
*                    bi-directional mode.
472
*                    This parameter can be one of the following values:
473
*                       - SPI_Direction_Tx: Selects Tx transmission direction
474
*                       - SPI_Direction_Rx: Selects Rx receive direction
475
* Output         : None
476
* Return         : None
477
*******************************************************************************/
478
void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, u16 SPI_Direction)
479
{
480
  /* Check the parameters */
481
  assert(IS_SPI_DIRECTION(SPI_Direction));
482
 
483
  if (SPI_Direction == SPI_Direction_Tx)
484
  {
485
    /* Set the Tx only mode */
486
    SPIx->CR1 |= SPI_Direction_Tx;
487
  }
488
  else
489
  {
490
    /* Set the Rx only mode */
491
    SPIx->CR1 &= SPI_Direction_Rx;
492
  }
493
}
494
 
495
/*******************************************************************************
496
* Function Name  : SPI_GetFlagStatus
497
* Description    : Checks whether the specified SPI flag is set or not.
498
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
499
*                  - SPI_FLAG: specifies the flag to check.
500
*                    This parameter can be one of the following values:
501
*                       - SPI_FLAG_BSY: Busy flag.
502
*                       - SPI_FLAG_OVR: Overrun flag.
503
*                       - SPI_FLAG_MODF: Mode Fault flag.
504
*                       - SPI_FLAG_CRCERR: CRC Error flag.
505
*                       - SPI_FLAG_TXE: Transmit buffer empty flag.
506
*                       - SPI_FLAG_RXNE: Receive buffer not empty flag.
507
* Output         : None
508
* Return         : The new state of SPI_FLAG (SET or RESET).
509
*******************************************************************************/
510
FlagStatus SPI_GetFlagStatus(SPI_TypeDef* SPIx, u16 SPI_FLAG)
511
{
512
  FlagStatus bitstatus = RESET;
513
 
514
  /* Check the parameters */
515
  assert(IS_SPI_GET_FLAG(SPI_FLAG));
516
 
517
  /* Check the status of the specified SPI flag */
518
  if ((SPIx->SR & SPI_FLAG) != (u16)RESET)
519
  {
520
    /* SPI_FLAG is set */
521
    bitstatus = SET;
522
  }
523
  else
524
  {
525
    /* SPI_FLAG is reset */
526
    bitstatus = RESET;
527
  }
528
  /* Return the SPI_FLAG status */
529
  return  bitstatus;
530
}
531
 
532
/*******************************************************************************
533
* Function Name  : SPI_ClearFlag
534
* Description    : Clears the SPIx's pending flags.
535
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
536
*                  - SPI_FLAG: specifies the flag to clear.
537
*                    This parameter can be any combination of the following values:
538
*                       - SPI_FLAG_OVR: Overrun flag.
539
*                       - SPI_FLAG_MODF: Mode Fault flag.
540
*                       - SPI_FLAG_CRCERR: CRC Error flag.
541
* Output         : None
542
* Return         : None
543
*******************************************************************************/
544
void SPI_ClearFlag(SPI_TypeDef* SPIx, u16 SPI_FLAG)
545
{
546
  /* Check the parameters */
547
  assert(IS_SPI_CLEAR_FLAG(SPI_FLAG));
548
 
549
  /* SPI_FLAG_MODF flag clear */
550
  if(SPI_FLAG == SPI_FLAG_MODF)
551
  {
552
    /* Read SR register */
553
    (void)SPIx->SR;
554
    /* Write on CR1 register */
555
    SPIx->CR1 |= CR1_SPE_Set;
556
  }
557
  /* SPI_FLAG_OVR flag clear */
558
  else if(SPI_FLAG == SPI_FLAG_OVR)
559
  {
560
    /* Read SR register */
561
    (void)SPIx->SR;
562
  }
563
  else /* SPI_FLAG_CRCERR flag clear */
564
  {
565
    /* Clear the selected SPI flag */
566
    SPIx->SR &= (u16)~SPI_FLAG;
567
  }
568
}
569
 
570
/*******************************************************************************
571
* Function Name  : SPI_GetITStatus
572
* Description    : Checks whether the specified SPI interrupt has occurred or not.
573
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
574
*                  - SPI_IT: specifies the SPI interrupt source to check.
575
*                    This parameter can be one of the following values:
576
*                       - SPI_IT_OVR: Overrun interrupt.
577
*                       - SPI_IT_MODF: Mode Fault interrupt.
578
*                       - SPI_IT_CRCERR: CRC Error interrupt.
579
*                       - SPI_IT_TXE: Transmit buffer empty interrupt.
580
*                       - SPI_IT_RXNE: Receive buffer not empty interrupt.
581
* Output         : None
582
* Return         : The new state of SPI_IT (SET or RESET).
583
*******************************************************************************/
584
ITStatus SPI_GetITStatus(SPI_TypeDef* SPIx, u8 SPI_IT)
585
{
586
  ITStatus bitstatus = RESET;
587
  u16 itpos = 0, itmask = 0, enablestatus = 0;
588
 
589
  /* Check the parameters */
590
  assert(IS_SPI_GET_IT(SPI_IT));
591
 
592
  /* Get the SPI IT index */
593
  itpos = (u16)((u16)0x01 << (SPI_IT & (u8)0x0F));
594
 
595
  /* Get the SPI IT index */
596
  itmask = SPI_IT >> 4;
597
  /* Set the IT mask */
598
  itmask = (u16)((u16)0x01 << itmask);
599
  /* Get the SPI_IT enable bit status */
600
  enablestatus = (SPIx->CR2 & itmask) ;
601
 
602
  /* Check the status of the specified SPI interrupt */
603
  if (((SPIx->SR & itpos) != (u16)RESET) && enablestatus)
604
  {
605
    /* SPI_IT is set */
606
    bitstatus = SET;
607
  }
608
  else
609
  {
610
    /* SPI_IT is reset */
611
    bitstatus = RESET;
612
  }
613
  /* Return the SPI_IT status */
614
  return bitstatus;
615
}
616
 
617
/*******************************************************************************
618
* Function Name  : SPI_ClearITPendingBit
619
* Description    : Clears the SPI’s interrupt pending bits.
620
* Input          : - SPIx: where x can be 1 or 2 to select the SPI peripheral.
621
*                  - SPI_IT: specifies the SPI interrupt pending bit to clear.
622
*                    This parameter can be one of the following values:
623
*                       - SPI_IT_OVR: Overrun interrupt.
624
*                       - SPI_IT_MODF: Mode Fault interrupt.
625
*                       - SPI_IT_CRCERR: CRC Error interrupt.
626
* Output         : None
627
* Return         : None
628
*******************************************************************************/
629
void SPI_ClearITPendingBit(SPI_TypeDef* SPIx, u8 SPI_IT)
630
{
631
  u16 itpos = 0;
632
 
633
  /* Check the parameters */
634
  assert(IS_SPI_CLEAR_IT(SPI_IT));
635
 
636
  /* SPI_IT_MODF pending bit clear */
637
  if(SPI_IT == SPI_IT_MODF)
638
  {
639
    /* Read SR register */
640
    (void)SPIx->SR;
641
    /* Write on CR1 register */
642
    SPIx->CR1 |= CR1_SPE_Set;
643
  }
644
  else if(SPI_IT == SPI_IT_OVR)   /* SPI_IT_OVR pending bit clear */
645
  {
646
    /* Read SR register */
647
    (void)(SPIx->SR);
648
  }
649
  else   /* SPI_IT_CRCERR pending bit clear */
650
  {
651
    /* Get the SPI IT index */
652
    itpos = (u16)((u16)0x01 << (SPI_IT & (u8)0x0F));
653
    /* Clear the selected SPI interrupt pending bits */
654
    SPIx->SR &= (u16)~itpos;
655
  }
656
}
657
 
658
/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.