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:
Tue Jul 29 19:00:07 2014 +0100
Revision:
268:402bcc0c870b
Parent:
247:135e3186a638
Child:
272:949bd8bf133b
Synchronized with git revision 490d1a6606b3138f165c5edf2f2370ca616587c0

Full URL: https://github.com/mbedmicro/mbed/commit/490d1a6606b3138f165c5edf2f2370ca616587c0/

[LPC1114] Sleep fix + some device.h settings

Who changed what in which revision?

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