mbed official / mbed

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

Committer:
AnnaBridge
Date:
Wed Nov 08 17:18:06 2017 +0000
Revision:
156:ff21514d8981
Child:
159:7130f322cb7e
Reverting back to release 154 of the mbed library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 156:ff21514d8981 1 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 2 * @file em_i2c.h
AnnaBridge 156:ff21514d8981 3 * @brief Inter-intergrated circuit (I2C) peripheral API
AnnaBridge 156:ff21514d8981 4 * @version 5.1.2
AnnaBridge 156:ff21514d8981 5 *******************************************************************************
AnnaBridge 156:ff21514d8981 6 * @section License
AnnaBridge 156:ff21514d8981 7 * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b>
AnnaBridge 156:ff21514d8981 8 *******************************************************************************
AnnaBridge 156:ff21514d8981 9 *
AnnaBridge 156:ff21514d8981 10 * Permission is granted to anyone to use this software for any purpose,
AnnaBridge 156:ff21514d8981 11 * including commercial applications, and to alter it and redistribute it
AnnaBridge 156:ff21514d8981 12 * freely, subject to the following restrictions:
AnnaBridge 156:ff21514d8981 13 *
AnnaBridge 156:ff21514d8981 14 * 1. The origin of this software must not be misrepresented; you must not
AnnaBridge 156:ff21514d8981 15 * claim that you wrote the original software.
AnnaBridge 156:ff21514d8981 16 * 2. Altered source versions must be plainly marked as such, and must not be
AnnaBridge 156:ff21514d8981 17 * misrepresented as being the original software.
AnnaBridge 156:ff21514d8981 18 * 3. This notice may not be removed or altered from any source distribution.
AnnaBridge 156:ff21514d8981 19 *
AnnaBridge 156:ff21514d8981 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
AnnaBridge 156:ff21514d8981 21 * obligation to support this Software. Silicon Labs is providing the
AnnaBridge 156:ff21514d8981 22 * Software "AS IS", with no express or implied warranties of any kind,
AnnaBridge 156:ff21514d8981 23 * including, but not limited to, any implied warranties of merchantability
AnnaBridge 156:ff21514d8981 24 * or fitness for any particular purpose or warranties against infringement
AnnaBridge 156:ff21514d8981 25 * of any proprietary rights of a third party.
AnnaBridge 156:ff21514d8981 26 *
AnnaBridge 156:ff21514d8981 27 * Silicon Labs will not be liable for any consequential, incidental, or
AnnaBridge 156:ff21514d8981 28 * special damages, or any other relief, or for any claim by any third party,
AnnaBridge 156:ff21514d8981 29 * arising from your use of this Software.
AnnaBridge 156:ff21514d8981 30 *
AnnaBridge 156:ff21514d8981 31 ******************************************************************************/
AnnaBridge 156:ff21514d8981 32
AnnaBridge 156:ff21514d8981 33 #ifndef EM_I2C_H
AnnaBridge 156:ff21514d8981 34 #define EM_I2C_H
AnnaBridge 156:ff21514d8981 35
AnnaBridge 156:ff21514d8981 36 #include "em_device.h"
AnnaBridge 156:ff21514d8981 37 #if defined(I2C_COUNT) && (I2C_COUNT > 0)
AnnaBridge 156:ff21514d8981 38
AnnaBridge 156:ff21514d8981 39 #include <stdbool.h>
AnnaBridge 156:ff21514d8981 40
AnnaBridge 156:ff21514d8981 41 #ifdef __cplusplus
AnnaBridge 156:ff21514d8981 42 extern "C" {
AnnaBridge 156:ff21514d8981 43 #endif
AnnaBridge 156:ff21514d8981 44
AnnaBridge 156:ff21514d8981 45 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 46 * @addtogroup emlib
AnnaBridge 156:ff21514d8981 47 * @{
AnnaBridge 156:ff21514d8981 48 ******************************************************************************/
AnnaBridge 156:ff21514d8981 49
AnnaBridge 156:ff21514d8981 50 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 51 * @addtogroup I2C
AnnaBridge 156:ff21514d8981 52 * @{
AnnaBridge 156:ff21514d8981 53 ******************************************************************************/
AnnaBridge 156:ff21514d8981 54
AnnaBridge 156:ff21514d8981 55 /*******************************************************************************
AnnaBridge 156:ff21514d8981 56 ******************************* DEFINES ***********************************
AnnaBridge 156:ff21514d8981 57 ******************************************************************************/
AnnaBridge 156:ff21514d8981 58
AnnaBridge 156:ff21514d8981 59 /**
AnnaBridge 156:ff21514d8981 60 * @brief
AnnaBridge 156:ff21514d8981 61 * Standard mode max frequency assuming using 4:4 ratio for Nlow:Nhigh.
AnnaBridge 156:ff21514d8981 62 * @details
AnnaBridge 156:ff21514d8981 63 * From I2C specification: Min Tlow = 4.7us, min Thigh = 4.0us,
AnnaBridge 156:ff21514d8981 64 * max Trise=1.0us, max Tfall=0.3us. Since ratio is 4:4, have to use
AnnaBridge 156:ff21514d8981 65 * worst case value of Tlow or Thigh as base.
AnnaBridge 156:ff21514d8981 66 *
AnnaBridge 156:ff21514d8981 67 * 1/(Tlow + Thigh + 1us + 0.3us) = 1/(4.7 + 4.7 + 1.3)us = 93458Hz
AnnaBridge 156:ff21514d8981 68 * @note
AnnaBridge 156:ff21514d8981 69 * Due to chip characteristics, the max value is somewhat reduced.
AnnaBridge 156:ff21514d8981 70 */
AnnaBridge 156:ff21514d8981 71 #if defined(_SILICON_LABS_32B_SERIES_0) \
AnnaBridge 156:ff21514d8981 72 && (defined(_EFM32_GECKO_FAMILY) \
AnnaBridge 156:ff21514d8981 73 || defined(_EFM32_TINY_FAMILY) \
AnnaBridge 156:ff21514d8981 74 || defined(_EFM32_ZERO_FAMILY) \
AnnaBridge 156:ff21514d8981 75 || defined(_EFM32_HAPPY_FAMILY))
AnnaBridge 156:ff21514d8981 76 #define I2C_FREQ_STANDARD_MAX 93000
AnnaBridge 156:ff21514d8981 77 #elif defined(_SILICON_LABS_32B_SERIES_0) \
AnnaBridge 156:ff21514d8981 78 && (defined(_EFM32_GIANT_FAMILY) \
AnnaBridge 156:ff21514d8981 79 || defined(_EFM32_WONDER_FAMILY))
AnnaBridge 156:ff21514d8981 80 #define I2C_FREQ_STANDARD_MAX 92000
AnnaBridge 156:ff21514d8981 81 #elif defined(_SILICON_LABS_32B_SERIES_1)
AnnaBridge 156:ff21514d8981 82 // None of the chips on this platform has been characterized on this parameter.
AnnaBridge 156:ff21514d8981 83 // Use same value as on Wonder until further notice.
AnnaBridge 156:ff21514d8981 84 #define I2C_FREQ_STANDARD_MAX 92000
AnnaBridge 156:ff21514d8981 85 #else
AnnaBridge 156:ff21514d8981 86 #error "Unknown device family."
AnnaBridge 156:ff21514d8981 87 #endif
AnnaBridge 156:ff21514d8981 88
AnnaBridge 156:ff21514d8981 89 /**
AnnaBridge 156:ff21514d8981 90 * @brief
AnnaBridge 156:ff21514d8981 91 * Fast mode max frequency assuming using 6:3 ratio for Nlow:Nhigh.
AnnaBridge 156:ff21514d8981 92 * @details
AnnaBridge 156:ff21514d8981 93 * From I2C specification: Min Tlow = 1.3us, min Thigh = 0.6us,
AnnaBridge 156:ff21514d8981 94 * max Trise=0.3us, max Tfall=0.3us. Since ratio is 6:3, have to use
AnnaBridge 156:ff21514d8981 95 * worst case value of Tlow or 2xThigh as base.
AnnaBridge 156:ff21514d8981 96 *
AnnaBridge 156:ff21514d8981 97 * 1/(Tlow + Thigh + 0.3us + 0.3us) = 1/(1.3 + 0.65 + 0.6)us = 392157Hz
AnnaBridge 156:ff21514d8981 98 */
AnnaBridge 156:ff21514d8981 99 #define I2C_FREQ_FAST_MAX 392157
AnnaBridge 156:ff21514d8981 100
AnnaBridge 156:ff21514d8981 101
AnnaBridge 156:ff21514d8981 102 /**
AnnaBridge 156:ff21514d8981 103 * @brief
AnnaBridge 156:ff21514d8981 104 * Fast mode+ max frequency assuming using 11:6 ratio for Nlow:Nhigh.
AnnaBridge 156:ff21514d8981 105 * @details
AnnaBridge 156:ff21514d8981 106 * From I2C specification: Min Tlow = 0.5us, min Thigh = 0.26us,
AnnaBridge 156:ff21514d8981 107 * max Trise=0.12us, max Tfall=0.12us. Since ratio is 11:6, have to use
AnnaBridge 156:ff21514d8981 108 * worst case value of Tlow or (11/6)xThigh as base.
AnnaBridge 156:ff21514d8981 109 *
AnnaBridge 156:ff21514d8981 110 * 1/(Tlow + Thigh + 0.12us + 0.12us) = 1/(0.5 + 0.273 + 0.24)us = 987167Hz
AnnaBridge 156:ff21514d8981 111 */
AnnaBridge 156:ff21514d8981 112 #define I2C_FREQ_FASTPLUS_MAX 987167
AnnaBridge 156:ff21514d8981 113
AnnaBridge 156:ff21514d8981 114
AnnaBridge 156:ff21514d8981 115 /**
AnnaBridge 156:ff21514d8981 116 * @brief
AnnaBridge 156:ff21514d8981 117 * Indicate plain write sequence: S+ADDR(W)+DATA0+P.
AnnaBridge 156:ff21514d8981 118 * @details
AnnaBridge 156:ff21514d8981 119 * @li S - Start
AnnaBridge 156:ff21514d8981 120 * @li ADDR(W) - address with W/R bit cleared
AnnaBridge 156:ff21514d8981 121 * @li DATA0 - Data taken from buffer with index 0
AnnaBridge 156:ff21514d8981 122 * @li P - Stop
AnnaBridge 156:ff21514d8981 123 */
AnnaBridge 156:ff21514d8981 124 #define I2C_FLAG_WRITE 0x0001
AnnaBridge 156:ff21514d8981 125
AnnaBridge 156:ff21514d8981 126 /**
AnnaBridge 156:ff21514d8981 127 * @brief
AnnaBridge 156:ff21514d8981 128 * Indicate plain read sequence: S+ADDR(R)+DATA0+P.
AnnaBridge 156:ff21514d8981 129 * @details
AnnaBridge 156:ff21514d8981 130 * @li S - Start
AnnaBridge 156:ff21514d8981 131 * @li ADDR(R) - address with W/R bit set
AnnaBridge 156:ff21514d8981 132 * @li DATA0 - Data read into buffer with index 0
AnnaBridge 156:ff21514d8981 133 * @li P - Stop
AnnaBridge 156:ff21514d8981 134 */
AnnaBridge 156:ff21514d8981 135 #define I2C_FLAG_READ 0x0002
AnnaBridge 156:ff21514d8981 136
AnnaBridge 156:ff21514d8981 137 /**
AnnaBridge 156:ff21514d8981 138 * @brief
AnnaBridge 156:ff21514d8981 139 * Indicate combined write/read sequence: S+ADDR(W)+DATA0+Sr+ADDR(R)+DATA1+P.
AnnaBridge 156:ff21514d8981 140 * @details
AnnaBridge 156:ff21514d8981 141 * @li S - Start
AnnaBridge 156:ff21514d8981 142 * @li Sr - Repeated start
AnnaBridge 156:ff21514d8981 143 * @li ADDR(W) - address with W/R bit cleared
AnnaBridge 156:ff21514d8981 144 * @li ADDR(R) - address with W/R bit set
AnnaBridge 156:ff21514d8981 145 * @li DATAn - Data written from/read into buffer with index n
AnnaBridge 156:ff21514d8981 146 * @li P - Stop
AnnaBridge 156:ff21514d8981 147 */
AnnaBridge 156:ff21514d8981 148 #define I2C_FLAG_WRITE_READ 0x0004
AnnaBridge 156:ff21514d8981 149
AnnaBridge 156:ff21514d8981 150 /**
AnnaBridge 156:ff21514d8981 151 * @brief
AnnaBridge 156:ff21514d8981 152 * Indicate write sequence using two buffers: S+ADDR(W)+DATA0+DATA1+P.
AnnaBridge 156:ff21514d8981 153 * @details
AnnaBridge 156:ff21514d8981 154 * @li S - Start
AnnaBridge 156:ff21514d8981 155 * @li ADDR(W) - address with W/R bit cleared
AnnaBridge 156:ff21514d8981 156 * @li DATAn - Data written from buffer with index n
AnnaBridge 156:ff21514d8981 157 * @li P - Stop
AnnaBridge 156:ff21514d8981 158 */
AnnaBridge 156:ff21514d8981 159 #define I2C_FLAG_WRITE_WRITE 0x0008
AnnaBridge 156:ff21514d8981 160
AnnaBridge 156:ff21514d8981 161 /** Use 10 bit address. */
AnnaBridge 156:ff21514d8981 162 #define I2C_FLAG_10BIT_ADDR 0x0010
AnnaBridge 156:ff21514d8981 163
AnnaBridge 156:ff21514d8981 164
AnnaBridge 156:ff21514d8981 165 /*******************************************************************************
AnnaBridge 156:ff21514d8981 166 ******************************** ENUMS ************************************
AnnaBridge 156:ff21514d8981 167 ******************************************************************************/
AnnaBridge 156:ff21514d8981 168
AnnaBridge 156:ff21514d8981 169 /** Clock low to high ratio settings. */
AnnaBridge 156:ff21514d8981 170 typedef enum
AnnaBridge 156:ff21514d8981 171 {
AnnaBridge 156:ff21514d8981 172 i2cClockHLRStandard = _I2C_CTRL_CLHR_STANDARD, /**< Ratio is 4:4 */
AnnaBridge 156:ff21514d8981 173 i2cClockHLRAsymetric = _I2C_CTRL_CLHR_ASYMMETRIC, /**< Ratio is 6:3 */
AnnaBridge 156:ff21514d8981 174 i2cClockHLRFast = _I2C_CTRL_CLHR_FAST /**< Ratio is 11:3 */
AnnaBridge 156:ff21514d8981 175 } I2C_ClockHLR_TypeDef;
AnnaBridge 156:ff21514d8981 176
AnnaBridge 156:ff21514d8981 177
AnnaBridge 156:ff21514d8981 178 /** Return codes for single master mode transfer function. */
AnnaBridge 156:ff21514d8981 179 typedef enum
AnnaBridge 156:ff21514d8981 180 {
AnnaBridge 156:ff21514d8981 181 /* In progress code (>0) */
AnnaBridge 156:ff21514d8981 182 i2cTransferInProgress = 1, /**< Transfer in progress. */
AnnaBridge 156:ff21514d8981 183
AnnaBridge 156:ff21514d8981 184 /* Complete code (=0) */
AnnaBridge 156:ff21514d8981 185 i2cTransferDone = 0, /**< Transfer completed successfully. */
AnnaBridge 156:ff21514d8981 186
AnnaBridge 156:ff21514d8981 187 /* Transfer error codes (<0) */
AnnaBridge 156:ff21514d8981 188 i2cTransferNack = -1, /**< NACK received during transfer. */
AnnaBridge 156:ff21514d8981 189 i2cTransferBusErr = -2, /**< Bus error during transfer (misplaced START/STOP). */
AnnaBridge 156:ff21514d8981 190 i2cTransferArbLost = -3, /**< Arbitration lost during transfer. */
AnnaBridge 156:ff21514d8981 191 i2cTransferUsageFault = -4, /**< Usage fault. */
AnnaBridge 156:ff21514d8981 192 i2cTransferSwFault = -5 /**< SW fault. */
AnnaBridge 156:ff21514d8981 193 } I2C_TransferReturn_TypeDef;
AnnaBridge 156:ff21514d8981 194
AnnaBridge 156:ff21514d8981 195
AnnaBridge 156:ff21514d8981 196 /*******************************************************************************
AnnaBridge 156:ff21514d8981 197 ******************************* STRUCTS ***********************************
AnnaBridge 156:ff21514d8981 198 ******************************************************************************/
AnnaBridge 156:ff21514d8981 199
AnnaBridge 156:ff21514d8981 200 /** I2C initialization structure. */
AnnaBridge 156:ff21514d8981 201 typedef struct
AnnaBridge 156:ff21514d8981 202 {
AnnaBridge 156:ff21514d8981 203 /** Enable I2C peripheral when init completed. */
AnnaBridge 156:ff21514d8981 204 bool enable;
AnnaBridge 156:ff21514d8981 205
AnnaBridge 156:ff21514d8981 206 /** Set to master (true) or slave (false) mode */
AnnaBridge 156:ff21514d8981 207 bool master;
AnnaBridge 156:ff21514d8981 208
AnnaBridge 156:ff21514d8981 209 /**
AnnaBridge 156:ff21514d8981 210 * I2C reference clock assumed when configuring bus frequency setup.
AnnaBridge 156:ff21514d8981 211 * Set it to 0 if currently configurated reference clock shall be used
AnnaBridge 156:ff21514d8981 212 * This parameter is only applicable if operating in master mode.
AnnaBridge 156:ff21514d8981 213 */
AnnaBridge 156:ff21514d8981 214 uint32_t refFreq;
AnnaBridge 156:ff21514d8981 215
AnnaBridge 156:ff21514d8981 216 /**
AnnaBridge 156:ff21514d8981 217 * (Max) I2C bus frequency to use. This parameter is only applicable
AnnaBridge 156:ff21514d8981 218 * if operating in master mode.
AnnaBridge 156:ff21514d8981 219 */
AnnaBridge 156:ff21514d8981 220 uint32_t freq;
AnnaBridge 156:ff21514d8981 221
AnnaBridge 156:ff21514d8981 222 /** Clock low/high ratio control. */
AnnaBridge 156:ff21514d8981 223 I2C_ClockHLR_TypeDef clhr;
AnnaBridge 156:ff21514d8981 224 } I2C_Init_TypeDef;
AnnaBridge 156:ff21514d8981 225
AnnaBridge 156:ff21514d8981 226 /** Suggested default config for I2C init structure. */
AnnaBridge 156:ff21514d8981 227 #define I2C_INIT_DEFAULT \
AnnaBridge 156:ff21514d8981 228 { \
AnnaBridge 156:ff21514d8981 229 true, /* Enable when init done */ \
AnnaBridge 156:ff21514d8981 230 true, /* Set to master mode */ \
AnnaBridge 156:ff21514d8981 231 0, /* Use currently configured reference clock */ \
AnnaBridge 156:ff21514d8981 232 I2C_FREQ_STANDARD_MAX, /* Set to standard rate assuring being */ \
AnnaBridge 156:ff21514d8981 233 /* within I2C spec */ \
AnnaBridge 156:ff21514d8981 234 i2cClockHLRStandard /* Set to use 4:4 low/high duty cycle */ \
AnnaBridge 156:ff21514d8981 235 }
AnnaBridge 156:ff21514d8981 236
AnnaBridge 156:ff21514d8981 237
AnnaBridge 156:ff21514d8981 238 /**
AnnaBridge 156:ff21514d8981 239 * @brief
AnnaBridge 156:ff21514d8981 240 * Master mode transfer message structure used to define a complete
AnnaBridge 156:ff21514d8981 241 * I2C transfer sequence (from start to stop).
AnnaBridge 156:ff21514d8981 242 * @details
AnnaBridge 156:ff21514d8981 243 * The structure allows for defining the following types of sequences,
AnnaBridge 156:ff21514d8981 244 * please refer to defines for sequence details.
AnnaBridge 156:ff21514d8981 245 * @li #I2C_FLAG_READ - data read into buf[0].data
AnnaBridge 156:ff21514d8981 246 * @li #I2C_FLAG_WRITE - data written from buf[0].data
AnnaBridge 156:ff21514d8981 247 * @li #I2C_FLAG_WRITE_READ - data written from buf[0].data and read
AnnaBridge 156:ff21514d8981 248 * into buf[1].data
AnnaBridge 156:ff21514d8981 249 * @li #I2C_FLAG_WRITE_WRITE - data written from buf[0].data and
AnnaBridge 156:ff21514d8981 250 * buf[1].data
AnnaBridge 156:ff21514d8981 251 */
AnnaBridge 156:ff21514d8981 252 typedef struct
AnnaBridge 156:ff21514d8981 253 {
AnnaBridge 156:ff21514d8981 254 /**
AnnaBridge 156:ff21514d8981 255 * @brief
AnnaBridge 156:ff21514d8981 256 * Address to use after (repeated) start.
AnnaBridge 156:ff21514d8981 257 * @details
AnnaBridge 156:ff21514d8981 258 * Layout details, A = address bit, X = don't care bit (set to 0):
AnnaBridge 156:ff21514d8981 259 * @li 7 bit address - use format AAAA AAAX.
AnnaBridge 156:ff21514d8981 260 * @li 10 bit address - use format XXXX XAAX AAAA AAAA
AnnaBridge 156:ff21514d8981 261 */
AnnaBridge 156:ff21514d8981 262 uint16_t addr;
AnnaBridge 156:ff21514d8981 263
AnnaBridge 156:ff21514d8981 264 /** Flags defining sequence type and details, see I2C_FLAG_... defines. */
AnnaBridge 156:ff21514d8981 265 uint16_t flags;
AnnaBridge 156:ff21514d8981 266
AnnaBridge 156:ff21514d8981 267 /**
AnnaBridge 156:ff21514d8981 268 * Buffers used to hold data to send from or receive into depending
AnnaBridge 156:ff21514d8981 269 * on sequence type.
AnnaBridge 156:ff21514d8981 270 */
AnnaBridge 156:ff21514d8981 271 struct
AnnaBridge 156:ff21514d8981 272 {
AnnaBridge 156:ff21514d8981 273 /** Buffer used for data to transmit/receive, must be @p len long. */
AnnaBridge 156:ff21514d8981 274 uint8_t *data;
AnnaBridge 156:ff21514d8981 275
AnnaBridge 156:ff21514d8981 276 /**
AnnaBridge 156:ff21514d8981 277 * Number of bytes in @p data to send or receive. Notice that when
AnnaBridge 156:ff21514d8981 278 * receiving data to this buffer, at least 1 byte must be received.
AnnaBridge 156:ff21514d8981 279 * Setting @p len to 0 in the receive case is considered a usage fault.
AnnaBridge 156:ff21514d8981 280 * Transmitting 0 bytes is legal, in which case only the address
AnnaBridge 156:ff21514d8981 281 * is transmitted after the start condition.
AnnaBridge 156:ff21514d8981 282 */
AnnaBridge 156:ff21514d8981 283 uint16_t len;
AnnaBridge 156:ff21514d8981 284 } buf[2];
AnnaBridge 156:ff21514d8981 285 } I2C_TransferSeq_TypeDef;
AnnaBridge 156:ff21514d8981 286
AnnaBridge 156:ff21514d8981 287
AnnaBridge 156:ff21514d8981 288 /*******************************************************************************
AnnaBridge 156:ff21514d8981 289 ***************************** PROTOTYPES **********************************
AnnaBridge 156:ff21514d8981 290 ******************************************************************************/
AnnaBridge 156:ff21514d8981 291
AnnaBridge 156:ff21514d8981 292 uint32_t I2C_BusFreqGet(I2C_TypeDef *i2c);
AnnaBridge 156:ff21514d8981 293 void I2C_BusFreqSet(I2C_TypeDef *i2c,
AnnaBridge 156:ff21514d8981 294 uint32_t freqRef,
AnnaBridge 156:ff21514d8981 295 uint32_t freqScl,
AnnaBridge 156:ff21514d8981 296 I2C_ClockHLR_TypeDef i2cMode);
AnnaBridge 156:ff21514d8981 297 void I2C_Enable(I2C_TypeDef *i2c, bool enable);
AnnaBridge 156:ff21514d8981 298 void I2C_Init(I2C_TypeDef *i2c, const I2C_Init_TypeDef *init);
AnnaBridge 156:ff21514d8981 299
AnnaBridge 156:ff21514d8981 300 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 301 * @brief
AnnaBridge 156:ff21514d8981 302 * Clear one or more pending I2C interrupts.
AnnaBridge 156:ff21514d8981 303 *
AnnaBridge 156:ff21514d8981 304 * @param[in] i2c
AnnaBridge 156:ff21514d8981 305 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 306 *
AnnaBridge 156:ff21514d8981 307 * @param[in] flags
AnnaBridge 156:ff21514d8981 308 * Pending I2C interrupt source to clear. Use a bitwse logic OR combination of
AnnaBridge 156:ff21514d8981 309 * valid interrupt flags for the I2C module (I2C_IF_nnn).
AnnaBridge 156:ff21514d8981 310 ******************************************************************************/
AnnaBridge 156:ff21514d8981 311 __STATIC_INLINE void I2C_IntClear(I2C_TypeDef *i2c, uint32_t flags)
AnnaBridge 156:ff21514d8981 312 {
AnnaBridge 156:ff21514d8981 313 i2c->IFC = flags;
AnnaBridge 156:ff21514d8981 314 }
AnnaBridge 156:ff21514d8981 315
AnnaBridge 156:ff21514d8981 316
AnnaBridge 156:ff21514d8981 317 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 318 * @brief
AnnaBridge 156:ff21514d8981 319 * Disable one or more I2C interrupts.
AnnaBridge 156:ff21514d8981 320 *
AnnaBridge 156:ff21514d8981 321 * @param[in] i2c
AnnaBridge 156:ff21514d8981 322 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 323 *
AnnaBridge 156:ff21514d8981 324 * @param[in] flags
AnnaBridge 156:ff21514d8981 325 * I2C interrupt sources to disable. Use a bitwise logic OR combination of
AnnaBridge 156:ff21514d8981 326 * valid interrupt flags for the I2C module (I2C_IF_nnn).
AnnaBridge 156:ff21514d8981 327 ******************************************************************************/
AnnaBridge 156:ff21514d8981 328 __STATIC_INLINE void I2C_IntDisable(I2C_TypeDef *i2c, uint32_t flags)
AnnaBridge 156:ff21514d8981 329 {
AnnaBridge 156:ff21514d8981 330 i2c->IEN &= ~(flags);
AnnaBridge 156:ff21514d8981 331 }
AnnaBridge 156:ff21514d8981 332
AnnaBridge 156:ff21514d8981 333
AnnaBridge 156:ff21514d8981 334 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 335 * @brief
AnnaBridge 156:ff21514d8981 336 * Enable one or more I2C interrupts.
AnnaBridge 156:ff21514d8981 337 *
AnnaBridge 156:ff21514d8981 338 * @note
AnnaBridge 156:ff21514d8981 339 * Depending on the use, a pending interrupt may already be set prior to
AnnaBridge 156:ff21514d8981 340 * enabling the interrupt. Consider using I2C_IntClear() prior to enabling
AnnaBridge 156:ff21514d8981 341 * if such a pending interrupt should be ignored.
AnnaBridge 156:ff21514d8981 342 *
AnnaBridge 156:ff21514d8981 343 * @param[in] i2c
AnnaBridge 156:ff21514d8981 344 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 345 *
AnnaBridge 156:ff21514d8981 346 * @param[in] flags
AnnaBridge 156:ff21514d8981 347 * I2C interrupt sources to enable. Use a bitwise logic OR combination of
AnnaBridge 156:ff21514d8981 348 * valid interrupt flags for the I2C module (I2C_IF_nnn).
AnnaBridge 156:ff21514d8981 349 ******************************************************************************/
AnnaBridge 156:ff21514d8981 350 __STATIC_INLINE void I2C_IntEnable(I2C_TypeDef *i2c, uint32_t flags)
AnnaBridge 156:ff21514d8981 351 {
AnnaBridge 156:ff21514d8981 352 i2c->IEN |= flags;
AnnaBridge 156:ff21514d8981 353 }
AnnaBridge 156:ff21514d8981 354
AnnaBridge 156:ff21514d8981 355
AnnaBridge 156:ff21514d8981 356 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 357 * @brief
AnnaBridge 156:ff21514d8981 358 * Get pending I2C interrupt flags.
AnnaBridge 156:ff21514d8981 359 *
AnnaBridge 156:ff21514d8981 360 * @note
AnnaBridge 156:ff21514d8981 361 * The event bits are not cleared by the use of this function.
AnnaBridge 156:ff21514d8981 362 *
AnnaBridge 156:ff21514d8981 363 * @param[in] i2c
AnnaBridge 156:ff21514d8981 364 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 365 *
AnnaBridge 156:ff21514d8981 366 * @return
AnnaBridge 156:ff21514d8981 367 * I2C interrupt sources pending. A bitwise logic OR combination of valid
AnnaBridge 156:ff21514d8981 368 * interrupt flags for the I2C module (I2C_IF_nnn).
AnnaBridge 156:ff21514d8981 369 ******************************************************************************/
AnnaBridge 156:ff21514d8981 370 __STATIC_INLINE uint32_t I2C_IntGet(I2C_TypeDef *i2c)
AnnaBridge 156:ff21514d8981 371 {
AnnaBridge 156:ff21514d8981 372 return i2c->IF;
AnnaBridge 156:ff21514d8981 373 }
AnnaBridge 156:ff21514d8981 374
AnnaBridge 156:ff21514d8981 375
AnnaBridge 156:ff21514d8981 376 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 377 * @brief
AnnaBridge 156:ff21514d8981 378 * Get enabled and pending I2C interrupt flags.
AnnaBridge 156:ff21514d8981 379 * Useful for handling more interrupt sources in the same interrupt handler.
AnnaBridge 156:ff21514d8981 380 *
AnnaBridge 156:ff21514d8981 381 * @note
AnnaBridge 156:ff21514d8981 382 * Interrupt flags are not cleared by the use of this function.
AnnaBridge 156:ff21514d8981 383 *
AnnaBridge 156:ff21514d8981 384 * @param[in] i2c
AnnaBridge 156:ff21514d8981 385 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 386 *
AnnaBridge 156:ff21514d8981 387 * @return
AnnaBridge 156:ff21514d8981 388 * Pending and enabled I2C interrupt sources
AnnaBridge 156:ff21514d8981 389 * The return value is the bitwise AND of
AnnaBridge 156:ff21514d8981 390 * - the enabled interrupt sources in I2Cn_IEN and
AnnaBridge 156:ff21514d8981 391 * - the pending interrupt flags I2Cn_IF
AnnaBridge 156:ff21514d8981 392 ******************************************************************************/
AnnaBridge 156:ff21514d8981 393 __STATIC_INLINE uint32_t I2C_IntGetEnabled(I2C_TypeDef *i2c)
AnnaBridge 156:ff21514d8981 394 {
AnnaBridge 156:ff21514d8981 395 uint32_t ien;
AnnaBridge 156:ff21514d8981 396
AnnaBridge 156:ff21514d8981 397 ien = i2c->IEN;
AnnaBridge 156:ff21514d8981 398 return i2c->IF & ien;
AnnaBridge 156:ff21514d8981 399 }
AnnaBridge 156:ff21514d8981 400
AnnaBridge 156:ff21514d8981 401
AnnaBridge 156:ff21514d8981 402 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 403 * @brief
AnnaBridge 156:ff21514d8981 404 * Set one or more pending I2C interrupts from SW.
AnnaBridge 156:ff21514d8981 405 *
AnnaBridge 156:ff21514d8981 406 * @param[in] i2c
AnnaBridge 156:ff21514d8981 407 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 408 *
AnnaBridge 156:ff21514d8981 409 * @param[in] flags
AnnaBridge 156:ff21514d8981 410 * I2C interrupt sources to set to pending. Use a bitwise logic OR combination
AnnaBridge 156:ff21514d8981 411 * of valid interrupt flags for the I2C module (I2C_IF_nnn).
AnnaBridge 156:ff21514d8981 412 ******************************************************************************/
AnnaBridge 156:ff21514d8981 413 __STATIC_INLINE void I2C_IntSet(I2C_TypeDef *i2c, uint32_t flags)
AnnaBridge 156:ff21514d8981 414 {
AnnaBridge 156:ff21514d8981 415 i2c->IFS = flags;
AnnaBridge 156:ff21514d8981 416 }
AnnaBridge 156:ff21514d8981 417
AnnaBridge 156:ff21514d8981 418 void I2C_Reset(I2C_TypeDef *i2c);
AnnaBridge 156:ff21514d8981 419
AnnaBridge 156:ff21514d8981 420 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 421 * @brief
AnnaBridge 156:ff21514d8981 422 * Get slave address used for I2C peripheral (when operating in slave mode).
AnnaBridge 156:ff21514d8981 423 *
AnnaBridge 156:ff21514d8981 424 * @details
AnnaBridge 156:ff21514d8981 425 * For 10 bit addressing mode, the address is split in two bytes, and only
AnnaBridge 156:ff21514d8981 426 * the first byte setting is fetched, effectively only controlling the 2 most
AnnaBridge 156:ff21514d8981 427 * significant bits of the 10 bit address. Full handling of 10 bit addressing
AnnaBridge 156:ff21514d8981 428 * in slave mode requires additional SW handling.
AnnaBridge 156:ff21514d8981 429 *
AnnaBridge 156:ff21514d8981 430 * @param[in] i2c
AnnaBridge 156:ff21514d8981 431 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 432 *
AnnaBridge 156:ff21514d8981 433 * @return
AnnaBridge 156:ff21514d8981 434 * I2C slave address in use. The 7 most significant bits define the actual
AnnaBridge 156:ff21514d8981 435 * address, the least significant bit is reserved and always returned as 0.
AnnaBridge 156:ff21514d8981 436 ******************************************************************************/
AnnaBridge 156:ff21514d8981 437 __STATIC_INLINE uint8_t I2C_SlaveAddressGet(I2C_TypeDef *i2c)
AnnaBridge 156:ff21514d8981 438 {
AnnaBridge 156:ff21514d8981 439 return ((uint8_t)(i2c->SADDR));
AnnaBridge 156:ff21514d8981 440 }
AnnaBridge 156:ff21514d8981 441
AnnaBridge 156:ff21514d8981 442
AnnaBridge 156:ff21514d8981 443 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 444 * @brief
AnnaBridge 156:ff21514d8981 445 * Set slave address to use for I2C peripheral (when operating in slave mode).
AnnaBridge 156:ff21514d8981 446 *
AnnaBridge 156:ff21514d8981 447 * @details
AnnaBridge 156:ff21514d8981 448 * For 10 bit addressing mode, the address is split in two bytes, and only
AnnaBridge 156:ff21514d8981 449 * the first byte is set, effectively only controlling the 2 most significant
AnnaBridge 156:ff21514d8981 450 * bits of the 10 bit address. Full handling of 10 bit addressing in slave
AnnaBridge 156:ff21514d8981 451 * mode requires additional SW handling.
AnnaBridge 156:ff21514d8981 452 *
AnnaBridge 156:ff21514d8981 453 * @param[in] i2c
AnnaBridge 156:ff21514d8981 454 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 455 *
AnnaBridge 156:ff21514d8981 456 * @param[in] addr
AnnaBridge 156:ff21514d8981 457 * I2C slave address to use. The 7 most significant bits define the actual
AnnaBridge 156:ff21514d8981 458 * address, the least significant bit is reserved and always set to 0.
AnnaBridge 156:ff21514d8981 459 ******************************************************************************/
AnnaBridge 156:ff21514d8981 460 __STATIC_INLINE void I2C_SlaveAddressSet(I2C_TypeDef *i2c, uint8_t addr)
AnnaBridge 156:ff21514d8981 461 {
AnnaBridge 156:ff21514d8981 462 i2c->SADDR = (uint32_t)addr & 0xfe;
AnnaBridge 156:ff21514d8981 463 }
AnnaBridge 156:ff21514d8981 464
AnnaBridge 156:ff21514d8981 465
AnnaBridge 156:ff21514d8981 466 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 467 * @brief
AnnaBridge 156:ff21514d8981 468 * Get slave address mask used for I2C peripheral (when operating in slave
AnnaBridge 156:ff21514d8981 469 * mode).
AnnaBridge 156:ff21514d8981 470 *
AnnaBridge 156:ff21514d8981 471 * @details
AnnaBridge 156:ff21514d8981 472 * The address mask defines how the comparator works. A bit position with
AnnaBridge 156:ff21514d8981 473 * value 0 means that the corresponding slave address bit is ignored during
AnnaBridge 156:ff21514d8981 474 * comparison (don't care). A bit position with value 1 means that the
AnnaBridge 156:ff21514d8981 475 * corresponding slave address bit must match.
AnnaBridge 156:ff21514d8981 476 *
AnnaBridge 156:ff21514d8981 477 * For 10 bit addressing mode, the address is split in two bytes, and only
AnnaBridge 156:ff21514d8981 478 * the mask for the first address byte is fetched, effectively only
AnnaBridge 156:ff21514d8981 479 * controlling the 2 most significant bits of the 10 bit address.
AnnaBridge 156:ff21514d8981 480 *
AnnaBridge 156:ff21514d8981 481 * @param[in] i2c
AnnaBridge 156:ff21514d8981 482 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 483 *
AnnaBridge 156:ff21514d8981 484 * @return
AnnaBridge 156:ff21514d8981 485 * I2C slave address mask in use. The 7 most significant bits define the
AnnaBridge 156:ff21514d8981 486 * actual address mask, the least significant bit is reserved and always
AnnaBridge 156:ff21514d8981 487 * returned as 0.
AnnaBridge 156:ff21514d8981 488 ******************************************************************************/
AnnaBridge 156:ff21514d8981 489 __STATIC_INLINE uint8_t I2C_SlaveAddressMaskGet(I2C_TypeDef *i2c)
AnnaBridge 156:ff21514d8981 490 {
AnnaBridge 156:ff21514d8981 491 return ((uint8_t)(i2c->SADDRMASK));
AnnaBridge 156:ff21514d8981 492 }
AnnaBridge 156:ff21514d8981 493
AnnaBridge 156:ff21514d8981 494
AnnaBridge 156:ff21514d8981 495 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 496 * @brief
AnnaBridge 156:ff21514d8981 497 * Set slave address mask used for I2C peripheral (when operating in slave
AnnaBridge 156:ff21514d8981 498 * mode).
AnnaBridge 156:ff21514d8981 499 *
AnnaBridge 156:ff21514d8981 500 * @details
AnnaBridge 156:ff21514d8981 501 * The address mask defines how the comparator works. A bit position with
AnnaBridge 156:ff21514d8981 502 * value 0 means that the corresponding slave address bit is ignored during
AnnaBridge 156:ff21514d8981 503 * comparison (don't care). A bit position with value 1 means that the
AnnaBridge 156:ff21514d8981 504 * corresponding slave address bit must match.
AnnaBridge 156:ff21514d8981 505 *
AnnaBridge 156:ff21514d8981 506 * For 10 bit addressing mode, the address is split in two bytes, and only
AnnaBridge 156:ff21514d8981 507 * the mask for the first address byte is set, effectively only controlling
AnnaBridge 156:ff21514d8981 508 * the 2 most significant bits of the 10 bit address.
AnnaBridge 156:ff21514d8981 509 *
AnnaBridge 156:ff21514d8981 510 * @param[in] i2c
AnnaBridge 156:ff21514d8981 511 * Pointer to I2C peripheral register block.
AnnaBridge 156:ff21514d8981 512 *
AnnaBridge 156:ff21514d8981 513 * @param[in] mask
AnnaBridge 156:ff21514d8981 514 * I2C slave address mask to use. The 7 most significant bits define the
AnnaBridge 156:ff21514d8981 515 * actual address mask, the least significant bit is reserved and should
AnnaBridge 156:ff21514d8981 516 * be 0.
AnnaBridge 156:ff21514d8981 517 ******************************************************************************/
AnnaBridge 156:ff21514d8981 518 __STATIC_INLINE void I2C_SlaveAddressMaskSet(I2C_TypeDef *i2c, uint8_t mask)
AnnaBridge 156:ff21514d8981 519 {
AnnaBridge 156:ff21514d8981 520 i2c->SADDRMASK = (uint32_t)mask & 0xfe;
AnnaBridge 156:ff21514d8981 521 }
AnnaBridge 156:ff21514d8981 522
AnnaBridge 156:ff21514d8981 523
AnnaBridge 156:ff21514d8981 524 I2C_TransferReturn_TypeDef I2C_Transfer(I2C_TypeDef *i2c);
AnnaBridge 156:ff21514d8981 525 I2C_TransferReturn_TypeDef I2C_TransferInit(I2C_TypeDef *i2c,
AnnaBridge 156:ff21514d8981 526 I2C_TransferSeq_TypeDef *seq);
AnnaBridge 156:ff21514d8981 527
AnnaBridge 156:ff21514d8981 528 /** @} (end addtogroup I2C) */
AnnaBridge 156:ff21514d8981 529 /** @} (end addtogroup emlib) */
AnnaBridge 156:ff21514d8981 530
AnnaBridge 156:ff21514d8981 531 #ifdef __cplusplus
AnnaBridge 156:ff21514d8981 532 }
AnnaBridge 156:ff21514d8981 533 #endif
AnnaBridge 156:ff21514d8981 534
AnnaBridge 156:ff21514d8981 535 #endif /* defined(I2C_COUNT) && (I2C_COUNT > 0) */
AnnaBridge 156:ff21514d8981 536 #endif /* EM_I2C_H */