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 Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

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

DISCO_F746NG - Improvements

Who changed what in which revision?

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