mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

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

Committer:
mbed_official
Date:
Fri Sep 11 09:30:09 2015 +0100
Revision:
621:9c82b0f79f3d
Parent:
508:4f5903e025e6
Synchronized with git revision 6c1d63e069ab9bd86de92e8296ca783681257538

Full URL: https://github.com/mbedmicro/mbed/commit/6c1d63e069ab9bd86de92e8296ca783681257538/

ignore target files not supported by the yotta module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 508:4f5903e025e6 1 /* mbed Microcontroller Library
mbed_official 508:4f5903e025e6 2 *******************************************************************************
mbed_official 508:4f5903e025e6 3 * Copyright (c) 2014, STMicroelectronics
mbed_official 508:4f5903e025e6 4 * All rights reserved.
mbed_official 508:4f5903e025e6 5 *
mbed_official 508:4f5903e025e6 6 * Redistribution and use in source and binary forms, with or without
mbed_official 508:4f5903e025e6 7 * modification, are permitted provided that the following conditions are met:
mbed_official 508:4f5903e025e6 8 *
mbed_official 508:4f5903e025e6 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 508:4f5903e025e6 10 * this list of conditions and the following disclaimer.
mbed_official 508:4f5903e025e6 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 508:4f5903e025e6 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 508:4f5903e025e6 13 * and/or other materials provided with the distribution.
mbed_official 508:4f5903e025e6 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 508:4f5903e025e6 15 * may be used to endorse or promote products derived from this software
mbed_official 508:4f5903e025e6 16 * without specific prior written permission.
mbed_official 508:4f5903e025e6 17 *
mbed_official 508:4f5903e025e6 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 508:4f5903e025e6 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 508:4f5903e025e6 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 508:4f5903e025e6 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 508:4f5903e025e6 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 508:4f5903e025e6 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 508:4f5903e025e6 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 508:4f5903e025e6 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 508:4f5903e025e6 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 508:4f5903e025e6 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 508:4f5903e025e6 28 *******************************************************************************
mbed_official 508:4f5903e025e6 29 */
mbed_official 508:4f5903e025e6 30 #include "mbed_assert.h"
mbed_official 508:4f5903e025e6 31 #include "i2c_api.h"
mbed_official 508:4f5903e025e6 32
mbed_official 508:4f5903e025e6 33 #if DEVICE_I2C
mbed_official 508:4f5903e025e6 34
mbed_official 508:4f5903e025e6 35 #include "cmsis.h"
mbed_official 508:4f5903e025e6 36 #include "pinmap.h"
mbed_official 508:4f5903e025e6 37 #include "PeripheralPins.h"
mbed_official 508:4f5903e025e6 38
mbed_official 508:4f5903e025e6 39 /* Timeout values for flags and events waiting loops. These timeouts are
mbed_official 508:4f5903e025e6 40 not based on accurate values, they just guarantee that the application will
mbed_official 508:4f5903e025e6 41 not remain stuck if the I2C communication is corrupted. */
mbed_official 508:4f5903e025e6 42 #define FLAG_TIMEOUT ((int)0x4000)
mbed_official 508:4f5903e025e6 43 #define LONG_TIMEOUT ((int)0x8000)
mbed_official 508:4f5903e025e6 44
mbed_official 508:4f5903e025e6 45 I2C_HandleTypeDef I2cHandle;
mbed_official 508:4f5903e025e6 46
mbed_official 508:4f5903e025e6 47 int i2c1_inited = 0;
mbed_official 508:4f5903e025e6 48 int i2c2_inited = 0;
mbed_official 508:4f5903e025e6 49 int i2c3_inited = 0;
mbed_official 508:4f5903e025e6 50
mbed_official 508:4f5903e025e6 51 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
mbed_official 508:4f5903e025e6 52 {
mbed_official 508:4f5903e025e6 53 // Determine the I2C to use
mbed_official 508:4f5903e025e6 54 I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA);
mbed_official 508:4f5903e025e6 55 I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL);
mbed_official 508:4f5903e025e6 56
mbed_official 508:4f5903e025e6 57 obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
mbed_official 508:4f5903e025e6 58 MBED_ASSERT(obj->i2c != (I2CName)NC);
mbed_official 508:4f5903e025e6 59
mbed_official 508:4f5903e025e6 60 // Enable I2C clock and pinout if not done
mbed_official 508:4f5903e025e6 61 if ((obj->i2c == I2C_1) && !i2c1_inited) {
mbed_official 508:4f5903e025e6 62 i2c1_inited = 1;
mbed_official 508:4f5903e025e6 63 __HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK);
mbed_official 508:4f5903e025e6 64 __I2C1_CLK_ENABLE();
mbed_official 508:4f5903e025e6 65 // Configure I2C1 pins
mbed_official 508:4f5903e025e6 66 pinmap_pinout(sda, PinMap_I2C_SDA);
mbed_official 508:4f5903e025e6 67 pinmap_pinout(scl, PinMap_I2C_SCL);
mbed_official 508:4f5903e025e6 68 pin_mode(sda, OpenDrain);
mbed_official 508:4f5903e025e6 69 pin_mode(scl, OpenDrain);
mbed_official 508:4f5903e025e6 70 }
mbed_official 508:4f5903e025e6 71
mbed_official 508:4f5903e025e6 72 #if defined(I2C2_BASE)
mbed_official 508:4f5903e025e6 73 if ((obj->i2c == I2C_2) && !i2c2_inited) {
mbed_official 508:4f5903e025e6 74 i2c2_inited = 1;
mbed_official 508:4f5903e025e6 75 __I2C2_CLK_ENABLE();
mbed_official 508:4f5903e025e6 76 // Configure I2C2 pins
mbed_official 508:4f5903e025e6 77 pinmap_pinout(sda, PinMap_I2C_SDA);
mbed_official 508:4f5903e025e6 78 pinmap_pinout(scl, PinMap_I2C_SCL);
mbed_official 508:4f5903e025e6 79 pin_mode(sda, OpenDrain);
mbed_official 508:4f5903e025e6 80 pin_mode(scl, OpenDrain);
mbed_official 508:4f5903e025e6 81 }
mbed_official 508:4f5903e025e6 82 #endif
mbed_official 508:4f5903e025e6 83
mbed_official 508:4f5903e025e6 84 #if defined(I2C3_BASE)
mbed_official 508:4f5903e025e6 85 if ((obj->i2c == I2C_3) && !i2c3_inited) {
mbed_official 508:4f5903e025e6 86 i2c3_inited = 1;
mbed_official 508:4f5903e025e6 87 __I2C3_CLK_ENABLE();
mbed_official 508:4f5903e025e6 88 // Configure I2C3 pins
mbed_official 508:4f5903e025e6 89 pinmap_pinout(sda, PinMap_I2C_SDA);
mbed_official 508:4f5903e025e6 90 pinmap_pinout(scl, PinMap_I2C_SCL);
mbed_official 508:4f5903e025e6 91 pin_mode(sda, OpenDrain);
mbed_official 508:4f5903e025e6 92 pin_mode(scl, OpenDrain);
mbed_official 508:4f5903e025e6 93 }
mbed_official 508:4f5903e025e6 94 #endif
mbed_official 508:4f5903e025e6 95
mbed_official 508:4f5903e025e6 96 // Reset to clear pending flags if any
mbed_official 508:4f5903e025e6 97 i2c_reset(obj);
mbed_official 508:4f5903e025e6 98
mbed_official 508:4f5903e025e6 99 // I2C configuration
mbed_official 508:4f5903e025e6 100 i2c_frequency(obj, 100000); // 100 kHz per default
mbed_official 508:4f5903e025e6 101 }
mbed_official 508:4f5903e025e6 102
mbed_official 508:4f5903e025e6 103 void i2c_frequency(i2c_t *obj, int hz)
mbed_official 508:4f5903e025e6 104 {
mbed_official 508:4f5903e025e6 105 uint32_t tim = 0;
mbed_official 508:4f5903e025e6 106
mbed_official 508:4f5903e025e6 107 MBED_ASSERT((hz == 100000) || (hz == 400000) || (hz == 1000000));
mbed_official 508:4f5903e025e6 108
mbed_official 508:4f5903e025e6 109 I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 110 int timeout;
mbed_official 508:4f5903e025e6 111
mbed_official 508:4f5903e025e6 112 // wait before init
mbed_official 508:4f5903e025e6 113 timeout = LONG_TIMEOUT;
mbed_official 508:4f5903e025e6 114 while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
mbed_official 508:4f5903e025e6 115
mbed_official 508:4f5903e025e6 116 // Update the SystemCoreClock variable.
mbed_official 508:4f5903e025e6 117 SystemCoreClockUpdate();
mbed_official 508:4f5903e025e6 118
mbed_official 508:4f5903e025e6 119 /*
mbed_official 508:4f5903e025e6 120 Values calculated with I2C_Timing_Configuration_V1.0.1.xls file (see AN4235)
mbed_official 508:4f5903e025e6 121 * Standard mode (up to 100 kHz)
mbed_official 508:4f5903e025e6 122 * Fast Mode (up to 400 kHz)
mbed_official 508:4f5903e025e6 123 * Fast Mode Plus (up to 1 MHz)
mbed_official 508:4f5903e025e6 124 Below values obtained with:
mbed_official 508:4f5903e025e6 125 - I2C clock source = 64 MHz (System Clock w/ HSI) or 72 (System Clock w/ HSE)
mbed_official 508:4f5903e025e6 126 - Analog filter delay = ON
mbed_official 508:4f5903e025e6 127 - Digital filter coefficient = 0
mbed_official 508:4f5903e025e6 128 */
mbed_official 508:4f5903e025e6 129 if (SystemCoreClock == 64000000) {
mbed_official 508:4f5903e025e6 130 switch (hz) {
mbed_official 508:4f5903e025e6 131 case 100000:
mbed_official 508:4f5903e025e6 132 tim = 0x10B17DB4; // Standard mode with Rise time = 120ns, Fall time = 120ns
mbed_official 508:4f5903e025e6 133 break;
mbed_official 508:4f5903e025e6 134 case 400000:
mbed_official 508:4f5903e025e6 135 tim = 0x00E22163; // Fast Mode with Rise time = 120ns, Fall time = 120ns
mbed_official 508:4f5903e025e6 136 break;
mbed_official 508:4f5903e025e6 137 case 1000000:
mbed_official 508:4f5903e025e6 138 tim = 0x00A00D1E; // Fast Mode Plus with Rise time = 120ns, Fall time = 10ns
mbed_official 508:4f5903e025e6 139 break;
mbed_official 508:4f5903e025e6 140 default:
mbed_official 508:4f5903e025e6 141 break;
mbed_official 508:4f5903e025e6 142 }
mbed_official 508:4f5903e025e6 143 } else if (SystemCoreClock == 72000000) {
mbed_official 508:4f5903e025e6 144 switch (hz) {
mbed_official 508:4f5903e025e6 145 case 100000:
mbed_official 508:4f5903e025e6 146 tim = 0x10D28DCB; // Standard mode with Rise time = 120ns, Fall time = 120ns
mbed_official 508:4f5903e025e6 147 break;
mbed_official 508:4f5903e025e6 148 case 400000:
mbed_official 508:4f5903e025e6 149 tim = 0x00F32571; // Fast Mode with Rise time = 120ns, Fall time = 120ns
mbed_official 508:4f5903e025e6 150 break;
mbed_official 508:4f5903e025e6 151 case 1000000:
mbed_official 508:4f5903e025e6 152 tim = 0x00C00D24; // Fast Mode Plus with Rise time = 120ns, Fall time = 10ns
mbed_official 508:4f5903e025e6 153 break;
mbed_official 508:4f5903e025e6 154 default:
mbed_official 508:4f5903e025e6 155 break;
mbed_official 508:4f5903e025e6 156 }
mbed_official 508:4f5903e025e6 157 }
mbed_official 508:4f5903e025e6 158
mbed_official 508:4f5903e025e6 159 // Enable the Fast Mode Plus capability
mbed_official 508:4f5903e025e6 160 if (hz == 1000000) {
mbed_official 508:4f5903e025e6 161 if (obj->i2c == I2C_1) {
mbed_official 508:4f5903e025e6 162 __HAL_SYSCFG_FASTMODEPLUS_ENABLE(HAL_SYSCFG_FASTMODEPLUS_I2C1);
mbed_official 508:4f5903e025e6 163 }
mbed_official 508:4f5903e025e6 164 #if defined(I2C2_BASE)
mbed_official 508:4f5903e025e6 165 if (obj->i2c == I2C_2) {
mbed_official 508:4f5903e025e6 166 __HAL_SYSCFG_FASTMODEPLUS_ENABLE(HAL_SYSCFG_FASTMODEPLUS_I2C2);
mbed_official 508:4f5903e025e6 167 }
mbed_official 508:4f5903e025e6 168 #endif
mbed_official 508:4f5903e025e6 169 #if defined(I2C3_BASE)
mbed_official 508:4f5903e025e6 170 if (obj->i2c == I2C_3) {
mbed_official 508:4f5903e025e6 171 __HAL_SYSCFG_FASTMODEPLUS_ENABLE(HAL_SYSCFG_FASTMODEPLUS_I2C3);
mbed_official 508:4f5903e025e6 172 }
mbed_official 508:4f5903e025e6 173 #endif
mbed_official 508:4f5903e025e6 174 }
mbed_official 508:4f5903e025e6 175
mbed_official 508:4f5903e025e6 176 // I2C configuration
mbed_official 508:4f5903e025e6 177 I2cHandle.Init.Timing = tim;
mbed_official 508:4f5903e025e6 178 I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
mbed_official 508:4f5903e025e6 179 I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
mbed_official 508:4f5903e025e6 180 I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
mbed_official 508:4f5903e025e6 181 I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
mbed_official 508:4f5903e025e6 182 I2cHandle.Init.OwnAddress1 = 0;
mbed_official 508:4f5903e025e6 183 I2cHandle.Init.OwnAddress2 = 0;
mbed_official 508:4f5903e025e6 184 I2cHandle.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
mbed_official 508:4f5903e025e6 185 HAL_I2C_Init(&I2cHandle);
mbed_official 508:4f5903e025e6 186 }
mbed_official 508:4f5903e025e6 187
mbed_official 508:4f5903e025e6 188 inline int i2c_start(i2c_t *obj)
mbed_official 508:4f5903e025e6 189 {
mbed_official 508:4f5903e025e6 190 I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 191 int timeout;
mbed_official 508:4f5903e025e6 192
mbed_official 508:4f5903e025e6 193 I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 194
mbed_official 508:4f5903e025e6 195 // Clear Acknowledge failure flag
mbed_official 508:4f5903e025e6 196 __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_AF);
mbed_official 508:4f5903e025e6 197
mbed_official 508:4f5903e025e6 198 // Generate the START condition
mbed_official 508:4f5903e025e6 199 i2c->CR2 |= I2C_CR2_START;
mbed_official 508:4f5903e025e6 200
mbed_official 508:4f5903e025e6 201 // Wait the START condition has been correctly sent
mbed_official 508:4f5903e025e6 202 timeout = FLAG_TIMEOUT;
mbed_official 508:4f5903e025e6 203 while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == RESET) {
mbed_official 508:4f5903e025e6 204 if ((timeout--) == 0) {
mbed_official 508:4f5903e025e6 205 return 1;
mbed_official 508:4f5903e025e6 206 }
mbed_official 508:4f5903e025e6 207 }
mbed_official 508:4f5903e025e6 208
mbed_official 508:4f5903e025e6 209 return 0;
mbed_official 508:4f5903e025e6 210 }
mbed_official 508:4f5903e025e6 211
mbed_official 508:4f5903e025e6 212 inline int i2c_stop(i2c_t *obj)
mbed_official 508:4f5903e025e6 213 {
mbed_official 508:4f5903e025e6 214 I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 215
mbed_official 508:4f5903e025e6 216 // Generate the STOP condition
mbed_official 508:4f5903e025e6 217 i2c->CR2 |= I2C_CR2_STOP;
mbed_official 508:4f5903e025e6 218
mbed_official 508:4f5903e025e6 219 return 0;
mbed_official 508:4f5903e025e6 220 }
mbed_official 508:4f5903e025e6 221
mbed_official 508:4f5903e025e6 222 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
mbed_official 508:4f5903e025e6 223 {
mbed_official 508:4f5903e025e6 224 I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 225 I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 226 int timeout;
mbed_official 508:4f5903e025e6 227 int count;
mbed_official 508:4f5903e025e6 228 int value;
mbed_official 508:4f5903e025e6 229
mbed_official 508:4f5903e025e6 230 /* update CR2 register */
mbed_official 508:4f5903e025e6 231 i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
mbed_official 508:4f5903e025e6 232 | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_READ);
mbed_official 508:4f5903e025e6 233
mbed_official 508:4f5903e025e6 234 // Read all bytes
mbed_official 508:4f5903e025e6 235 for (count = 0; count < length; count++) {
mbed_official 508:4f5903e025e6 236 value = i2c_byte_read(obj, 0);
mbed_official 508:4f5903e025e6 237 data[count] = (char)value;
mbed_official 508:4f5903e025e6 238 }
mbed_official 508:4f5903e025e6 239
mbed_official 508:4f5903e025e6 240 // Wait transfer complete
mbed_official 508:4f5903e025e6 241 timeout = LONG_TIMEOUT;
mbed_official 508:4f5903e025e6 242 while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TC) == RESET) {
mbed_official 508:4f5903e025e6 243 timeout--;
mbed_official 508:4f5903e025e6 244 if (timeout == 0) {
mbed_official 508:4f5903e025e6 245 return -1;
mbed_official 508:4f5903e025e6 246 }
mbed_official 508:4f5903e025e6 247 }
mbed_official 508:4f5903e025e6 248
mbed_official 508:4f5903e025e6 249 __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_TC);
mbed_official 508:4f5903e025e6 250
mbed_official 508:4f5903e025e6 251 // If not repeated start, send stop.
mbed_official 508:4f5903e025e6 252 if (stop) {
mbed_official 508:4f5903e025e6 253 i2c_stop(obj);
mbed_official 508:4f5903e025e6 254 /* Wait until STOPF flag is set */
mbed_official 508:4f5903e025e6 255 timeout = FLAG_TIMEOUT;
mbed_official 508:4f5903e025e6 256 while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
mbed_official 508:4f5903e025e6 257 timeout--;
mbed_official 508:4f5903e025e6 258 if (timeout == 0) {
mbed_official 508:4f5903e025e6 259 return -1;
mbed_official 508:4f5903e025e6 260 }
mbed_official 508:4f5903e025e6 261 }
mbed_official 508:4f5903e025e6 262 /* Clear STOP Flag */
mbed_official 508:4f5903e025e6 263 __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF);
mbed_official 508:4f5903e025e6 264 }
mbed_official 508:4f5903e025e6 265
mbed_official 508:4f5903e025e6 266 return length;
mbed_official 508:4f5903e025e6 267 }
mbed_official 508:4f5903e025e6 268
mbed_official 508:4f5903e025e6 269 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
mbed_official 508:4f5903e025e6 270 {
mbed_official 508:4f5903e025e6 271 I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 272 I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 273 int timeout;
mbed_official 508:4f5903e025e6 274 int count;
mbed_official 508:4f5903e025e6 275
mbed_official 508:4f5903e025e6 276 /* update CR2 register */
mbed_official 508:4f5903e025e6 277 i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
mbed_official 508:4f5903e025e6 278 | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_WRITE);
mbed_official 508:4f5903e025e6 279
mbed_official 508:4f5903e025e6 280 for (count = 0; count < length; count++) {
mbed_official 508:4f5903e025e6 281 i2c_byte_write(obj, data[count]);
mbed_official 508:4f5903e025e6 282 }
mbed_official 508:4f5903e025e6 283
mbed_official 508:4f5903e025e6 284 // Wait transfer complete
mbed_official 508:4f5903e025e6 285 timeout = FLAG_TIMEOUT;
mbed_official 508:4f5903e025e6 286 while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TC) == RESET) {
mbed_official 508:4f5903e025e6 287 timeout--;
mbed_official 508:4f5903e025e6 288 if (timeout == 0) {
mbed_official 508:4f5903e025e6 289 return -1;
mbed_official 508:4f5903e025e6 290 }
mbed_official 508:4f5903e025e6 291 }
mbed_official 508:4f5903e025e6 292
mbed_official 508:4f5903e025e6 293 __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_TC);
mbed_official 508:4f5903e025e6 294
mbed_official 508:4f5903e025e6 295 // If not repeated start, send stop.
mbed_official 508:4f5903e025e6 296 if (stop) {
mbed_official 508:4f5903e025e6 297 i2c_stop(obj);
mbed_official 508:4f5903e025e6 298 /* Wait until STOPF flag is set */
mbed_official 508:4f5903e025e6 299 timeout = FLAG_TIMEOUT;
mbed_official 508:4f5903e025e6 300 while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
mbed_official 508:4f5903e025e6 301 timeout--;
mbed_official 508:4f5903e025e6 302 if (timeout == 0) {
mbed_official 508:4f5903e025e6 303 return -1;
mbed_official 508:4f5903e025e6 304 }
mbed_official 508:4f5903e025e6 305 }
mbed_official 508:4f5903e025e6 306 /* Clear STOP Flag */
mbed_official 508:4f5903e025e6 307 __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF);
mbed_official 508:4f5903e025e6 308 }
mbed_official 508:4f5903e025e6 309
mbed_official 508:4f5903e025e6 310 return count;
mbed_official 508:4f5903e025e6 311 }
mbed_official 508:4f5903e025e6 312
mbed_official 508:4f5903e025e6 313 int i2c_byte_read(i2c_t *obj, int last)
mbed_official 508:4f5903e025e6 314 {
mbed_official 508:4f5903e025e6 315 I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 316 int timeout;
mbed_official 508:4f5903e025e6 317
mbed_official 508:4f5903e025e6 318 // Wait until the byte is received
mbed_official 508:4f5903e025e6 319 timeout = FLAG_TIMEOUT;
mbed_official 508:4f5903e025e6 320 while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) {
mbed_official 508:4f5903e025e6 321 if ((timeout--) == 0) {
mbed_official 508:4f5903e025e6 322 return -1;
mbed_official 508:4f5903e025e6 323 }
mbed_official 508:4f5903e025e6 324 }
mbed_official 508:4f5903e025e6 325
mbed_official 508:4f5903e025e6 326 return (int)i2c->RXDR;
mbed_official 508:4f5903e025e6 327 }
mbed_official 508:4f5903e025e6 328
mbed_official 508:4f5903e025e6 329 int i2c_byte_write(i2c_t *obj, int data)
mbed_official 508:4f5903e025e6 330 {
mbed_official 508:4f5903e025e6 331 I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 332 int timeout;
mbed_official 508:4f5903e025e6 333
mbed_official 508:4f5903e025e6 334 // Wait until the previous byte is transmitted
mbed_official 508:4f5903e025e6 335 timeout = FLAG_TIMEOUT;
mbed_official 508:4f5903e025e6 336 while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TXIS) == RESET) {
mbed_official 508:4f5903e025e6 337 if ((timeout--) == 0) {
mbed_official 508:4f5903e025e6 338 return 0;
mbed_official 508:4f5903e025e6 339 }
mbed_official 508:4f5903e025e6 340 }
mbed_official 508:4f5903e025e6 341
mbed_official 508:4f5903e025e6 342 i2c->TXDR = (uint8_t)data;
mbed_official 508:4f5903e025e6 343
mbed_official 508:4f5903e025e6 344 return 1;
mbed_official 508:4f5903e025e6 345 }
mbed_official 508:4f5903e025e6 346
mbed_official 508:4f5903e025e6 347 void i2c_reset(i2c_t *obj)
mbed_official 508:4f5903e025e6 348 {
mbed_official 508:4f5903e025e6 349 int timeout;
mbed_official 508:4f5903e025e6 350
mbed_official 508:4f5903e025e6 351 // wait before reset
mbed_official 508:4f5903e025e6 352 timeout = LONG_TIMEOUT;
mbed_official 508:4f5903e025e6 353 while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
mbed_official 508:4f5903e025e6 354
mbed_official 508:4f5903e025e6 355 __I2C1_FORCE_RESET();
mbed_official 508:4f5903e025e6 356 __I2C1_RELEASE_RESET();
mbed_official 508:4f5903e025e6 357 }
mbed_official 508:4f5903e025e6 358
mbed_official 508:4f5903e025e6 359 #if DEVICE_I2CSLAVE
mbed_official 508:4f5903e025e6 360
mbed_official 508:4f5903e025e6 361 void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask)
mbed_official 508:4f5903e025e6 362 {
mbed_official 508:4f5903e025e6 363 I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 364 uint16_t tmpreg;
mbed_official 508:4f5903e025e6 365
mbed_official 508:4f5903e025e6 366 // disable
mbed_official 508:4f5903e025e6 367 i2c->OAR1 &= (uint32_t)(~I2C_OAR1_OA1EN);
mbed_official 508:4f5903e025e6 368 // Get the old register value
mbed_official 508:4f5903e025e6 369 tmpreg = i2c->OAR1;
mbed_official 508:4f5903e025e6 370 // Reset address bits
mbed_official 508:4f5903e025e6 371 tmpreg &= 0xFC00;
mbed_official 508:4f5903e025e6 372 // Set new address
mbed_official 508:4f5903e025e6 373 tmpreg |= (uint16_t)((uint16_t)address & (uint16_t)0x00FE); // 7-bits
mbed_official 508:4f5903e025e6 374 // Store the new register value
mbed_official 508:4f5903e025e6 375 i2c->OAR1 = tmpreg;
mbed_official 508:4f5903e025e6 376 // enable
mbed_official 508:4f5903e025e6 377 i2c->OAR1 |= I2C_OAR1_OA1EN;
mbed_official 508:4f5903e025e6 378 }
mbed_official 508:4f5903e025e6 379
mbed_official 508:4f5903e025e6 380 void i2c_slave_mode(i2c_t *obj, int enable_slave)
mbed_official 508:4f5903e025e6 381 {
mbed_official 508:4f5903e025e6 382
mbed_official 508:4f5903e025e6 383 I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 384 uint16_t tmpreg;
mbed_official 508:4f5903e025e6 385
mbed_official 508:4f5903e025e6 386 // Get the old register value
mbed_official 508:4f5903e025e6 387 tmpreg = i2c->OAR1;
mbed_official 508:4f5903e025e6 388
mbed_official 508:4f5903e025e6 389 // Enable / disable slave
mbed_official 508:4f5903e025e6 390 if (enable_slave == 1) {
mbed_official 508:4f5903e025e6 391 tmpreg |= I2C_OAR1_OA1EN;
mbed_official 508:4f5903e025e6 392 } else {
mbed_official 508:4f5903e025e6 393 tmpreg &= (uint32_t)(~I2C_OAR1_OA1EN);
mbed_official 508:4f5903e025e6 394 }
mbed_official 508:4f5903e025e6 395
mbed_official 508:4f5903e025e6 396 // Set new mode
mbed_official 508:4f5903e025e6 397 i2c->OAR1 = tmpreg;
mbed_official 508:4f5903e025e6 398
mbed_official 508:4f5903e025e6 399 }
mbed_official 508:4f5903e025e6 400
mbed_official 508:4f5903e025e6 401 // See I2CSlave.h
mbed_official 508:4f5903e025e6 402 #define NoData 0 // the slave has not been addressed
mbed_official 508:4f5903e025e6 403 #define ReadAddressed 1 // the master has requested a read from this slave (slave = transmitter)
mbed_official 508:4f5903e025e6 404 #define WriteGeneral 2 // the master is writing to all slave
mbed_official 508:4f5903e025e6 405 #define WriteAddressed 3 // the master is writing to this slave (slave = receiver)
mbed_official 508:4f5903e025e6 406
mbed_official 508:4f5903e025e6 407 int i2c_slave_receive(i2c_t *obj)
mbed_official 508:4f5903e025e6 408 {
mbed_official 508:4f5903e025e6 409 I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 410 int retValue = NoData;
mbed_official 508:4f5903e025e6 411
mbed_official 508:4f5903e025e6 412 if (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == 1) {
mbed_official 508:4f5903e025e6 413 if (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == 1) {
mbed_official 508:4f5903e025e6 414 if (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_DIR) == 1)
mbed_official 508:4f5903e025e6 415 retValue = ReadAddressed;
mbed_official 508:4f5903e025e6 416 else
mbed_official 508:4f5903e025e6 417 retValue = WriteAddressed;
mbed_official 508:4f5903e025e6 418 __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_ADDR);
mbed_official 508:4f5903e025e6 419 }
mbed_official 508:4f5903e025e6 420 }
mbed_official 508:4f5903e025e6 421
mbed_official 508:4f5903e025e6 422 return (retValue);
mbed_official 508:4f5903e025e6 423 }
mbed_official 508:4f5903e025e6 424
mbed_official 508:4f5903e025e6 425 int i2c_slave_read(i2c_t *obj, char *data, int length)
mbed_official 508:4f5903e025e6 426 {
mbed_official 508:4f5903e025e6 427 char size = 0;
mbed_official 508:4f5903e025e6 428
mbed_official 508:4f5903e025e6 429 while (size < length) data[size++] = (char)i2c_byte_read(obj, 0);
mbed_official 508:4f5903e025e6 430
mbed_official 508:4f5903e025e6 431 return size;
mbed_official 508:4f5903e025e6 432 }
mbed_official 508:4f5903e025e6 433
mbed_official 508:4f5903e025e6 434 int i2c_slave_write(i2c_t *obj, const char *data, int length)
mbed_official 508:4f5903e025e6 435 {
mbed_official 508:4f5903e025e6 436 char size = 0;
mbed_official 508:4f5903e025e6 437 I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
mbed_official 508:4f5903e025e6 438
mbed_official 508:4f5903e025e6 439 do {
mbed_official 508:4f5903e025e6 440 i2c_byte_write(obj, data[size]);
mbed_official 508:4f5903e025e6 441 size++;
mbed_official 508:4f5903e025e6 442 } while (size < length);
mbed_official 508:4f5903e025e6 443
mbed_official 508:4f5903e025e6 444 return size;
mbed_official 508:4f5903e025e6 445 }
mbed_official 508:4f5903e025e6 446
mbed_official 508:4f5903e025e6 447
mbed_official 508:4f5903e025e6 448 #endif // DEVICE_I2CSLAVE
mbed_official 508:4f5903e025e6 449
mbed_official 508:4f5903e025e6 450 #endif // DEVICE_I2C