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

uCOS

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
  2. * File Name          : stm32f10x_i2c.c
  3. * Author             : MCD Application Team
  4. * Version            : V2.0.2
  5. * Date               : 07/11/2008
  6. * Description        : This file provides all the I2C 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_i2c.h"
  17. #include "stm32f10x_rcc.h"
  18.  
  19. /* Private typedef -----------------------------------------------------------*/
  20. /* Private define ------------------------------------------------------------*/
  21. /* I2C SPE mask */
  22. #define CR1_PE_Set              ((u16)0x0001)
  23. #define CR1_PE_Reset            ((u16)0xFFFE)
  24. /* I2C START mask */
  25. #define CR1_START_Set           ((u16)0x0100)
  26. #define CR1_START_Reset         ((u16)0xFEFF)
  27. /* I2C STOP mask */
  28. #define CR1_STOP_Set            ((u16)0x0200)
  29. #define CR1_STOP_Reset          ((u16)0xFDFF)
  30. /* I2C ACK mask */
  31. #define CR1_ACK_Set             ((u16)0x0400)
  32. #define CR1_ACK_Reset           ((u16)0xFBFF)
  33. /* I2C ENGC mask */
  34. #define CR1_ENGC_Set            ((u16)0x0040)
  35. #define CR1_ENGC_Reset          ((u16)0xFFBF)
  36. /* I2C SWRST mask */
  37. #define CR1_SWRST_Set           ((u16)0x8000)
  38. #define CR1_SWRST_Reset         ((u16)0x7FFF)
  39. /* I2C PEC mask */
  40. #define CR1_PEC_Set             ((u16)0x1000)
  41. #define CR1_PEC_Reset           ((u16)0xEFFF)
  42. /* I2C ENPEC mask */
  43. #define CR1_ENPEC_Set           ((u16)0x0020)
  44. #define CR1_ENPEC_Reset         ((u16)0xFFDF)
  45. /* I2C ENARP mask */
  46. #define CR1_ENARP_Set           ((u16)0x0010)
  47. #define CR1_ENARP_Reset         ((u16)0xFFEF)
  48. /* I2C NOSTRETCH mask */
  49. #define CR1_NOSTRETCH_Set       ((u16)0x0080)
  50. #define CR1_NOSTRETCH_Reset     ((u16)0xFF7F)
  51. /* I2C registers Masks */
  52. #define CR1_CLEAR_Mask          ((u16)0xFBF5)
  53. /* I2C DMAEN mask */
  54. #define CR2_DMAEN_Set           ((u16)0x0800)
  55. #define CR2_DMAEN_Reset         ((u16)0xF7FF)
  56. /* I2C LAST mask */
  57. #define CR2_LAST_Set            ((u16)0x1000)
  58. #define CR2_LAST_Reset          ((u16)0xEFFF)
  59. /* I2C FREQ mask */
  60. #define CR2_FREQ_Reset          ((u16)0xFFC0)
  61. /* I2C ADD0 mask */
  62. #define OAR1_ADD0_Set           ((u16)0x0001)
  63. #define OAR1_ADD0_Reset         ((u16)0xFFFE)
  64. /* I2C ENDUAL mask */
  65. #define OAR2_ENDUAL_Set         ((u16)0x0001)
  66. #define OAR2_ENDUAL_Reset       ((u16)0xFFFE)
  67. /* I2C ADD2 mask */
  68. #define OAR2_ADD2_Reset         ((u16)0xFF01)
  69. /* I2C F/S mask */
  70. #define CCR_FS_Set              ((u16)0x8000)
  71. /* I2C CCR mask */
  72. #define CCR_CCR_Set             ((u16)0x0FFF)
  73. /* I2C FLAG mask */
  74. #define FLAG_Mask               ((u32)0x00FFFFFF)
  75. /* I2C Interrupt Enable mask */
  76. #define ITEN_Mask               ((u32)0x07000000)
  77. /* Private macro -------------------------------------------------------------*/
  78. /* Private variables ---------------------------------------------------------*/
  79. /* Private function prototypes -----------------------------------------------*/
  80. /* Private functions ---------------------------------------------------------*/
  81. /*******************************************************************************
  82. * Function Name  : I2C_DeInit
  83. * Description    : Deinitializes the I2Cx peripheral registers to their default
  84. *                  reset values.
  85. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  86. * Output         : None
  87. * Return         : None
  88. *******************************************************************************/
  89. void I2C_DeInit(I2C_TypeDef* I2Cx)
  90. {
  91.   /* Check the parameters */
  92.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  93.   switch (*(u32*)&I2Cx)
  94.   {
  95.     case I2C1_BASE:
  96.       /* Enable I2C1 reset state */
  97.       RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
  98.       /* Release I2C1 from reset state */
  99.       RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
  100.       break;
  101.     case I2C2_BASE:
  102.       /* Enable I2C2 reset state */
  103.       RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
  104.       /* Release I2C2 from reset state */
  105.       RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
  106.       break;
  107.     default:
  108.       break;
  109.   }
  110. }
  111. /*******************************************************************************
  112. * Function Name  : I2C_Init
  113. * Description    : Initializes the I2Cx peripheral according to the specified 
  114. *                  parameters in the I2C_InitStruct.
  115. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  116. *                  - I2C_InitStruct: pointer to a I2C_InitTypeDef structure that
  117. *                    contains the configuration information for the specified
  118. *                    I2C peripheral.
  119. * Output         : None
  120. * Return         : None
  121. ******************************************************************************/
  122. void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)
  123. {
  124.   u16 tmpreg = 0, freqrange = 0;
  125.   u16 result = 0x04;
  126.   u32 pclk1 = 8000000;
  127.   RCC_ClocksTypeDef  rcc_clocks;
  128.   /* Check the parameters */
  129.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  130.   assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode));
  131.   assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle));
  132.   assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1));
  133.   assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack));
  134.   assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress));
  135.   assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed));
  136. /*---------------------------- I2Cx CR2 Configuration ------------------------*/
  137.   /* Get the I2Cx CR2 value */
  138.   tmpreg = I2Cx->CR2;
  139.   /* Clear frequency FREQ[5:0] bits */
  140.   tmpreg &= CR2_FREQ_Reset;
  141.   /* Get pclk1 frequency value */
  142.   RCC_GetClocksFreq(&rcc_clocks);
  143.   pclk1 = rcc_clocks.PCLK1_Frequency;
  144.   /* Set frequency bits depending on pclk1 value */
  145.   freqrange = (u16)(pclk1 / 1000000);
  146.   tmpreg |= freqrange;
  147.   /* Write to I2Cx CR2 */
  148.   I2Cx->CR2 = tmpreg;
  149. /*---------------------------- I2Cx CCR Configuration ------------------------*/
  150.   /* Disable the selected I2C peripheral to configure TRISE */
  151.   I2Cx->CR1 &= CR1_PE_Reset;
  152.   /* Reset tmpreg value */
  153.   /* Clear F/S, DUTY and CCR[11:0] bits */
  154.   tmpreg = 0;
  155.   /* Configure speed in standard mode */
  156.   if (I2C_InitStruct->I2C_ClockSpeed <= 100000)
  157.   {
  158.     /* Standard mode speed calculate */
  159.     result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1));
  160.     /* Test if CCR value is under 0x4*/
  161.     if (result < 0x04)
  162.     {
  163.       /* Set minimum allowed value */
  164.       result = 0x04;  
  165.     }
  166.     /* Set speed value for standard mode */
  167.     tmpreg |= result;   
  168.     /* Set Maximum Rise Time for standard mode */
  169.     I2Cx->TRISE = freqrange + 1; 
  170.   }
  171.   /* Configure speed in fast mode */
  172.   else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/
  173.   {
  174.     if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2)
  175.     {
  176.       /* Fast mode speed calculate: Tlow/Thigh = 2 */
  177.       result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3));
  178.     }
  179.     else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/
  180.     {
  181.       /* Fast mode speed calculate: Tlow/Thigh = 16/9 */
  182.       result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25));
  183.       /* Set DUTY bit */
  184.       result |= I2C_DutyCycle_16_9;
  185.     }
  186.     /* Test if CCR value is under 0x1*/
  187.     if ((result & CCR_CCR_Set) == 0)
  188.     {
  189.       /* Set minimum allowed value */
  190.       result |= (u16)0x0001;  
  191.     }
  192.     /* Set speed value and set F/S bit for fast mode */
  193.     tmpreg |= result | CCR_FS_Set;
  194.     /* Set Maximum Rise Time for fast mode */
  195.     I2Cx->TRISE = (u16)(((freqrange * 300) / 1000) + 1);  
  196.   }
  197.   /* Write to I2Cx CCR */
  198.   I2Cx->CCR = tmpreg;
  199.   /* Enable the selected I2C peripheral */
  200.   I2Cx->CR1 |= CR1_PE_Set;
  201. /*---------------------------- I2Cx CR1 Configuration ------------------------*/
  202.   /* Get the I2Cx CR1 value */
  203.   tmpreg = I2Cx->CR1;
  204.   /* Clear ACK, SMBTYPE and  SMBUS bits */
  205.   tmpreg &= CR1_CLEAR_Mask;
  206.   /* Configure I2Cx: mode and acknowledgement */
  207.   /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */
  208.   /* Set ACK bit according to I2C_Ack value */
  209.   tmpreg |= (u16)((u32)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack);
  210.   /* Write to I2Cx CR1 */
  211.   I2Cx->CR1 = tmpreg;
  212. /*---------------------------- I2Cx OAR1 Configuration -----------------------*/
  213.   /* Set I2Cx Own Address1 and acknowledged address */
  214.   I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1);
  215. }
  216. /*******************************************************************************
  217. * Function Name  : I2C_StructInit
  218. * Description    : Fills each I2C_InitStruct member with its default value.
  219. * Input          : - I2C_InitStruct: pointer to an I2C_InitTypeDef structure
  220. *                    which will be initialized.
  221. * Output         : None
  222. * Return         : None
  223. *******************************************************************************/
  224. void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct)
  225. {
  226. /*---------------- Reset I2C init structure parameters values ----------------*/
  227.   /* Initialize the I2C_Mode member */
  228.   I2C_InitStruct->I2C_Mode = I2C_Mode_I2C;
  229.   /* Initialize the I2C_DutyCycle member */
  230.   I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2;
  231.   /* Initialize the I2C_OwnAddress1 member */
  232.   I2C_InitStruct->I2C_OwnAddress1 = 0;
  233.   /* Initialize the I2C_Ack member */
  234.   I2C_InitStruct->I2C_Ack = I2C_Ack_Disable;
  235.   /* Initialize the I2C_AcknowledgedAddress member */
  236.   I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  237.   /* initialize the I2C_ClockSpeed member */
  238.   I2C_InitStruct->I2C_ClockSpeed = 5000;
  239. }
  240. /*******************************************************************************
  241. * Function Name  : I2C_Cmd
  242. * Description    : Enables or disables the specified I2C peripheral.
  243. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  244. *                  - NewState: new state of the I2Cx peripheral. This parameter
  245. *                    can be: ENABLE or DISABLE.
  246. * Output         : None
  247. * Return         : None
  248. *******************************************************************************/
  249. void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
  250. {
  251.   /* Check the parameters */
  252.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  253.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  254.   if (NewState != DISABLE)
  255.   {
  256.     /* Enable the selected I2C peripheral */
  257.     I2Cx->CR1 |= CR1_PE_Set;
  258.   }
  259.   else
  260.   {
  261.     /* Disable the selected I2C peripheral */
  262.     I2Cx->CR1 &= CR1_PE_Reset;
  263.   }
  264. }
  265. /*******************************************************************************
  266. * Function Name  : I2C_DMACmd
  267. * Description    : Enables or disables the specified I2C DMA requests.
  268. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  269. *                  - NewState: new state of the I2C DMA transfer.
  270. *                    This parameter can be: ENABLE or DISABLE.
  271. * Output         : None
  272. * Return         : None
  273. *******************************************************************************/
  274. void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
  275. {
  276.   /* Check the parameters */
  277.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  278.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  279.   if (NewState != DISABLE)
  280.   {
  281.     /* Enable the selected I2C DMA requests */
  282.     I2Cx->CR2 |= CR2_DMAEN_Set;
  283.   }
  284.   else
  285.   {
  286.     /* Disable the selected I2C DMA requests */
  287.     I2Cx->CR2 &= CR2_DMAEN_Reset;
  288.   }
  289. }
  290. /*******************************************************************************
  291. * Function Name  : I2C_DMALastTransferCmd
  292. * Description    : Specifies that the next DMA transfer is the last one.
  293. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  294. *                  - NewState: new state of the I2C DMA last transfer.
  295. *                    This parameter can be: ENABLE or DISABLE.
  296. * Output         : None
  297. * Return         : None
  298. *******************************************************************************/
  299. void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
  300. {
  301.   /* Check the parameters */
  302.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  303.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  304.   if (NewState != DISABLE)
  305.   {
  306.     /* Next DMA transfer is the last transfer */
  307.     I2Cx->CR2 |= CR2_LAST_Set;
  308.   }
  309.   else
  310.   {
  311.     /* Next DMA transfer is not the last transfer */
  312.     I2Cx->CR2 &= CR2_LAST_Reset;
  313.   }
  314. }
  315. /*******************************************************************************
  316. * Function Name  : I2C_GenerateSTART
  317. * Description    : Generates I2Cx communication START condition.
  318. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  319. *                  - NewState: new state of the I2C START condition generation.
  320. *                    This parameter can be: ENABLE or DISABLE.
  321. * Output         : None
  322. * Return         : None.
  323. *******************************************************************************/
  324. void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState)
  325. {
  326.   /* Check the parameters */
  327.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  328.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  329.   if (NewState != DISABLE)
  330.   {
  331.     /* Generate a START condition */
  332.     I2Cx->CR1 |= CR1_START_Set;
  333.   }
  334.   else
  335.   {
  336.     /* Disable the START condition generation */
  337.     I2Cx->CR1 &= CR1_START_Reset;
  338.   }
  339. }
  340. /*******************************************************************************
  341. * Function Name  : I2C_GenerateSTOP
  342. * Description    : Generates I2Cx communication STOP condition.
  343. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  344. *                  - NewState: new state of the I2C STOP condition generation.
  345. *                    This parameter can be: ENABLE or DISABLE.
  346. * Output         : None
  347. * Return         : None.
  348. *******************************************************************************/
  349. void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState)
  350. {
  351.   /* Check the parameters */
  352.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  353.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  354.   if (NewState != DISABLE)
  355.   {
  356.     /* Generate a STOP condition */
  357.     I2Cx->CR1 |= CR1_STOP_Set;
  358.   }
  359.   else
  360.   {
  361.     /* Disable the STOP condition generation */
  362.     I2Cx->CR1 &= CR1_STOP_Reset;
  363.   }
  364. }
  365. /*******************************************************************************
  366. * Function Name  : I2C_AcknowledgeConfig
  367. * Description    : Enables or disables the specified I2C acknowledge feature.
  368. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  369. *                  - NewState: new state of the I2C Acknowledgement.
  370. *                    This parameter can be: ENABLE or DISABLE.
  371. * Output         : None
  372. * Return         : None.
  373. *******************************************************************************/
  374. void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState)
  375. {
  376.   /* Check the parameters */
  377.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  378.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  379.   if (NewState != DISABLE)
  380.   {
  381.     /* Enable the acknowledgement */
  382.     I2Cx->CR1 |= CR1_ACK_Set;
  383.   }
  384.   else
  385.   {
  386.     /* Disable the acknowledgement */
  387.     I2Cx->CR1 &= CR1_ACK_Reset;
  388.   }
  389. }
  390. /*******************************************************************************
  391. * Function Name  : I2C_OwnAddress2Config
  392. * Description    : Configures the specified I2C own address2.
  393. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  394. *                  - Address: specifies the 7bit I2C own address2.
  395. * Output         : None
  396. * Return         : None.
  397. *******************************************************************************/
  398. void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, u8 Address)
  399. {
  400.   u16 tmpreg = 0;
  401.   /* Check the parameters */
  402.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  403.   /* Get the old register value */
  404.   tmpreg = I2Cx->OAR2;
  405.   /* Reset I2Cx Own address2 bit [7:1] */
  406.   tmpreg &= OAR2_ADD2_Reset;
  407.   /* Set I2Cx Own address2 */
  408.   tmpreg |= (u16)(Address & (u16)0x00FE);
  409.   /* Store the new register value */
  410.   I2Cx->OAR2 = tmpreg;
  411. }
  412. /*******************************************************************************
  413. * Function Name  : I2C_DualAddressCmd
  414. * Description    : Enables or disables the specified I2C dual addressing mode.
  415. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  416. *                  - NewState: new state of the I2C dual addressing mode.
  417. *                    This parameter can be: ENABLE or DISABLE.
  418. * Output         : None
  419. * Return         : None
  420. *******************************************************************************/
  421. void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
  422. {
  423.   /* Check the parameters */
  424.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  425.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  426.   if (NewState != DISABLE)
  427.   {
  428.     /* Enable dual addressing mode */
  429.     I2Cx->OAR2 |= OAR2_ENDUAL_Set;
  430.   }
  431.   else
  432.   {
  433.     /* Disable dual addressing mode */
  434.     I2Cx->OAR2 &= OAR2_ENDUAL_Reset;
  435.   }
  436. }
  437. /*******************************************************************************
  438. * Function Name  : I2C_GeneralCallCmd
  439. * Description    : Enables or disables the specified I2C general call feature.
  440. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  441. *                  - NewState: new state of the I2C General call.
  442. *                    This parameter can be: ENABLE or DISABLE.
  443. * Output         : None
  444. * Return         : None
  445. *******************************************************************************/
  446. void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
  447. {
  448.   /* Check the parameters */
  449.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  450.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  451.   if (NewState != DISABLE)
  452.   {
  453.     /* Enable generall call */
  454.     I2Cx->CR1 |= CR1_ENGC_Set;
  455.   }
  456.   else
  457.   {
  458.     /* Disable generall call */
  459.     I2Cx->CR1 &= CR1_ENGC_Reset;
  460.   }
  461. }
  462. /*******************************************************************************
  463. * Function Name  : I2C_ITConfig
  464. * Description    : Enables or disables the specified I2C interrupts.
  465. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  466. *                  - I2C_IT: specifies the I2C interrupts sources to be enabled
  467. *                    or disabled. 
  468. *                    This parameter can be any combination of the following values:
  469. *                       - I2C_IT_BUF: Buffer interrupt mask
  470. *                       - I2C_IT_EVT: Event interrupt mask
  471. *                       - I2C_IT_ERR: Error interrupt mask
  472. *                  - NewState: new state of the specified I2C interrupts.
  473. *                    This parameter can be: ENABLE or DISABLE.
  474. * Output         : None
  475. * Return         : None
  476. *******************************************************************************/
  477. void I2C_ITConfig(I2C_TypeDef* I2Cx, u16 I2C_IT, FunctionalState NewState)
  478. {
  479.   /* Check the parameters */
  480.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  481.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  482.   assert_param(IS_I2C_CONFIG_IT(I2C_IT));
  483.   
  484.   if (NewState != DISABLE)
  485.   {
  486.     /* Enable the selected I2C interrupts */
  487.     I2Cx->CR2 |= I2C_IT;
  488.   }
  489.   else
  490.   {
  491.     /* Disable the selected I2C interrupts */
  492.     I2Cx->CR2 &= (u16)~I2C_IT;
  493.   }
  494. }
  495. /*******************************************************************************
  496. * Function Name  : I2C_SendData
  497. * Description    : Sends a data byte through the I2Cx peripheral.
  498. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  499. *                  - Data: Byte to be transmitted..
  500. * Output         : None
  501. * Return         : None
  502. *******************************************************************************/
  503. void I2C_SendData(I2C_TypeDef* I2Cx, u8 Data)
  504. {
  505.   /* Check the parameters */
  506.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  507.   /* Write in the DR register the data to be sent */
  508.   I2Cx->DR = Data;
  509. }
  510. /*******************************************************************************
  511. * Function Name  : I2C_ReceiveData
  512. * Description    : Returns the most recent received data by the I2Cx peripheral.
  513. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  514. * Output         : None
  515. * Return         : The value of the received data.
  516. *******************************************************************************/
  517. u8 I2C_ReceiveData(I2C_TypeDef* I2Cx)
  518. {
  519.   /* Check the parameters */
  520.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  521.   /* Return the data in the DR register */
  522.   return (u8)I2Cx->DR;
  523. }
  524. /*******************************************************************************
  525. * Function Name  : I2C_Send7bitAddress
  526. * Description    : Transmits the address byte to select the slave device.
  527. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  528. *                  - Address: specifies the slave address which will be transmitted
  529. *                  - I2C_Direction: specifies whether the I2C device will be a
  530. *                    Transmitter or a Receiver. 
  531. *                    This parameter can be one of the following values
  532. *                       - I2C_Direction_Transmitter: Transmitter mode
  533. *                       - I2C_Direction_Receiver: Receiver mode
  534. * Output         : None
  535. * Return         : None.
  536. *******************************************************************************/
  537. void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, u8 Address, u8 I2C_Direction)
  538. {
  539.   /* Check the parameters */
  540.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  541.   assert_param(IS_I2C_DIRECTION(I2C_Direction));
  542.   /* Test on the direction to set/reset the read/write bit */
  543.   if (I2C_Direction != I2C_Direction_Transmitter)
  544.   {
  545.     /* Set the address bit0 for read */
  546.     Address |= OAR1_ADD0_Set;
  547.   }
  548.   else
  549.   {
  550.     /* Reset the address bit0 for write */
  551.     Address &= OAR1_ADD0_Reset;
  552.   }
  553.   /* Send the address */
  554.   I2Cx->DR = Address;
  555. }
  556. /*******************************************************************************
  557. * Function Name  : I2C_ReadRegister
  558. * Description    : Reads the specified I2C register and returns its value.
  559. * Input1         : - I2C_Register: specifies the register to read.
  560. *                    This parameter can be one of the following values:
  561. *                       - I2C_Register_CR1:  CR1 register.
  562. *                       - I2C_Register_CR2:   CR2 register.
  563. *                       - I2C_Register_OAR1:  OAR1 register.
  564. *                       - I2C_Register_OAR2:  OAR2 register.
  565. *                       - I2C_Register_DR:    DR register.
  566. *                       - I2C_Register_SR1:   SR1 register.
  567. *                       - I2C_Register_SR2:   SR2 register.
  568. *                       - I2C_Register_CCR:   CCR register.
  569. *                       - I2C_Register_TRISE: TRISE register.
  570. * Output         : None
  571. * Return         : The value of the read register.
  572. *******************************************************************************/
  573. u16 I2C_ReadRegister(I2C_TypeDef* I2Cx, u8 I2C_Register)
  574. {
  575.   /* Check the parameters */
  576.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  577.   assert_param(IS_I2C_REGISTER(I2C_Register));
  578.   /* Return the selected register value */
  579.   return (*(vu16 *)(*((vu32 *)&I2Cx) + I2C_Register));
  580. }
  581. /*******************************************************************************
  582. * Function Name  : I2C_SoftwareResetCmd
  583. * Description    : Enables or disables the specified I2C software reset.
  584. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  585. *                  - NewState: new state of the I2C software reset.
  586. *                    This parameter can be: ENABLE or DISABLE.
  587. * Output         : None
  588. * Return         : None
  589. *******************************************************************************/
  590. void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
  591. {
  592.   /* Check the parameters */
  593.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  594.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  595.   if (NewState != DISABLE)
  596.   {
  597.     /* Peripheral under reset */
  598.     I2Cx->CR1 |= CR1_SWRST_Set;
  599.   }
  600.   else
  601.   {
  602.     /* Peripheral not under reset */
  603.     I2Cx->CR1 &= CR1_SWRST_Reset;
  604.   }
  605. }
  606. /*******************************************************************************
  607. * Function Name  : I2C_SMBusAlertConfig
  608. * Description    : Drives the SMBusAlert pin high or low for the specified I2C.
  609. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  610. *                  - I2C_SMBusAlert: specifies SMBAlert pin level. 
  611. *                    This parameter can be one of the following values:
  612. *                       - I2C_SMBusAlert_Low: SMBAlert pin driven low
  613. *                       - I2C_SMBusAlert_High: SMBAlert pin driven high
  614. * Output         : None
  615. * Return         : None
  616. *******************************************************************************/
  617. void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, u16 I2C_SMBusAlert)
  618. {
  619.   /* Check the parameters */
  620.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  621.   assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert));
  622.   if (I2C_SMBusAlert == I2C_SMBusAlert_Low)
  623.   {
  624.     /* Drive the SMBusAlert pin Low */
  625.     I2Cx->CR1 |= I2C_SMBusAlert_Low;
  626.   }
  627.   else
  628.   {
  629.     /* Drive the SMBusAlert pin High  */
  630.     I2Cx->CR1 &= I2C_SMBusAlert_High;
  631.   }
  632. }
  633. /*******************************************************************************
  634. * Function Name  : I2C_TransmitPEC
  635. * Description    : Enables or disables the specified I2C PEC transfer.
  636. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  637. *                  - NewState: new state of the I2C PEC transmission.
  638. *                    This parameter can be: ENABLE or DISABLE.
  639. * Output         : None
  640. * Return         : None
  641. *******************************************************************************/
  642. void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState)
  643. {
  644.   /* Check the parameters */
  645.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  646.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  647.   if (NewState != DISABLE)
  648.   {
  649.     /* Enable the selected I2C PEC transmission */
  650.     I2Cx->CR1 |= CR1_PEC_Set;
  651.   }
  652.   else
  653.   {
  654.     /* Disable the selected I2C PEC transmission */
  655.     I2Cx->CR1 &= CR1_PEC_Reset;
  656.   }
  657. }
  658. /*******************************************************************************
  659. * Function Name  : I2C_PECPositionConfig
  660. * Description    : Selects the specified I2C PEC position.
  661. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  662. *                  - I2C_PECPosition: specifies the PEC position. 
  663. *                    This parameter can be one of the following values:
  664. *                       - I2C_PECPosition_Next: indicates that the next
  665. *                         byte is PEC
  666. *                       - I2C_PECPosition_Current: indicates that current
  667. *                         byte is PEC
  668. * Output         : None
  669. * Return         : None
  670. *******************************************************************************/
  671. void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, u16 I2C_PECPosition)
  672. {
  673.   /* Check the parameters */
  674.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  675.   assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition));
  676.   if (I2C_PECPosition == I2C_PECPosition_Next)
  677.   {
  678.     /* Next byte in shift register is PEC */
  679.     I2Cx->CR1 |= I2C_PECPosition_Next;
  680.   }
  681.   else
  682.   {
  683.     /* Current byte in shift register is PEC */
  684.     I2Cx->CR1 &= I2C_PECPosition_Current;
  685.   }
  686. }
  687. /*******************************************************************************
  688. * Function Name  : I2C_CalculatePEC
  689. * Description    : Enables or disables the PEC value calculation of the
  690. *                  transfered bytes.
  691. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  692. *                  - NewState: new state of the I2Cx PEC value calculation.
  693. *                    This parameter can be: ENABLE or DISABLE.
  694. * Output         : None
  695. * Return         : None
  696. *******************************************************************************/
  697. void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState)
  698. {
  699.   /* Check the parameters */
  700.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  701.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  702.   if (NewState != DISABLE)
  703.   {
  704.     /* Enable the selected I2C PEC calculation */
  705.     I2Cx->CR1 |= CR1_ENPEC_Set;
  706.   }
  707.   else
  708.   {
  709.     /* Disable the selected I2C PEC calculation */
  710.     I2Cx->CR1 &= CR1_ENPEC_Reset;
  711.   }
  712. }
  713. /*******************************************************************************
  714. * Function Name  : I2C_GetPEC
  715. * Description    : Returns the PEC value for the specified I2C.
  716. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  717. * Output         : None
  718. * Return         : The PEC value.
  719. *******************************************************************************/
  720. u8 I2C_GetPEC(I2C_TypeDef* I2Cx)
  721. {
  722.   /* Check the parameters */
  723.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  724.   /* Return the selected I2C PEC value */
  725.   return ((I2Cx->SR2) >> 8);
  726. }
  727. /*******************************************************************************
  728. * Function Name  : I2C_ARPCmd
  729. * Description    : Enables or disables the specified I2C ARP.
  730. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  731. *                  - NewState: new state of the I2Cx ARP. 
  732. *                    This parameter can be: ENABLE or DISABLE.
  733. * Output         : None
  734. * Return         : None
  735. *******************************************************************************/
  736. void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
  737. {
  738.   /* Check the parameters */
  739.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  740.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  741.   if (NewState != DISABLE)
  742.   {
  743.     /* Enable the selected I2C ARP */
  744.     I2Cx->CR1 |= CR1_ENARP_Set;
  745.   }
  746.   else
  747.   {
  748.     /* Disable the selected I2C ARP */
  749.     I2Cx->CR1 &= CR1_ENARP_Reset;
  750.   }
  751. }
  752. /*******************************************************************************
  753. * Function Name  : I2C_StretchClockCmd
  754. * Description    : Enables or disables the specified I2C Clock stretching.
  755. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  756. *                  - NewState: new state of the I2Cx Clock stretching.
  757. *                    This parameter can be: ENABLE or DISABLE.
  758. * Output         : None
  759. * Return         : None
  760. *******************************************************************************/
  761. void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
  762. {
  763.   /* Check the parameters */
  764.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  765.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  766.   if (NewState == DISABLE)
  767.   {
  768.     /* Enable the selected I2C Clock stretching */
  769.     I2Cx->CR1 |= CR1_NOSTRETCH_Set;
  770.   }
  771.   else
  772.   {
  773.     /* Disable the selected I2C Clock stretching */
  774.     I2Cx->CR1 &= CR1_NOSTRETCH_Reset;
  775.   }
  776. }
  777. /*******************************************************************************
  778. * Function Name  : I2C_FastModeDutyCycleConfig
  779. * Description    : Selects the specified I2C fast mode duty cycle.
  780. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  781. *                  - I2C_DutyCycle: specifies the fast mode duty cycle.
  782. *                    This parameter can be one of the following values:
  783. *                       - I2C_DutyCycle_2: I2C fast mode Tlow/Thigh = 2
  784. *                       - I2C_DutyCycle_16_9: I2C fast mode Tlow/Thigh = 16/9
  785. * Output         : None
  786. * Return         : None
  787. *******************************************************************************/
  788. void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, u16 I2C_DutyCycle)
  789. {
  790.   /* Check the parameters */
  791.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  792.   assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle));
  793.   if (I2C_DutyCycle != I2C_DutyCycle_16_9)
  794.   {
  795.     /* I2C fast mode Tlow/Thigh=2 */
  796.     I2Cx->CCR &= I2C_DutyCycle_2;
  797.   }
  798.   else
  799.   {
  800.     /* I2C fast mode Tlow/Thigh=16/9 */
  801.     I2Cx->CCR |= I2C_DutyCycle_16_9;
  802.   }
  803. }
  804. /*******************************************************************************
  805. * Function Name  : I2C_GetLastEvent
  806. * Description    : Returns the last I2Cx Event.
  807. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  808. * Output         : None
  809. * Return         : The last event
  810. *******************************************************************************/
  811. u32 I2C_GetLastEvent(I2C_TypeDef* I2Cx)
  812. {
  813.   u32 lastevent = 0;
  814.   u32 flag1 = 0, flag2 = 0;
  815.   /* Check the parameters */
  816.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  817.   /* Read the I2Cx status register */
  818.   flag1 = I2Cx->SR1;
  819.   flag2 = I2Cx->SR2;
  820.   flag2 = flag2 << 16;
  821.   /* Get the last event value from I2C status register */
  822.   lastevent = (flag1 | flag2) & FLAG_Mask;
  823.   /* Return status */
  824.   return lastevent;
  825. }
  826. /*******************************************************************************
  827. * Function Name  : I2C_CheckEvent
  828. * Description    : Checks whether the last I2Cx Event is equal to the one passed
  829. *                  as parameter.
  830. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  831. *                  - I2C_EVENT: specifies the event to be checked. 
  832. *                    This parameter can be one of the following values:
  833. *                       - I2C_EVENT_SLAVE_ADDRESS_MATCHED   : EV1
  834. *                       - I2C_EVENT_SLAVE_BYTE_RECEIVED     : EV2
  835. *                       - I2C_EVENT_SLAVE_BYTE_TRANSMITTED  : EV3
  836. *                       - I2C_EVENT_SLAVE_ACK_FAILURE       : EV3-2
  837. *                       - I2C_EVENT_MASTER_MODE_SELECT      : EV5
  838. *                       - I2C_EVENT_MASTER_MODE_SELECTED    : EV6
  839. *                       - I2C_EVENT_MASTER_BYTE_RECEIVED    : EV7
  840. *                       - I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8
  841. *                       - I2C_EVENT_MASTER_MODE_ADDRESS10   : EV9
  842. *                       - I2C_EVENT_SLAVE_STOP_DETECTED     : EV4
  843. * Output         : None
  844. * Return         : An ErrorStatus enumuration value:
  845. *                       - SUCCESS: Last event is equal to the I2C_EVENT
  846. *                       - ERROR: Last event is different from the I2C_EVENT
  847. *******************************************************************************/
  848. ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT)
  849. {
  850.   u32 lastevent = 0;
  851.   u32 flag1 = 0, flag2 = 0;
  852.   ErrorStatus status = ERROR;
  853.   /* Check the parameters */
  854.   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  855.   assert_param(IS_I2C_EVENT(I2C_EVENT));
  856.   /* Read the I2Cx status register */
  857.   flag1 = I2Cx->SR1;
  858.   flag2 = I2Cx->SR2;
  859.   flag2 = flag2 << 16;
  860.   /* Get the last event value from I2C status register */
  861.   lastevent = (flag1 | flag2) & FLAG_Mask;
  862.   /* Check whether the last event is equal to I2C_EVENT */
  863.   if (lastevent == I2C_EVENT )
  864.   {
  865.     /* SUCCESS: last event is equal to I2C_EVENT */
  866.     status = SUCCESS;
  867.   }
  868.   else
  869.   {
  870.     /* ERROR: last event is different from I2C_EVENT */
  871.     status = ERROR;
  872.   }
  873.   /* Return status */
  874.   return status;
  875. }
  876. /*******************************************************************************
  877. * Function Name  : I2C_GetFlagStatus
  878. * Description    : Checks whether the specified I2C flag is set or not.
  879. * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  880. *                  - I2C_FLAG: specifies the flag to check. 
  881. *                    This parameter can be one of the following values:
  882. *                       - I2C_FLAG_DUALF: Dual flag (Slave mode)
  883. *                       - I2C_FLAG_SMBHOST: SMBus host header (Slave mode)
  884. *                       - I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode)
  885. *                       - I2C_FLAG_GENCALL: General call header flag (Slave mode)
  886. *                       - I2C_FLAG_TRA: Transmitter/Receiver flag
  887. *                       - I2C_FLAG_BUSY: Bus busy flag
  888. *                       - I2C_FLAG_MSL: Master/Slave flag
  889. *                       - I2C_FLAG_SMBALERT: SMBus Alert flag
  890. *                       - I2C_FLAG_TIMEOUT: Timeout or Tlow error flag
  891. *                       - I2C_FLAG_PECERR: PEC error in reception flag
  892. *                       - I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode)
  893. *                       - I2C_FLAG_AF: Acknowledge failure flag
  894. *                       - I2C_FLAG_ARLO: Arbitration lost flag (Master mode)
  895. *                       - I2C_FLAG_BERR: Bus error flag
  896. *                       - I2C_FLAG_TXE: Data register empty flag (Transmitter)
  897. *                       - I2C_FLAG_RXNE: Data register not empty (Receiver) flag
  898. *                       - I2C_FLAG_STOPF: Stop detection flag (Slave mode)
  899. *                       - I2C_FLAG_ADD10: 10-bit header sent flag (Master mode)
  900. *                       - I2C_FLAG_BTF: Byte transfer finished flag
  901. *                       - I2C_FLAG_ADDR: Address sent flag (Master mode) 揂DSL