The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

Who changed what in which revision?

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