stm32f10x_spi.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:34k
源码类别:

uCOS

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
  2. * File Name          : stm32f10x_spi.c
  3. * Author             : MCD Application Team
  4. * Version            : V2.0.2
  5. * Date               : 07/11/2008
  6. * Description        : This file provides all the SPI firmware functions.
  7. ********************************************************************************
  8. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  9. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  10. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  11. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  12. * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  13. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  14. *******************************************************************************/
  15. /* Includes ------------------------------------------------------------------*/
  16. #include "stm32f10x_spi.h"
  17. #include "stm32f10x_rcc.h"
  18. /* Private typedef -----------------------------------------------------------*/
  19. /* Private define ------------------------------------------------------------*/
  20. /* SPI SPE mask */
  21. #define CR1_SPE_Set          ((u16)0x0040)
  22. #define CR1_SPE_Reset        ((u16)0xFFBF)
  23. /* I2S I2SE mask */
  24. #define I2SCFGR_I2SE_Set     ((u16)0x0400)
  25. #define I2SCFGR_I2SE_Reset   ((u16)0xFBFF)
  26. /* SPI CRCNext mask */
  27. #define CR1_CRCNext_Set      ((u16)0x1000)
  28. /* SPI CRCEN mask */
  29. #define CR1_CRCEN_Set        ((u16)0x2000)
  30. #define CR1_CRCEN_Reset      ((u16)0xDFFF)
  31. /* SPI SSOE mask */
  32. #define CR2_SSOE_Set         ((u16)0x0004)
  33. #define CR2_SSOE_Reset       ((u16)0xFFFB)
  34. /* SPI registers Masks */
  35. #define CR1_CLEAR_Mask       ((u16)0x3040)
  36. #define I2SCFGR_CLEAR_Mask   ((u16)0xF040)
  37. /* SPI or I2S mode selection masks */
  38. #define SPI_Mode_Select      ((u16)0xF7FF)
  39. #define I2S_Mode_Select      ((u16)0x0800) 
  40. /* Private macro -------------------------------------------------------------*/
  41. /* Private variables ---------------------------------------------------------*/
  42. /* Private function prototypes -----------------------------------------------*/
  43. /* Private functions ---------------------------------------------------------*/
  44. /*******************************************************************************
  45. * Function Name  : SPI_I2S_DeInit
  46. * Description    : Deinitializes the SPIx peripheral registers to their default
  47. *                  reset values (Affects also the I2Ss).
  48. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  49. * Output         : None
  50. * Return         : None
  51. *******************************************************************************/
  52. void SPI_I2S_DeInit(SPI_TypeDef* SPIx)
  53. {
  54.   /* Check the parameters */
  55.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  56.   
  57.   switch (*(u32*)&SPIx)
  58.   {
  59.     case SPI1_BASE:
  60.       /* Enable SPI1 reset state */
  61.       RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);
  62.       /* Release SPI1 from reset state */
  63.       RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE);
  64.       break;
  65.     case SPI2_BASE:
  66.       /* Enable SPI2 reset state */
  67.       RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
  68.       /* Release SPI2 from reset state */
  69.       RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);
  70.       break;
  71.     case SPI3_BASE:
  72.       /* Enable SPI3 reset state */
  73.       RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE);
  74.       /* Release SPI3 from reset state */
  75.       RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE);
  76.       break;
  77.     default:
  78.       break;
  79.   }
  80. }
  81. /*******************************************************************************
  82. * Function Name  : SPI_Init
  83. * Description    : Initializes the SPIx peripheral according to the specified 
  84. *                  parameters in the SPI_InitStruct.
  85. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  86. *                  - SPI_InitStruct: pointer to a SPI_InitTypeDef structure that
  87. *                    contains the configuration information for the specified
  88. *                    SPI peripheral.
  89. * Output         : None
  90. * Return         : None
  91. ******************************************************************************/
  92. void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct)
  93. {
  94.   u16 tmpreg = 0;
  95.   
  96.   /* check the parameters */
  97.   assert_param(IS_SPI_ALL_PERIPH(SPIx));   
  98.   
  99.   /* Check the SPI parameters */
  100.   assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction));
  101.   assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode));
  102.   assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize));
  103.   assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL));
  104.   assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA));
  105.   assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS));
  106.   assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler));
  107.   assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit));
  108.   assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial));
  109. /*---------------------------- SPIx CR1 Configuration ------------------------*/
  110.   /* Get the SPIx CR1 value */
  111.   tmpreg = SPIx->CR1;
  112.   /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */
  113.   tmpreg &= CR1_CLEAR_Mask;
  114.   /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler
  115.      master/salve mode, CPOL and CPHA */
  116.   /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */
  117.   /* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */
  118.   /* Set LSBFirst bit according to SPI_FirstBit value */
  119.   /* Set BR bits according to SPI_BaudRatePrescaler value */
  120.   /* Set CPOL bit according to SPI_CPOL value */
  121.   /* Set CPHA bit according to SPI_CPHA value */
  122.   tmpreg |= (u16)((u32)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode |
  123.                   SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL |  
  124.                   SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS |  
  125.                   SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit);
  126.   /* Write to SPIx CR1 */
  127.   SPIx->CR1 = tmpreg;
  128.   
  129.   /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */
  130.   SPIx->I2SCFGR &= SPI_Mode_Select;
  131. /*---------------------------- SPIx CRCPOLY Configuration --------------------*/
  132.   /* Write to SPIx CRCPOLY */
  133.   SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial;
  134. }
  135. /*******************************************************************************
  136. * Function Name  : I2S_Init
  137. * Description    : Initializes the SPIx peripheral according to the specified 
  138. *                  parameters in the I2S_InitStruct.
  139. * Input          : - SPIx: where x can be  2 or 3 to select the SPI peripheral
  140. *                     (configured in I2S mode).
  141. *                  - I2S_InitStruct: pointer to an I2S_InitTypeDef structure that
  142. *                    contains the configuration information for the specified
  143. *                    SPI peripheral configured in I2S mode.
  144. * Output         : None
  145. * Return         : None
  146. ******************************************************************************/
  147. void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct)
  148. {
  149.   u16 tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1;
  150.   u32 tmp = 0;
  151.   RCC_ClocksTypeDef RCC_Clocks;
  152.    
  153.   /* Check the I2S parameters */
  154.   assert_param(IS_SPI_23_PERIPH(SPIx));
  155.   assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode));
  156.   assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard));
  157.   assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat));
  158.   assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput));
  159.   assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq));
  160.   assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL));  
  161. /*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/
  162.   /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */
  163.   SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; 
  164.   SPIx->I2SPR = 0x0002;
  165.   
  166.   /* Get the I2SCFGR register value */
  167.   tmpreg = SPIx->I2SCFGR;
  168.   
  169.   /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/
  170.   if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default)
  171.   {
  172.     i2sodd = (u16)0;
  173.     i2sdiv = (u16)2;   
  174.   }
  175.   /* If the requested audio frequency is not the default, compute the prescaler */
  176.   else
  177.   {
  178.     /* Check the frame length (For the Prescaler computing) */
  179.     if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b)
  180.     {
  181.       /* Packet length is 16 bits */
  182.       packetlength = 1;
  183.     }
  184.     else
  185.     {
  186.       /* Packet length is 32 bits */
  187.       packetlength = 2;
  188.     }
  189.     /* Get System Clock frequency */
  190.     RCC_GetClocksFreq(&RCC_Clocks);
  191.     
  192.     /* Compute the Real divider depending on the MCLK output state with a flaoting point */
  193.     if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable)
  194.     {
  195.       /* MCLK output is enabled */
  196.       tmp = (u16)(((10 * RCC_Clocks.SYSCLK_Frequency) / (256 * I2S_InitStruct->I2S_AudioFreq)) + 5);
  197.     }
  198.     else
  199.     {
  200.       /* MCLK output is disabled */
  201.       tmp = (u16)(((10 * RCC_Clocks.SYSCLK_Frequency) / (32 * packetlength * I2S_InitStruct->I2S_AudioFreq)) + 5);
  202.     }
  203.     
  204.     /* Remove the flaoting point */
  205.     tmp = tmp/10;  
  206.       
  207.     /* Check the parity of the divider */
  208.     i2sodd = (u16)(tmp & (u16)0x0001);
  209.    
  210.     /* Compute the i2sdiv prescaler */
  211.     i2sdiv = (u16)((tmp - i2sodd) / 2);
  212.    
  213.     /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */
  214.     i2sodd = (u16) (i2sodd << 8);
  215.   }
  216.   
  217.   /* Test if the divider is 1 or 0 */
  218.   if ((i2sdiv < 2) || (i2sdiv > 0xFF))
  219.   {
  220.     /* Set the default values */
  221.     i2sdiv = 2;
  222.     i2sodd = 0;
  223.   }
  224.   /* Write to SPIx I2SPR register the computed value */
  225.   SPIx->I2SPR = (u16)(i2sdiv | i2sodd | I2S_InitStruct->I2S_MCLKOutput);  
  226.  
  227.   /* Configure the I2S with the SPI_InitStruct values */
  228.   tmpreg |= (u16)(I2S_Mode_Select | I2S_InitStruct->I2S_Mode | 
  229.                   I2S_InitStruct->I2S_Standard | I2S_InitStruct->I2S_DataFormat | 
  230.                   I2S_InitStruct->I2S_CPOL);
  231.  
  232.   /* Write to SPIx I2SCFGR */  
  233.   SPIx->I2SCFGR = tmpreg;                                    
  234. }
  235. /*******************************************************************************
  236. * Function Name  : SPI_StructInit
  237. * Description    : Fills each SPI_InitStruct member with its default value.
  238. * Input          : - SPI_InitStruct : pointer to a SPI_InitTypeDef structure
  239. *                    which will be initialized.
  240. * Output         : None
  241. * Return         : None
  242. *******************************************************************************/
  243. void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct)
  244. {
  245. /*--------------- Reset SPI init structure parameters values -----------------*/
  246.   /* Initialize the SPI_Direction member */
  247.   SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  248.   /* initialize the SPI_Mode member */
  249.   SPI_InitStruct->SPI_Mode = SPI_Mode_Slave;
  250.   /* initialize the SPI_DataSize member */
  251.   SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b;
  252.   /* Initialize the SPI_CPOL member */
  253.   SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low;
  254.   /* Initialize the SPI_CPHA member */
  255.   SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge;
  256.   /* Initialize the SPI_NSS member */
  257.   SPI_InitStruct->SPI_NSS = SPI_NSS_Hard;
  258.   /* Initialize the SPI_BaudRatePrescaler member */
  259.   SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  260.   /* Initialize the SPI_FirstBit member */
  261.   SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB;
  262.   /* Initialize the SPI_CRCPolynomial member */
  263.   SPI_InitStruct->SPI_CRCPolynomial = 7;
  264. }
  265. /*******************************************************************************
  266. * Function Name  : I2S_StructInit
  267. * Description    : Fills each I2S_InitStruct member with its default value.
  268. * Input          : - I2S_InitStruct : pointer to a I2S_InitTypeDef structure
  269. *                    which will be initialized.
  270. * Output         : None
  271. * Return         : None
  272. *******************************************************************************/
  273. void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct)
  274. {
  275. /*--------------- Reset I2S init structure parameters values -----------------*/
  276.   /* Initialize the I2S_Mode member */
  277.   I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx;
  278.   
  279.   /* Initialize the I2S_Standard member */
  280.   I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips;
  281.   
  282.   /* Initialize the I2S_DataFormat member */
  283.   I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b;
  284.   
  285.   /* Initialize the I2S_MCLKOutput member */
  286.   I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable;
  287.   
  288.   /* Initialize the I2S_AudioFreq member */
  289.   I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default;
  290.   
  291.   /* Initialize the I2S_CPOL member */
  292.   I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low;
  293. }
  294. /*******************************************************************************
  295. * Function Name  : SPI_Cmd
  296. * Description    : Enables or disables the specified SPI peripheral.
  297. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  298. *                  - NewState: new state of the SPIx peripheral. 
  299. *                    This parameter can be: ENABLE or DISABLE.
  300. * Output         : None
  301. * Return         : None
  302. *******************************************************************************/
  303. void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)
  304. {
  305.   /* Check the parameters */
  306.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  307.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  308.   if (NewState != DISABLE)
  309.   {
  310.     /* Enable the selected SPI peripheral */
  311.     SPIx->CR1 |= CR1_SPE_Set;
  312.   }
  313.   else
  314.   {
  315.     /* Disable the selected SPI peripheral */
  316.     SPIx->CR1 &= CR1_SPE_Reset;
  317.   }
  318. }
  319. /*******************************************************************************
  320. * Function Name  : I2S_Cmd
  321. * Description    : Enables or disables the specified SPI peripheral (in I2S mode).
  322. * Input          : - SPIx: where x can be 2 or 3 to select the SPI peripheral.
  323. *                  - NewState: new state of the SPIx peripheral. 
  324. *                    This parameter can be: ENABLE or DISABLE.
  325. * Output         : None
  326. * Return         : None
  327. *******************************************************************************/
  328. void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)
  329. {
  330.   /* Check the parameters */
  331.   assert_param(IS_SPI_23_PERIPH(SPIx));
  332.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  333.   if (NewState != DISABLE)
  334.   {
  335.     /* Enable the selected SPI peripheral (in I2S mode) */
  336.     SPIx->I2SCFGR |= I2SCFGR_I2SE_Set;
  337.   }
  338.   else
  339.   {
  340.     /* Disable the selected SPI peripheral (in I2S mode) */
  341.     SPIx->I2SCFGR &= I2SCFGR_I2SE_Reset;
  342.   }
  343. }
  344. /*******************************************************************************
  345. * Function Name  : SPI_I2S_ITConfig
  346. * Description    : Enables or disables the specified SPI/I2S interrupts.
  347. * Input          : - SPIx: where x can be :
  348. *                         - 1, 2 or 3 in SPI mode 
  349. *                         - 2 or 3 in I2S mode
  350. *                  - SPI_I2S_IT: specifies the SPI/I2S interrupt source to be 
  351. *                    enabled or disabled. 
  352. *                    This parameter can be one of the following values:
  353. *                       - SPI_I2S_IT_TXE: Tx buffer empty interrupt mask
  354. *                       - SPI_I2S_IT_RXNE: Rx buffer not empty interrupt mask
  355. *                       - SPI_I2S_IT_ERR: Error interrupt mask
  356. *                  - NewState: new state of the specified SPI/I2S interrupt.
  357. *                    This parameter can be: ENABLE or DISABLE.
  358. * Output         : None
  359. * Return         : None
  360. *******************************************************************************/
  361. void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, u8 SPI_I2S_IT, FunctionalState NewState)
  362. {
  363.   u16 itpos = 0, itmask = 0 ;
  364.   /* Check the parameters */
  365.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  366.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  367.   assert_param(IS_SPI_I2S_CONFIG_IT(SPI_I2S_IT));
  368.   /* Get the SPI/I2S IT index */
  369.   itpos = SPI_I2S_IT >> 4;
  370.   /* Set the IT mask */
  371.   itmask = (u16)((u16)1 << itpos);
  372.   if (NewState != DISABLE)
  373.   {
  374.     /* Enable the selected SPI/I2S interrupt */
  375.     SPIx->CR2 |= itmask;
  376.   }
  377.   else
  378.   {
  379.     /* Disable the selected SPI/I2S interrupt */
  380.     SPIx->CR2 &= (u16)~itmask;
  381.   }
  382. }
  383. /*******************************************************************************
  384. * Function Name  : SPI_I2S_DMACmd
  385. * Description    : Enables or disables the SPIx/I2Sx DMA interface.
  386. * Input          : - SPIx: where x can be :
  387. *                         - 1, 2 or 3 in SPI mode 
  388. *                         - 2 or 3 in I2S mode
  389. *                  - SPI_I2S_DMAReq: specifies the SPI/I2S DMA transfer request 
  390. *                    to be enabled or disabled. 
  391. *                    This parameter can be any combination of the following values:
  392. *                       - SPI_I2S_DMAReq_Tx: Tx buffer DMA transfer request
  393. *                       - SPI_I2S_DMAReq_Rx: Rx buffer DMA transfer request
  394. *                  - NewState: new state of the selected SPI/I2S DMA transfer 
  395. *                    request.
  396. *                    This parameter can be: ENABLE or DISABLE.
  397. * Output         : None
  398. * Return         : None
  399. *******************************************************************************/
  400. void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, u16 SPI_I2S_DMAReq, FunctionalState NewState)
  401. {
  402.   /* Check the parameters */
  403.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  404.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  405.   assert_param(IS_SPI_I2S_DMAREQ(SPI_I2S_DMAReq));
  406.   if (NewState != DISABLE)
  407.   {
  408.     /* Enable the selected SPI/I2S DMA requests */
  409.     SPIx->CR2 |= SPI_I2S_DMAReq;
  410.   }
  411.   else
  412.   {
  413.     /* Disable the selected SPI/I2S DMA requests */
  414.     SPIx->CR2 &= (u16)~SPI_I2S_DMAReq;
  415.   }
  416. }
  417. /*******************************************************************************
  418. * Function Name  : SPI_I2S_SendData
  419. * Description    : Transmits a Data through the SPIx/I2Sx peripheral.
  420. * Input          : - SPIx: where x can be :
  421. *                         - 1, 2 or 3 in SPI mode 
  422. *                         - 2 or 3 in I2S mode
  423. *                  - Data : Data to be transmitted..
  424. * Output         : None
  425. * Return         : None
  426. *******************************************************************************/
  427. void SPI_I2S_SendData(SPI_TypeDef* SPIx, u16 Data)
  428. {
  429.   /* Check the parameters */
  430.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  431.   
  432.   /* Write in the DR register the data to be sent */
  433.   SPIx->DR = Data;
  434. }
  435. /*******************************************************************************
  436. * Function Name  : SPI_I2S_ReceiveData
  437. * Description    : Returns the most recent received data by the SPIx/I2Sx peripheral. 
  438. * Input          : - SPIx: where x can be :
  439. *                         - 1, 2 or 3 in SPI mode 
  440. *                         - 2 or 3 in I2S mode
  441. * Output         : None
  442. * Return         : The value of the received data.
  443. *******************************************************************************/
  444. u16 SPI_I2S_ReceiveData(SPI_TypeDef* SPIx)
  445. {
  446.   /* Check the parameters */
  447.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  448.   
  449.   /* Return the data in the DR register */
  450.   return SPIx->DR;
  451. }
  452. /*******************************************************************************
  453. * Function Name  : SPI_NSSInternalSoftwareConfig
  454. * Description    : Configures internally by software the NSS pin for the selected 
  455. *                  SPI.
  456. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  457. *                  - SPI_NSSInternalSoft: specifies the SPI NSS internal state.
  458. *                    This parameter can be one of the following values:
  459. *                       - SPI_NSSInternalSoft_Set: Set NSS pin internally
  460. *                       - SPI_NSSInternalSoft_Reset: Reset NSS pin internally
  461. * Output         : None
  462. * Return         : None
  463. *******************************************************************************/
  464. void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, u16 SPI_NSSInternalSoft)
  465. {
  466.   /* Check the parameters */
  467.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  468.   assert_param(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft));
  469.   if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset)
  470.   {
  471.     /* Set NSS pin internally by software */
  472.     SPIx->CR1 |= SPI_NSSInternalSoft_Set;
  473.   }
  474.   else
  475.   {
  476.     /* Reset NSS pin internally by software */
  477.     SPIx->CR1 &= SPI_NSSInternalSoft_Reset;
  478.   }
  479. }
  480. /*******************************************************************************
  481. * Function Name  : SPI_SSOutputCmd
  482. * Description    : Enables or disables the SS output for the selected SPI.
  483. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  484. *                  - NewState: new state of the SPIx SS output. 
  485. *                    This parameter can be: ENABLE or DISABLE.
  486. * Output         : None
  487. * Return         : None
  488. *******************************************************************************/
  489. void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState)
  490. {
  491.   /* Check the parameters */
  492.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  493.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  494.   if (NewState != DISABLE)
  495.   {
  496.     /* Enable the selected SPI SS output */
  497.     SPIx->CR2 |= CR2_SSOE_Set;
  498.   }
  499.   else
  500.   {
  501.     /* Disable the selected SPI SS output */
  502.     SPIx->CR2 &= CR2_SSOE_Reset;
  503.   }
  504. }
  505. /*******************************************************************************
  506. * Function Name  : SPI_DataSizeConfig
  507. * Description    : Configures the data size for the selected SPI.
  508. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  509. *                  - SPI_DataSize: specifies the SPI data size.
  510. *                    This parameter can be one of the following values:
  511. *                       - SPI_DataSize_16b: Set data frame format to 16bit
  512. *                       - SPI_DataSize_8b: Set data frame format to 8bit
  513. * Output         : None
  514. * Return         : None
  515. *******************************************************************************/
  516. void SPI_DataSizeConfig(SPI_TypeDef* SPIx, u16 SPI_DataSize)
  517. {
  518.   /* Check the parameters */
  519.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  520.   assert_param(IS_SPI_DATASIZE(SPI_DataSize));
  521.   /* Clear DFF bit */
  522.   SPIx->CR1 &= (u16)~SPI_DataSize_16b;
  523.   /* Set new DFF bit value */
  524.   SPIx->CR1 |= SPI_DataSize;
  525. }
  526. /*******************************************************************************
  527. * Function Name  : SPI_TransmitCRC
  528. * Description    : Transmit the SPIx CRC value.
  529. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  530. * Output         : None
  531. * Return         : None
  532. *******************************************************************************/
  533. void SPI_TransmitCRC(SPI_TypeDef* SPIx)
  534. {
  535.   /* Check the parameters */
  536.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  537.   
  538.   /* Enable the selected SPI CRC transmission */
  539.   SPIx->CR1 |= CR1_CRCNext_Set;
  540. }
  541. /*******************************************************************************
  542. * Function Name  : SPI_CalculateCRC
  543. * Description    : Enables or disables the CRC value calculation of the
  544. *                  transfered bytes.
  545. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  546. *                  - NewState: new state of the SPIx CRC value calculation.
  547. *                    This parameter can be: ENABLE or DISABLE.
  548. * Output         : None
  549. * Return         : None
  550. *******************************************************************************/
  551. void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState)
  552. {
  553.   /* Check the parameters */
  554.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  555.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  556.   if (NewState != DISABLE)
  557.   {
  558.     /* Enable the selected SPI CRC calculation */
  559.     SPIx->CR1 |= CR1_CRCEN_Set;
  560.   }
  561.   else
  562.   {
  563.     /* Disable the selected SPI CRC calculation */
  564.     SPIx->CR1 &= CR1_CRCEN_Reset;
  565.   }
  566. }
  567. /*******************************************************************************
  568. * Function Name  : SPI_GetCRC
  569. * Description    : Returns the transmit or the receive CRC register value for
  570. *                  the specified SPI.
  571. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  572. *                  - SPI_CRC: specifies the CRC register to be read.
  573. *                    This parameter can be one of the following values:
  574. *                       - SPI_CRC_Tx: Selects Tx CRC register
  575. *                       - SPI_CRC_Rx: Selects Rx CRC register
  576. * Output         : None
  577. * Return         : The selected CRC register value..
  578. *******************************************************************************/
  579. u16 SPI_GetCRC(SPI_TypeDef* SPIx, u8 SPI_CRC)
  580. {
  581.   u16 crcreg = 0;
  582.   /* Check the parameters */
  583.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  584.   assert_param(IS_SPI_CRC(SPI_CRC));
  585.   if (SPI_CRC != SPI_CRC_Rx)
  586.   {
  587.     /* Get the Tx CRC register */
  588.     crcreg = SPIx->TXCRCR;
  589.   }
  590.   else
  591.   {
  592.     /* Get the Rx CRC register */
  593.     crcreg = SPIx->RXCRCR;
  594.   }
  595.   /* Return the selected CRC register */
  596.   return crcreg;
  597. }
  598. /*******************************************************************************
  599. * Function Name  : SPI_GetCRCPolynomial
  600. * Description    : Returns the CRC Polynomial register value for the specified SPI.
  601. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  602. * Output         : None
  603. * Return         : The CRC Polynomial register value.
  604. *******************************************************************************/
  605. u16 SPI_GetCRCPolynomial(SPI_TypeDef* SPIx)
  606. {
  607.   /* Check the parameters */
  608.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  609.   
  610.   /* Return the CRC polynomial register */
  611.   return SPIx->CRCPR;
  612. }
  613. /*******************************************************************************
  614. * Function Name  : SPI_BiDirectionalLineConfig
  615. * Description    : Selects the data transfer direction in bi-directional mode
  616. *                  for the specified SPI.
  617. * Input          : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
  618. *                  - SPI_Direction: specifies the data transfer direction in
  619. *                    bi-directional mode. 
  620. *                    This parameter can be one of the following values:
  621. *                       - SPI_Direction_Tx: Selects Tx transmission direction
  622. *                       - SPI_Direction_Rx: Selects Rx receive direction
  623. * Output         : None
  624. * Return         : None
  625. *******************************************************************************/
  626. void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, u16 SPI_Direction)
  627. {
  628.   /* Check the parameters */
  629.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  630.   assert_param(IS_SPI_DIRECTION(SPI_Direction));
  631.   if (SPI_Direction == SPI_Direction_Tx)
  632.   {
  633.     /* Set the Tx only mode */
  634.     SPIx->CR1 |= SPI_Direction_Tx;
  635.   }
  636.   else
  637.   {
  638.     /* Set the Rx only mode */
  639.     SPIx->CR1 &= SPI_Direction_Rx;
  640.   }
  641. }
  642. /*******************************************************************************
  643. * Function Name  : SPI_I2S_GetFlagStatus
  644. * Description    : Checks whether the specified SPI/I2S flag is set or not.
  645. * Input          : - SPIx: where x can be :
  646. *                         - 1, 2 or 3 in SPI mode 
  647. *                         - 2 or 3 in I2S mode
  648. *                  - SPI_I2S_FLAG: specifies the SPI/I2S flag to check. 
  649. *                    This parameter can be one of the following values:
  650. *                       - SPI_I2S_FLAG_TXE: Transmit buffer empty flag.
  651. *                       - SPI_I2S_FLAG_RXNE: Receive buffer not empty flag.
  652. *                       - SPI_I2S_FLAG_BSY: Busy flag.
  653. *                       - SPI_I2S_FLAG_OVR: Overrun flag.
  654. *                       - SPI_FLAG_MODF: Mode Fault flag.
  655. *                       - SPI_FLAG_CRCERR: CRC Error flag.
  656. *                       - I2S_FLAG_UDR: Underrun Error flag.
  657. *                       - I2S_FLAG_CHSIDE: Channel Side flag.
  658. * Output         : None
  659. * Return         : The new state of SPI_I2S_FLAG (SET or RESET).
  660. *******************************************************************************/
  661. FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, u16 SPI_I2S_FLAG)
  662. {
  663.   FlagStatus bitstatus = RESET;
  664.   /* Check the parameters */
  665.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  666.   assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG));
  667.   /* Check the status of the specified SPI/I2S flag */
  668.   if ((SPIx->SR & SPI_I2S_FLAG) != (u16)RESET)
  669.   {
  670.     /* SPI_I2S_FLAG is set */
  671.     bitstatus = SET;
  672.   }
  673.   else
  674.   {
  675.     /* SPI_I2S_FLAG is reset */
  676.     bitstatus = RESET;
  677.   }
  678.   /* Return the SPI_I2S_FLAG status */
  679.   return  bitstatus;
  680. }
  681. /*******************************************************************************
  682. * Function Name  : SPI_I2S_ClearFlag
  683. * Description    : Clears the SPIx CRC Error (CRCERR) flag.
  684. * Input          : - SPIx: where x can be :
  685. *                         - 1, 2 or 3 in SPI mode 
  686. *                  - SPI_I2S_FLAG: specifies the SPI flag to clear. 
  687. *                    This function clears only CRCERR flag.                                           
  688. *                  Notes:
  689. *                       - OVR (OverRun error) flag is cleared by software 
  690. *                         sequence: a read operation to SPI_DR register 
  691. *                         (SPI_I2S_ReceiveData()) followed by a read operation 
  692. *                         to SPI_SR register (SPI_I2S_GetFlagStatus()).                           
  693. *                       - UDR (UnderRun error) flag is cleared by a read 
  694. *                         operation to SPI_SR register (SPI_I2S_GetFlagStatus()).                             
  695. *                       - MODF (Mode Fault) flag is cleared by software sequence: 
  696. *                         a read/write operation to SPI_SR register 
  697. *                         (SPI_I2S_GetFlagStatus()) followed by a write 
  698. *                         operation to SPI_CR1 register (SPI_Cmd() to enable 
  699. *                         the SPI).   
  700. * Output         : None
  701. * Return         : None
  702. *******************************************************************************/
  703. void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, u16 SPI_I2S_FLAG)
  704. {
  705.   /* Check the parameters */
  706.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  707.   assert_param(IS_SPI_I2S_CLEAR_FLAG(SPI_I2S_FLAG));
  708.     
  709.     /* Clear the selected SPI CRC Error (CRCERR) flag */
  710.     SPIx->SR = (u16)~SPI_I2S_FLAG;
  711. }
  712. /*******************************************************************************
  713. * Function Name  : SPI_I2S_GetITStatus
  714. * Description    : Checks whether the specified SPI/I2S interrupt has occurred or not.
  715. * Input          : - SPIx: where x can be :
  716. *                         - 1, 2 or 3 in SPI mode 
  717. *                         - 2 or 3 in I2S mode
  718. *                  - SPI_I2S_IT: specifies the SPI/I2S interrupt source to check. 
  719. *                    This parameter can be one of the following values:
  720. *                       - SPI_I2S_IT_TXE: Transmit buffer empty interrupt.
  721. *                       - SPI_I2S_IT_RXNE: Receive buffer not empty interrupt.
  722. *                       - SPI_I2S_IT_OVR: Overrun interrupt.
  723. *                       - SPI_IT_MODF: Mode Fault interrupt.
  724. *                       - SPI_IT_CRCERR: CRC Error interrupt.
  725. *                       - I2S_IT_UDR: Underrun Error interrupt.
  726. * Output         : None
  727. * Return         : The new state of SPI_I2S_IT (SET or RESET).
  728. *******************************************************************************/
  729. ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, u8 SPI_I2S_IT)
  730. {
  731.   ITStatus bitstatus = RESET;
  732.   u16 itpos = 0, itmask = 0, enablestatus = 0;
  733.   /* Check the parameters */
  734.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  735.   assert_param(IS_SPI_I2S_GET_IT(SPI_I2S_IT));
  736.   /* Get the SPI/I2S IT index */
  737.   itpos = (u16)((u16)0x01 << (SPI_I2S_IT & (u8)0x0F));
  738.   /* Get the SPI/I2S IT mask */
  739.   itmask = SPI_I2S_IT >> 4;
  740.   /* Set the IT mask */
  741.   itmask = (u16)((u16)0x01 << itmask);
  742.   /* Get the SPI_I2S_IT enable bit status */
  743.   enablestatus = (SPIx->CR2 & itmask) ;
  744.   /* Check the status of the specified SPI/I2S interrupt */
  745.   if (((SPIx->SR & itpos) != (u16)RESET) && enablestatus)
  746.   {
  747.     /* SPI_I2S_IT is set */
  748.     bitstatus = SET;
  749.   }
  750.   else
  751.   {
  752.     /* SPI_I2S_IT is reset */
  753.     bitstatus = RESET;
  754.   }
  755.   /* Return the SPI_I2S_IT status */
  756.   return bitstatus;
  757. }
  758. /*******************************************************************************
  759. * Function Name  : SPI_I2S_ClearITPendingBit
  760. * Description    : Clears the SPIx CRC Error (CRCERR) interrupt pending bit.
  761. * Input          : - SPIx: where x can be :
  762. *                         - 1, 2 or 3 in SPI mode 
  763. *                  - SPI_I2S_IT: specifies the SPI interrupt pending bit to clear.
  764. *                    This function clears only CRCERR intetrrupt pending bit.   
  765. *                  Notes:
  766. *                       - OVR (OverRun Error) interrupt pending bit is cleared 
  767. *                         by software sequence: a read operation to SPI_DR 
  768. *                         register (SPI_I2S_ReceiveData()) followed by a read 
  769. *                         operation to SPI_SR register (SPI_I2S_GetITStatus()).
  770. *                       - UDR (UnderRun Error) interrupt pending bit is cleared 
  771. *                         by a read operation to SPI_SR register 
  772. *                         (SPI_I2S_GetITStatus()).                           
  773. *                       - MODF (Mode Fault) interrupt pending bit is cleared by 
  774. *                         software sequence: a read/write operation to SPI_SR 
  775. *                         register (SPI_I2S_GetITStatus()) followed by a write 
  776. *                         operation to SPI_CR1 register (SPI_Cmd() to enable the 
  777. *                         SPI).   
  778. * Output         : None
  779. * Return         : None
  780. *******************************************************************************/
  781. void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, u8 SPI_I2S_IT)
  782. {
  783.   u16 itpos = 0;
  784.   /* Check the parameters */
  785.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  786.   assert_param(IS_SPI_I2S_CLEAR_IT(SPI_I2S_IT));
  787.   /* Get the SPI IT index */
  788.   itpos = (u16)((u16)0x01 << (SPI_I2S_IT & (u8)0x0F));
  789.   /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */
  790.   SPIx->SR = (u16)~itpos;
  791. }
  792. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/