STM32F103xB HAL User Manual
stm32f1xx_hal_i2c.h
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32f1xx_hal_i2c.h
00004   * @author  MCD Application Team
00005   * @brief   Header file of I2C HAL module.
00006   ******************************************************************************
00007   * @attention
00008   *
00009   * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
00010   * All rights reserved.</center></h2>
00011   *
00012   * This software component is licensed by ST under BSD 3-Clause license,
00013   * the "License"; You may not use this file except in compliance with the
00014   * License. You may obtain a copy of the License at:
00015   *                        opensource.org/licenses/BSD-3-Clause
00016   *
00017   ******************************************************************************
00018   */
00019 
00020 /* Define to prevent recursive inclusion -------------------------------------*/
00021 #ifndef __STM32F1xx_HAL_I2C_H
00022 #define __STM32F1xx_HAL_I2C_H
00023 
00024 #ifdef __cplusplus
00025 extern "C" {
00026 #endif
00027 
00028 /* Includes ------------------------------------------------------------------*/
00029 #include "stm32f1xx_hal_def.h"
00030 
00031 /** @addtogroup STM32F1xx_HAL_Driver
00032   * @{
00033   */
00034 
00035 /** @addtogroup I2C
00036   * @{
00037   */
00038 
00039 /* Exported types ------------------------------------------------------------*/
00040 /** @defgroup I2C_Exported_Types I2C Exported Types
00041   * @{
00042   */
00043 
00044 /** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition
00045   * @brief  I2C Configuration Structure definition
00046   * @{
00047   */
00048 typedef struct
00049 {
00050   uint32_t ClockSpeed;       /*!< Specifies the clock frequency.
00051                                   This parameter must be set to a value lower than 400kHz */
00052 
00053   uint32_t DutyCycle;        /*!< Specifies the I2C fast mode duty cycle.
00054                                   This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */
00055 
00056   uint32_t OwnAddress1;      /*!< Specifies the first device own address.
00057                                   This parameter can be a 7-bit or 10-bit address. */
00058 
00059   uint32_t AddressingMode;   /*!< Specifies if 7-bit or 10-bit addressing mode is selected.
00060                                   This parameter can be a value of @ref I2C_addressing_mode */
00061 
00062   uint32_t DualAddressMode;  /*!< Specifies if dual addressing mode is selected.
00063                                   This parameter can be a value of @ref I2C_dual_addressing_mode */
00064 
00065   uint32_t OwnAddress2;      /*!< Specifies the second device own address if dual addressing mode is selected
00066                                   This parameter can be a 7-bit address. */
00067 
00068   uint32_t GeneralCallMode;  /*!< Specifies if general call mode is selected.
00069                                   This parameter can be a value of @ref I2C_general_call_addressing_mode */
00070 
00071   uint32_t NoStretchMode;    /*!< Specifies if nostretch mode is selected.
00072                                   This parameter can be a value of @ref I2C_nostretch_mode */
00073 
00074 } I2C_InitTypeDef;
00075 
00076 /**
00077   * @}
00078   */
00079 
00080 /** @defgroup HAL_state_structure_definition HAL state structure definition
00081   * @brief  HAL State structure definition
00082   * @note  HAL I2C State value coding follow below described bitmap :
00083   *          b7-b6  Error information
00084   *             00 : No Error
00085   *             01 : Abort (Abort user request on going)
00086   *             10 : Timeout
00087   *             11 : Error
00088   *          b5     Peripheral initialization status
00089   *             0  : Reset (Peripheral not initialized)
00090   *             1  : Init done (Peripheral initialized and ready to use. HAL I2C Init function called)
00091   *          b4     (not used)
00092   *             x  : Should be set to 0
00093   *          b3
00094   *             0  : Ready or Busy (No Listen mode ongoing)
00095   *             1  : Listen (Peripheral in Address Listen Mode)
00096   *          b2     Intrinsic process state
00097   *             0  : Ready
00098   *             1  : Busy (Peripheral busy with some configuration or internal operations)
00099   *          b1     Rx state
00100   *             0  : Ready (no Rx operation ongoing)
00101   *             1  : Busy (Rx operation ongoing)
00102   *          b0     Tx state
00103   *             0  : Ready (no Tx operation ongoing)
00104   *             1  : Busy (Tx operation ongoing)
00105   * @{
00106   */
00107 typedef enum
00108 {
00109   HAL_I2C_STATE_RESET             = 0x00U,   /*!< Peripheral is not yet Initialized         */
00110   HAL_I2C_STATE_READY             = 0x20U,   /*!< Peripheral Initialized and ready for use  */
00111   HAL_I2C_STATE_BUSY              = 0x24U,   /*!< An internal process is ongoing            */
00112   HAL_I2C_STATE_BUSY_TX           = 0x21U,   /*!< Data Transmission process is ongoing      */
00113   HAL_I2C_STATE_BUSY_RX           = 0x22U,   /*!< Data Reception process is ongoing         */
00114   HAL_I2C_STATE_LISTEN            = 0x28U,   /*!< Address Listen Mode is ongoing            */
00115   HAL_I2C_STATE_BUSY_TX_LISTEN    = 0x29U,   /*!< Address Listen Mode and Data Transmission
00116                                                  process is ongoing                         */
00117   HAL_I2C_STATE_BUSY_RX_LISTEN    = 0x2AU,   /*!< Address Listen Mode and Data Reception
00118                                                  process is ongoing                         */
00119   HAL_I2C_STATE_ABORT             = 0x60U,   /*!< Abort user request ongoing                */
00120   HAL_I2C_STATE_TIMEOUT           = 0xA0U,   /*!< Timeout state                             */
00121   HAL_I2C_STATE_ERROR             = 0xE0U    /*!< Error                                     */
00122 
00123 } HAL_I2C_StateTypeDef;
00124 
00125 /**
00126   * @}
00127   */
00128 
00129 /** @defgroup HAL_mode_structure_definition HAL mode structure definition
00130   * @brief  HAL Mode structure definition
00131   * @note  HAL I2C Mode value coding follow below described bitmap :\n
00132   *          b7     (not used)\n
00133   *             x  : Should be set to 0\n
00134   *          b6\n
00135   *             0  : None\n
00136   *             1  : Memory (HAL I2C communication is in Memory Mode)\n
00137   *          b5\n
00138   *             0  : None\n
00139   *             1  : Slave (HAL I2C communication is in Slave Mode)\n
00140   *          b4\n
00141   *             0  : None\n
00142   *             1  : Master (HAL I2C communication is in Master Mode)\n
00143   *          b3-b2-b1-b0  (not used)\n
00144   *             xxxx : Should be set to 0000
00145   * @{
00146   */
00147 typedef enum
00148 {
00149   HAL_I2C_MODE_NONE               = 0x00U,   /*!< No I2C communication on going             */
00150   HAL_I2C_MODE_MASTER             = 0x10U,   /*!< I2C communication is in Master Mode       */
00151   HAL_I2C_MODE_SLAVE              = 0x20U,   /*!< I2C communication is in Slave Mode        */
00152   HAL_I2C_MODE_MEM                = 0x40U    /*!< I2C communication is in Memory Mode       */
00153 
00154 } HAL_I2C_ModeTypeDef;
00155 
00156 /**
00157   * @}
00158   */
00159 
00160 /** @defgroup I2C_Error_Code_definition I2C Error Code definition
00161   * @brief  I2C Error Code definition
00162   * @{
00163   */
00164 #define HAL_I2C_ERROR_NONE              0x00000000U    /*!< No error              */
00165 #define HAL_I2C_ERROR_BERR              0x00000001U    /*!< BERR error            */
00166 #define HAL_I2C_ERROR_ARLO              0x00000002U    /*!< ARLO error            */
00167 #define HAL_I2C_ERROR_AF                0x00000004U    /*!< AF error              */
00168 #define HAL_I2C_ERROR_OVR               0x00000008U    /*!< OVR error             */
00169 #define HAL_I2C_ERROR_DMA               0x00000010U    /*!< DMA transfer error    */
00170 #define HAL_I2C_ERROR_TIMEOUT           0x00000020U    /*!< Timeout Error         */
00171 #define HAL_I2C_ERROR_SIZE              0x00000040U    /*!< Size Management error */
00172 #define HAL_I2C_ERROR_DMA_PARAM         0x00000080U    /*!< DMA Parameter Error   */
00173 #define HAL_I2C_WRONG_START             0x00000200U    /*!< Wrong start Error     */
00174 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
00175 #define HAL_I2C_ERROR_INVALID_CALLBACK  0x00000100U    /*!< Invalid Callback error */
00176 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
00177 /**
00178   * @}
00179   */
00180 
00181 /** @defgroup I2C_handle_Structure_definition I2C handle Structure definition
00182   * @brief  I2C handle Structure definition
00183   * @{
00184   */
00185 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
00186 typedef struct __I2C_HandleTypeDef
00187 #else
00188 typedef struct
00189 #endif  /* USE_HAL_I2C_REGISTER_CALLBACKS */
00190 {
00191   I2C_TypeDef                *Instance;      /*!< I2C registers base address               */
00192 
00193   I2C_InitTypeDef            Init;           /*!< I2C communication parameters             */
00194 
00195   uint8_t                    *pBuffPtr;      /*!< Pointer to I2C transfer buffer           */
00196 
00197   uint16_t                   XferSize;       /*!< I2C transfer size                        */
00198 
00199   __IO uint16_t              XferCount;      /*!< I2C transfer counter                     */
00200 
00201   __IO uint32_t              XferOptions;    /*!< I2C transfer options                     */
00202 
00203   __IO uint32_t              PreviousState;  /*!< I2C communication Previous state and mode
00204                                                   context for internal usage               */
00205 
00206   DMA_HandleTypeDef          *hdmatx;        /*!< I2C Tx DMA handle parameters             */
00207 
00208   DMA_HandleTypeDef          *hdmarx;        /*!< I2C Rx DMA handle parameters             */
00209 
00210   HAL_LockTypeDef            Lock;           /*!< I2C locking object                       */
00211 
00212   __IO HAL_I2C_StateTypeDef  State;          /*!< I2C communication state                  */
00213 
00214   __IO HAL_I2C_ModeTypeDef   Mode;           /*!< I2C communication mode                   */
00215 
00216   __IO uint32_t              ErrorCode;      /*!< I2C Error code                           */
00217 
00218   __IO uint32_t              Devaddress;     /*!< I2C Target device address                */
00219 
00220   __IO uint32_t              Memaddress;     /*!< I2C Target memory address                */
00221 
00222   __IO uint32_t              MemaddSize;     /*!< I2C Target memory address  size          */
00223 
00224   __IO uint32_t              EventCount;     /*!< I2C Event counter                        */
00225 
00226 
00227 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
00228   void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);           /*!< I2C Master Tx Transfer completed callback */
00229   void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);           /*!< I2C Master Rx Transfer completed callback */
00230   void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*!< I2C Slave Tx Transfer completed callback  */
00231   void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*!< I2C Slave Rx Transfer completed callback  */
00232   void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c);             /*!< I2C Listen Complete callback              */
00233   void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Memory Tx Transfer completed callback */
00234   void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Memory Rx Transfer completed callback */
00235   void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c);                  /*!< I2C Error callback                        */
00236   void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Abort callback                        */
00237 
00238   void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);  /*!< I2C Slave Address Match callback */
00239 
00240   void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c);                /*!< I2C Msp Init callback                     */
00241   void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Msp DeInit callback                   */
00242 
00243 #endif  /* USE_HAL_I2C_REGISTER_CALLBACKS */
00244 } I2C_HandleTypeDef;
00245 
00246 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
00247 /**
00248   * @brief  HAL I2C Callback ID enumeration definition
00249   */
00250 typedef enum
00251 {
00252   HAL_I2C_MASTER_TX_COMPLETE_CB_ID      = 0x00U,    /*!< I2C Master Tx Transfer completed callback ID  */
00253   HAL_I2C_MASTER_RX_COMPLETE_CB_ID      = 0x01U,    /*!< I2C Master Rx Transfer completed callback ID  */
00254   HAL_I2C_SLAVE_TX_COMPLETE_CB_ID       = 0x02U,    /*!< I2C Slave Tx Transfer completed callback ID   */
00255   HAL_I2C_SLAVE_RX_COMPLETE_CB_ID       = 0x03U,    /*!< I2C Slave Rx Transfer completed callback ID   */
00256   HAL_I2C_LISTEN_COMPLETE_CB_ID         = 0x04U,    /*!< I2C Listen Complete callback ID               */
00257   HAL_I2C_MEM_TX_COMPLETE_CB_ID         = 0x05U,    /*!< I2C Memory Tx Transfer callback ID            */
00258   HAL_I2C_MEM_RX_COMPLETE_CB_ID         = 0x06U,    /*!< I2C Memory Rx Transfer completed callback ID  */
00259   HAL_I2C_ERROR_CB_ID                   = 0x07U,    /*!< I2C Error callback ID                         */
00260   HAL_I2C_ABORT_CB_ID                   = 0x08U,    /*!< I2C Abort callback ID                         */
00261 
00262   HAL_I2C_MSPINIT_CB_ID                 = 0x09U,    /*!< I2C Msp Init callback ID                      */
00263   HAL_I2C_MSPDEINIT_CB_ID               = 0x0AU     /*!< I2C Msp DeInit callback ID                    */
00264 
00265 } HAL_I2C_CallbackIDTypeDef;
00266 
00267 /**
00268   * @brief  HAL I2C Callback pointer definition
00269   */
00270 typedef  void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*!< pointer to an I2C callback function */
00271 typedef  void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< pointer to an I2C Address Match callback function */
00272 
00273 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
00274 /**
00275   * @}
00276   */
00277 
00278 /**
00279   * @}
00280   */
00281 /* Exported constants --------------------------------------------------------*/
00282 
00283 /** @defgroup I2C_Exported_Constants I2C Exported Constants
00284   * @{
00285   */
00286 
00287 /** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode
00288   * @{
00289   */
00290 #define I2C_DUTYCYCLE_2                 0x00000000U
00291 #define I2C_DUTYCYCLE_16_9              I2C_CCR_DUTY
00292 /**
00293   * @}
00294   */
00295 
00296 /** @defgroup I2C_addressing_mode I2C addressing mode
00297   * @{
00298   */
00299 #define I2C_ADDRESSINGMODE_7BIT         0x00004000U
00300 #define I2C_ADDRESSINGMODE_10BIT        (I2C_OAR1_ADDMODE | 0x00004000U)
00301 /**
00302   * @}
00303   */
00304 
00305 /** @defgroup I2C_dual_addressing_mode  I2C dual addressing mode
00306   * @{
00307   */
00308 #define I2C_DUALADDRESS_DISABLE        0x00000000U
00309 #define I2C_DUALADDRESS_ENABLE         I2C_OAR2_ENDUAL
00310 /**
00311   * @}
00312   */
00313 
00314 /** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode
00315   * @{
00316   */
00317 #define I2C_GENERALCALL_DISABLE        0x00000000U
00318 #define I2C_GENERALCALL_ENABLE         I2C_CR1_ENGC
00319 /**
00320   * @}
00321   */
00322 
00323 /** @defgroup I2C_nostretch_mode I2C nostretch mode
00324   * @{
00325   */
00326 #define I2C_NOSTRETCH_DISABLE          0x00000000U
00327 #define I2C_NOSTRETCH_ENABLE           I2C_CR1_NOSTRETCH
00328 /**
00329   * @}
00330   */
00331 
00332 /** @defgroup I2C_Memory_Address_Size I2C Memory Address Size
00333   * @{
00334   */
00335 #define I2C_MEMADD_SIZE_8BIT            0x00000001U
00336 #define I2C_MEMADD_SIZE_16BIT           0x00000010U
00337 /**
00338   * @}
00339   */
00340 
00341 /** @defgroup I2C_XferDirection_definition I2C XferDirection definition
00342   * @{
00343   */
00344 #define I2C_DIRECTION_RECEIVE           0x00000000U
00345 #define I2C_DIRECTION_TRANSMIT          0x00000001U
00346 /**
00347   * @}
00348   */
00349 
00350 /** @defgroup I2C_XferOptions_definition I2C XferOptions definition
00351   * @{
00352   */
00353 #define  I2C_FIRST_FRAME                0x00000001U
00354 #define  I2C_FIRST_AND_NEXT_FRAME       0x00000002U
00355 #define  I2C_NEXT_FRAME                 0x00000004U
00356 #define  I2C_FIRST_AND_LAST_FRAME       0x00000008U
00357 #define  I2C_LAST_FRAME_NO_STOP         0x00000010U
00358 #define  I2C_LAST_FRAME                 0x00000020U
00359 
00360 /* List of XferOptions in usage of :
00361  * 1- Restart condition in all use cases (direction change or not)
00362  */
00363 #define  I2C_OTHER_FRAME                (0x00AA0000U)
00364 #define  I2C_OTHER_AND_LAST_FRAME       (0xAA000000U)
00365 /**
00366   * @}
00367   */
00368 
00369 /** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition
00370   * @brief I2C Interrupt definition
00371   *        Elements values convention: 0xXXXXXXXX
00372   *           - XXXXXXXX  : Interrupt control mask
00373   * @{
00374   */
00375 #define I2C_IT_BUF                      I2C_CR2_ITBUFEN
00376 #define I2C_IT_EVT                      I2C_CR2_ITEVTEN
00377 #define I2C_IT_ERR                      I2C_CR2_ITERREN
00378 /**
00379   * @}
00380   */
00381 
00382 /** @defgroup I2C_Flag_definition I2C Flag definition
00383   * @{
00384   */
00385 
00386 #define I2C_FLAG_OVR                    0x00010800U
00387 #define I2C_FLAG_AF                     0x00010400U
00388 #define I2C_FLAG_ARLO                   0x00010200U
00389 #define I2C_FLAG_BERR                   0x00010100U
00390 #define I2C_FLAG_TXE                    0x00010080U
00391 #define I2C_FLAG_RXNE                   0x00010040U
00392 #define I2C_FLAG_STOPF                  0x00010010U
00393 #define I2C_FLAG_ADD10                  0x00010008U
00394 #define I2C_FLAG_BTF                    0x00010004U
00395 #define I2C_FLAG_ADDR                   0x00010002U
00396 #define I2C_FLAG_SB                     0x00010001U
00397 #define I2C_FLAG_DUALF                  0x00100080U
00398 #define I2C_FLAG_GENCALL                0x00100010U
00399 #define I2C_FLAG_TRA                    0x00100004U
00400 #define I2C_FLAG_BUSY                   0x00100002U
00401 #define I2C_FLAG_MSL                    0x00100001U
00402 /**
00403   * @}
00404   */
00405 
00406 /**
00407   * @}
00408   */
00409 
00410 /* Exported macros -----------------------------------------------------------*/
00411 
00412 /** @defgroup I2C_Exported_Macros I2C Exported Macros
00413   * @{
00414   */
00415 
00416 /** @brief Reset I2C handle state.
00417   * @param  __HANDLE__ specifies the I2C Handle.
00418   * @retval None
00419   */
00420 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
00421 #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                do{                                                   \
00422                                                                     (__HANDLE__)->State = HAL_I2C_STATE_RESET;       \
00423                                                                     (__HANDLE__)->MspInitCallback = NULL;            \
00424                                                                     (__HANDLE__)->MspDeInitCallback = NULL;          \
00425                                                                   } while(0)
00426 #else
00427 #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                ((__HANDLE__)->State = HAL_I2C_STATE_RESET)
00428 #endif
00429 
00430 /** @brief  Enable or disable the specified I2C interrupts.
00431   * @param  __HANDLE__ specifies the I2C Handle.
00432   * @param  __INTERRUPT__ specifies the interrupt source to enable or disable.
00433   *         This parameter can be one of the following values:
00434   *            @arg I2C_IT_BUF: Buffer interrupt enable
00435   *            @arg I2C_IT_EVT: Event interrupt enable
00436   *            @arg I2C_IT_ERR: Error interrupt enable
00437   * @retval None
00438   */
00439 #define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__)   SET_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__))
00440 #define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__)  CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__))
00441 
00442 /** @brief  Checks if the specified I2C interrupt source is enabled or disabled.
00443   * @param  __HANDLE__ specifies the I2C Handle.
00444   * @param  __INTERRUPT__ specifies the I2C interrupt source to check.
00445   *          This parameter can be one of the following values:
00446   *            @arg I2C_IT_BUF: Buffer interrupt enable
00447   *            @arg I2C_IT_EVT: Event interrupt enable
00448   *            @arg I2C_IT_ERR: Error interrupt enable
00449   * @retval The new state of __INTERRUPT__ (TRUE or FALSE).
00450   */
00451 #define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)
00452 
00453 /** @brief  Checks whether the specified I2C flag is set or not.
00454   * @param  __HANDLE__ specifies the I2C Handle.
00455   * @param  __FLAG__ specifies the flag to check.
00456   *         This parameter can be one of the following values:
00457   *            @arg I2C_FLAG_OVR: Overrun/Underrun flag
00458   *            @arg I2C_FLAG_AF: Acknowledge failure flag
00459   *            @arg I2C_FLAG_ARLO: Arbitration lost flag
00460   *            @arg I2C_FLAG_BERR: Bus error flag
00461   *            @arg I2C_FLAG_TXE: Data register empty flag
00462   *            @arg I2C_FLAG_RXNE: Data register not empty flag
00463   *            @arg I2C_FLAG_STOPF: Stop detection flag
00464   *            @arg I2C_FLAG_ADD10: 10-bit header sent flag
00465   *            @arg I2C_FLAG_BTF: Byte transfer finished flag
00466   *            @arg I2C_FLAG_ADDR: Address sent flag
00467   *                                Address matched flag
00468   *            @arg I2C_FLAG_SB: Start bit flag
00469   *            @arg I2C_FLAG_DUALF: Dual flag
00470   *            @arg I2C_FLAG_GENCALL: General call header flag
00471   *            @arg I2C_FLAG_TRA: Transmitter/Receiver flag
00472   *            @arg I2C_FLAG_BUSY: Bus busy flag
00473   *            @arg I2C_FLAG_MSL: Master/Slave flag
00474   * @retval The new state of __FLAG__ (TRUE or FALSE).
00475   */
00476 #define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16U)) == 0x01U) ? \
00477                                                   (((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) : \
00478                                                   (((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET))
00479 
00480 /** @brief  Clears the I2C pending flags which are cleared by writing 0 in a specific bit.
00481   * @param  __HANDLE__ specifies the I2C Handle.
00482   * @param  __FLAG__ specifies the flag to clear.
00483   *         This parameter can be any combination of the following values:
00484   *            @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode)
00485   *            @arg I2C_FLAG_AF: Acknowledge failure flag
00486   *            @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode)
00487   *            @arg I2C_FLAG_BERR: Bus error flag
00488   * @retval None
00489   */
00490 #define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR1 = ~((__FLAG__) & I2C_FLAG_MASK))
00491 
00492 /** @brief  Clears the I2C ADDR pending flag.
00493   * @param  __HANDLE__ specifies the I2C Handle.
00494   *         This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral.
00495   * @retval None
00496   */
00497 #define __HAL_I2C_CLEAR_ADDRFLAG(__HANDLE__)    \
00498   do{                                           \
00499     __IO uint32_t tmpreg = 0x00U;               \
00500     tmpreg = (__HANDLE__)->Instance->SR1;       \
00501     tmpreg = (__HANDLE__)->Instance->SR2;       \
00502     UNUSED(tmpreg);                             \
00503   } while(0)
00504 
00505 /** @brief  Clears the I2C STOPF pending flag.
00506   * @param  __HANDLE__ specifies the I2C Handle.
00507   * @retval None
00508   */
00509 #define __HAL_I2C_CLEAR_STOPFLAG(__HANDLE__)           \
00510   do{                                                  \
00511     __IO uint32_t tmpreg = 0x00U;                      \
00512     tmpreg = (__HANDLE__)->Instance->SR1;              \
00513     SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE);  \
00514     UNUSED(tmpreg);                                    \
00515   } while(0)
00516 
00517 /** @brief  Enable the specified I2C peripheral.
00518   * @param  __HANDLE__ specifies the I2C Handle.
00519   * @retval None
00520   */
00521 #define __HAL_I2C_ENABLE(__HANDLE__)                  SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)
00522 
00523 /** @brief  Disable the specified I2C peripheral.
00524   * @param  __HANDLE__ specifies the I2C Handle.
00525   * @retval None
00526   */
00527 #define __HAL_I2C_DISABLE(__HANDLE__)                 CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)
00528 
00529 /**
00530   * @}
00531   */
00532 
00533 /* Exported functions --------------------------------------------------------*/
00534 /** @addtogroup I2C_Exported_Functions
00535   * @{
00536   */
00537 
00538 /** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions
00539   * @{
00540   */
00541 /* Initialization and de-initialization functions******************************/
00542 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);
00543 HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);
00544 void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);
00545 void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);
00546 
00547 /* Callbacks Register/UnRegister functions  ***********************************/
00548 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
00549 HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback);
00550 HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID);
00551 
00552 HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback);
00553 HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c);
00554 #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
00555 /**
00556   * @}
00557   */
00558 
00559 /** @addtogroup I2C_Exported_Functions_Group2 Input and Output operation functions
00560   * @{
00561   */
00562 /* IO operation functions  ****************************************************/
00563 /******* Blocking mode: Polling */
00564 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
00565 HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
00566 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
00567 HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
00568 HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
00569 HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
00570 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);
00571 
00572 /******* Non-Blocking mode: Interrupt */
00573 HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
00574 HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
00575 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
00576 HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
00577 HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
00578 HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
00579 
00580 HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
00581 HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
00582 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
00583 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
00584 HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);
00585 HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
00586 HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);
00587 
00588 /******* Non-Blocking mode: DMA */
00589 HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
00590 HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
00591 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
00592 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
00593 HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
00594 HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
00595 
00596 HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
00597 HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
00598 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
00599 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
00600 /**
00601   * @}
00602   */
00603 
00604 /** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks
00605  * @{
00606  */
00607 /******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */
00608 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);
00609 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);
00610 void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
00611 void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
00612 void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);
00613 void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);
00614 void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);
00615 void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);
00616 void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
00617 void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
00618 void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
00619 void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);
00620 /**
00621   * @}
00622   */
00623 
00624 /** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions
00625   * @{
00626   */
00627 /* Peripheral State, Mode and Error functions  *********************************/
00628 HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c);
00629 HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c);
00630 uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c);
00631 
00632 /**
00633   * @}
00634   */
00635 
00636 /**
00637   * @}
00638   */
00639 /* Private types -------------------------------------------------------------*/
00640 /* Private variables ---------------------------------------------------------*/
00641 /* Private constants ---------------------------------------------------------*/
00642 /** @defgroup I2C_Private_Constants I2C Private Constants
00643   * @{
00644   */
00645 #define I2C_FLAG_MASK                    0x0000FFFFU
00646 #define I2C_MIN_PCLK_FREQ_STANDARD       2000000U     /*!< 2 MHz                     */
00647 #define I2C_MIN_PCLK_FREQ_FAST           4000000U     /*!< 4 MHz                     */
00648 /**
00649   * @}
00650   */
00651 
00652 /* Private macros ------------------------------------------------------------*/
00653 /** @defgroup I2C_Private_Macros I2C Private Macros
00654   * @{
00655   */
00656 
00657 #define I2C_MIN_PCLK_FREQ(__PCLK__, __SPEED__)             (((__SPEED__) <= 100000U) ? ((__PCLK__) < I2C_MIN_PCLK_FREQ_STANDARD) : ((__PCLK__) < I2C_MIN_PCLK_FREQ_FAST))
00658 #define I2C_CCR_CALCULATION(__PCLK__, __SPEED__, __COEFF__)     (((((__PCLK__) - 1U)/((__SPEED__) * (__COEFF__))) + 1U) & I2C_CCR_CCR)
00659 #define I2C_FREQRANGE(__PCLK__)                            ((__PCLK__)/1000000U)
00660 #define I2C_RISE_TIME(__FREQRANGE__, __SPEED__)            (((__SPEED__) <= 100000U) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U))
00661 #define I2C_SPEED_STANDARD(__PCLK__, __SPEED__)            ((I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U) < 4U)? 4U:I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U))
00662 #define I2C_SPEED_FAST(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__DUTYCYCLE__) == I2C_DUTYCYCLE_2)? I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 3U) : (I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 25U) | I2C_DUTYCYCLE_16_9))
00663 #define I2C_SPEED(__PCLK__, __SPEED__, __DUTYCYCLE__)      (((__SPEED__) <= 100000U)? (I2C_SPEED_STANDARD((__PCLK__), (__SPEED__))) : \
00664                                                                   ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__)) & I2C_CCR_CCR) == 0U)? 1U : \
00665                                                                   ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__))) | I2C_CCR_FS))
00666 
00667 #define I2C_7BIT_ADD_WRITE(__ADDRESS__)                    ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0)))
00668 #define I2C_7BIT_ADD_READ(__ADDRESS__)                     ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0))
00669 
00670 #define I2C_10BIT_ADDRESS(__ADDRESS__)                     ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF)))
00671 #define I2C_10BIT_HEADER_WRITE(__ADDRESS__)                ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)0x00F0)))
00672 #define I2C_10BIT_HEADER_READ(__ADDRESS__)                 ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)(0x00F1))))
00673 
00674 #define I2C_MEM_ADD_MSB(__ADDRESS__)                       ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8)))
00675 #define I2C_MEM_ADD_LSB(__ADDRESS__)                       ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF)))
00676 
00677 /** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters
00678   * @{
00679   */
00680 #define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DUTYCYCLE_2) || \
00681                                   ((CYCLE) == I2C_DUTYCYCLE_16_9))
00682 #define IS_I2C_ADDRESSING_MODE(ADDRESS) (((ADDRESS) == I2C_ADDRESSINGMODE_7BIT) || \
00683                                          ((ADDRESS) == I2C_ADDRESSINGMODE_10BIT))
00684 #define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \
00685                                       ((ADDRESS) == I2C_DUALADDRESS_ENABLE))
00686 #define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \
00687                                    ((CALL) == I2C_GENERALCALL_ENABLE))
00688 #define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \
00689                                     ((STRETCH) == I2C_NOSTRETCH_ENABLE))
00690 #define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \
00691                                   ((SIZE) == I2C_MEMADD_SIZE_16BIT))
00692 #define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0U) && ((SPEED) <= 400000U))
00693 #define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & 0xFFFFFC00U) == 0U)
00694 #define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & 0xFFFFFF01U) == 0U)
00695 #define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST)      (((REQUEST) == I2C_FIRST_FRAME)              || \
00696                                                        ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME)     || \
00697                                                        ((REQUEST) == I2C_NEXT_FRAME)               || \
00698                                                        ((REQUEST) == I2C_FIRST_AND_LAST_FRAME)     || \
00699                                                        ((REQUEST) == I2C_LAST_FRAME)               || \
00700                                                        ((REQUEST) == I2C_LAST_FRAME_NO_STOP)       || \
00701                                                        IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST))
00702 
00703 #define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME)     || \
00704                                                         ((REQUEST) == I2C_OTHER_AND_LAST_FRAME))
00705 
00706 #define I2C_CHECK_FLAG(__ISR__, __FLAG__)         ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)
00707 #define I2C_CHECK_IT_SOURCE(__CR1__, __IT__)      ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET)
00708 /**
00709   * @}
00710   */
00711 
00712 /**
00713   * @}
00714   */
00715 
00716 /* Private functions ---------------------------------------------------------*/
00717 /** @defgroup I2C_Private_Functions I2C Private Functions
00718   * @{
00719   */
00720 
00721 /**
00722   * @}
00723   */
00724 
00725 /**
00726   * @}
00727   */
00728 
00729 /**
00730   * @}
00731   */
00732 
00733 #ifdef __cplusplus
00734 }
00735 #endif
00736 
00737 
00738 #endif /* __STM32F1xx_HAL_I2C_H */
00739 
00740 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/