mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 186:707f6e361f3e 1 /* mbed Microcontroller Library
Anna Bridge 186:707f6e361f3e 2 * Copyright (c) 2006-2018 ARM Limited
Anna Bridge 186:707f6e361f3e 3 *
Anna Bridge 186:707f6e361f3e 4 * Licensed under the Apache License, Version 2.0 (the "License");
Anna Bridge 186:707f6e361f3e 5 * you may not use this file except in compliance with the License.
Anna Bridge 186:707f6e361f3e 6 * You may obtain a copy of the License at
Anna Bridge 186:707f6e361f3e 7 *
Anna Bridge 186:707f6e361f3e 8 * http://www.apache.org/licenses/LICENSE-2.0
Anna Bridge 186:707f6e361f3e 9 *
Anna Bridge 186:707f6e361f3e 10 * Unless required by applicable law or agreed to in writing, software
Anna Bridge 186:707f6e361f3e 11 * distributed under the License is distributed on an "AS IS" BASIS,
Anna Bridge 186:707f6e361f3e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Anna Bridge 186:707f6e361f3e 13 * See the License for the specific language governing permissions and
Anna Bridge 186:707f6e361f3e 14 * limitations under the License.
Anna Bridge 186:707f6e361f3e 15 */
Anna Bridge 186:707f6e361f3e 16 #include "i2c_api.h"
Anna Bridge 186:707f6e361f3e 17 #include "cmsis.h"
Anna Bridge 186:707f6e361f3e 18 #include "pinmap.h"
Anna Bridge 186:707f6e361f3e 19 #include "mbed_error.h"
AnnaBridge 189:f392fc9709a3 20 #include "FVP_MPS2.h"
Anna Bridge 186:707f6e361f3e 21 #include "mbed_wait_api.h"
Anna Bridge 186:707f6e361f3e 22 #include "fpga.h"
Anna Bridge 186:707f6e361f3e 23
Anna Bridge 186:707f6e361f3e 24 // Types
Anna Bridge 186:707f6e361f3e 25 #undef FALSE
Anna Bridge 186:707f6e361f3e 26 #undef TRUE
Anna Bridge 186:707f6e361f3e 27 #define FALSE 0
Anna Bridge 186:707f6e361f3e 28 #define TRUE 1
Anna Bridge 186:707f6e361f3e 29
Anna Bridge 186:707f6e361f3e 30 // TSC I2C controller
Anna Bridge 186:707f6e361f3e 31 #define TSC_I2C_ADDR 0x82
Anna Bridge 186:707f6e361f3e 32 // AACI I2C controller I2C address
Anna Bridge 186:707f6e361f3e 33 #define AAIC_I2C_ADDR 0x96
Anna Bridge 186:707f6e361f3e 34
Anna Bridge 186:707f6e361f3e 35 #define TSC_I2C_CID 0x0811
Anna Bridge 186:707f6e361f3e 36
Anna Bridge 186:707f6e361f3e 37 // TSC I2C controller registers
Anna Bridge 186:707f6e361f3e 38 #define TSC_I2C_CRID 0x00
Anna Bridge 186:707f6e361f3e 39
Anna Bridge 186:707f6e361f3e 40
Anna Bridge 186:707f6e361f3e 41 // TSSPCPSR Clock prescale register
Anna Bridge 186:707f6e361f3e 42 #define TSSPCPSR_DFLT 0x0002 // Clock prescale (use with SCR)
Anna Bridge 186:707f6e361f3e 43
Anna Bridge 186:707f6e361f3e 44 // TSC defaults
Anna Bridge 186:707f6e361f3e 45 #define TSC_XOFF 20 // X offset
Anna Bridge 186:707f6e361f3e 46 #define TSC_YOFF 20 // Y offset
Anna Bridge 186:707f6e361f3e 47 #define TSC_MAXVAL 37000 // 0x0FFF * 10 with TSC to LCD scaling
Anna Bridge 186:707f6e361f3e 48
Anna Bridge 186:707f6e361f3e 49 #define TSC_TSU 15 // Setup delay 600nS min
Anna Bridge 186:707f6e361f3e 50 #define AAIC_TSU 25 // Setup delay 1000nS min
Anna Bridge 186:707f6e361f3e 51 #define SHIELD_TSU 25 // Setup delay 1000nS min
Anna Bridge 186:707f6e361f3e 52
Anna Bridge 186:707f6e361f3e 53
Anna Bridge 186:707f6e361f3e 54 static const PinMap PinMap_I2C_SDA[] = {
Anna Bridge 186:707f6e361f3e 55 {TSC_SDA, I2C_0, 0},
Anna Bridge 186:707f6e361f3e 56 {AUD_SDA, I2C_1, 0},
Anna Bridge 186:707f6e361f3e 57 {SHIELD_0_SDA, I2C_2, 0},
Anna Bridge 186:707f6e361f3e 58 {SHIELD_1_SDA, I2C_3, 0},
Anna Bridge 186:707f6e361f3e 59 {NC, NC, 0}
Anna Bridge 186:707f6e361f3e 60 };
Anna Bridge 186:707f6e361f3e 61
Anna Bridge 186:707f6e361f3e 62 static const PinMap PinMap_I2C_SCL[] = {
Anna Bridge 186:707f6e361f3e 63 {TSC_SCL, I2C_0, 0},
Anna Bridge 186:707f6e361f3e 64 {AUD_SCL, I2C_1, 0},
Anna Bridge 186:707f6e361f3e 65 {SHIELD_0_SCL, I2C_2, 0},
Anna Bridge 186:707f6e361f3e 66 {SHIELD_1_SCL, I2C_3, 0},
Anna Bridge 186:707f6e361f3e 67 {NC, NC, 0}
Anna Bridge 186:707f6e361f3e 68 };
Anna Bridge 186:707f6e361f3e 69
Anna Bridge 186:707f6e361f3e 70 static inline void i2c_send_byte(i2c_t *obj, unsigned char c)
Anna Bridge 186:707f6e361f3e 71 {
Anna Bridge 186:707f6e361f3e 72 int loop;
Anna Bridge 186:707f6e361f3e 73 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 74 case I2C_0:
Anna Bridge 186:707f6e361f3e 75 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 76 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 77
Anna Bridge 186:707f6e361f3e 78 for (loop = 0; loop < 8; loop++) {
Anna Bridge 186:707f6e361f3e 79 if (c & (1 << (7 - loop))) {
Anna Bridge 186:707f6e361f3e 80 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 81 } else {
Anna Bridge 186:707f6e361f3e 82 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 83 }
Anna Bridge 186:707f6e361f3e 84
Anna Bridge 186:707f6e361f3e 85 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 86 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 87 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 88 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 89 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 90 }
Anna Bridge 186:707f6e361f3e 91
Anna Bridge 186:707f6e361f3e 92 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 93 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 94 break;
Anna Bridge 186:707f6e361f3e 95 case I2C_1:
Anna Bridge 186:707f6e361f3e 96 for (loop = 0; loop < 8; loop++) {
Anna Bridge 186:707f6e361f3e 97 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 98 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 99 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 100 if (c & (1 << (7 - loop))) {
Anna Bridge 186:707f6e361f3e 101 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 102 } else {
Anna Bridge 186:707f6e361f3e 103 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 104 }
Anna Bridge 186:707f6e361f3e 105
Anna Bridge 186:707f6e361f3e 106 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 107 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 108 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 109 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 110 }
Anna Bridge 186:707f6e361f3e 111
Anna Bridge 186:707f6e361f3e 112 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 113 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 114 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 115 break;
Anna Bridge 186:707f6e361f3e 116 case I2C_2:
Anna Bridge 186:707f6e361f3e 117 case I2C_3:
Anna Bridge 186:707f6e361f3e 118 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 119 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 120
Anna Bridge 186:707f6e361f3e 121 for (loop = 0; loop < 8; loop++) {
Anna Bridge 186:707f6e361f3e 122 if (c & (1 << (7 - loop))) {
Anna Bridge 186:707f6e361f3e 123 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 124 } else {
Anna Bridge 186:707f6e361f3e 125 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 126 }
Anna Bridge 186:707f6e361f3e 127
Anna Bridge 186:707f6e361f3e 128 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 129 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 130 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 131 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 132 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 133 }
Anna Bridge 186:707f6e361f3e 134
Anna Bridge 186:707f6e361f3e 135 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 136 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 137 break;
Anna Bridge 186:707f6e361f3e 138 }
Anna Bridge 186:707f6e361f3e 139 }
Anna Bridge 186:707f6e361f3e 140
Anna Bridge 186:707f6e361f3e 141 static inline unsigned char i2c_receive_byte(i2c_t *obj)
Anna Bridge 186:707f6e361f3e 142 {
Anna Bridge 186:707f6e361f3e 143 int data_receive_byte, loop;
Anna Bridge 186:707f6e361f3e 144 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 145 case I2C_0:
Anna Bridge 186:707f6e361f3e 146 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 147 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 148
Anna Bridge 186:707f6e361f3e 149 data_receive_byte = 0;
Anna Bridge 186:707f6e361f3e 150
Anna Bridge 186:707f6e361f3e 151 for (loop = 0; loop < 8; loop++) {
Anna Bridge 186:707f6e361f3e 152 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 153 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 154 if ((obj->i2c->CONTROL & SDA)) {
Anna Bridge 186:707f6e361f3e 155 data_receive_byte += (1 << (7 - loop));
Anna Bridge 186:707f6e361f3e 156 }
Anna Bridge 186:707f6e361f3e 157
Anna Bridge 186:707f6e361f3e 158 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 159 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 160 }
Anna Bridge 186:707f6e361f3e 161
Anna Bridge 186:707f6e361f3e 162 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 163 i2c_delay(TSC_TSU);
Anna Bridge 186:707f6e361f3e 164 break;
Anna Bridge 186:707f6e361f3e 165 case I2C_1:
Anna Bridge 186:707f6e361f3e 166 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 167 data_receive_byte = 0;
Anna Bridge 186:707f6e361f3e 168
Anna Bridge 186:707f6e361f3e 169 for (loop = 0; loop < 8; loop++) {
Anna Bridge 186:707f6e361f3e 170 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 171 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 172 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 173 obj->i2c->CONTROLS = SCL | SDA;
Anna Bridge 186:707f6e361f3e 174 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 175 if ((obj->i2c->CONTROL & SDA)) {
Anna Bridge 186:707f6e361f3e 176 data_receive_byte += (1 << (7 - loop));
Anna Bridge 186:707f6e361f3e 177 }
Anna Bridge 186:707f6e361f3e 178
Anna Bridge 186:707f6e361f3e 179 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 180 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 181 }
Anna Bridge 186:707f6e361f3e 182
Anna Bridge 186:707f6e361f3e 183 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 184 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 185 i2c_delay(AAIC_TSU);
Anna Bridge 186:707f6e361f3e 186 break;
Anna Bridge 186:707f6e361f3e 187 case I2C_2:
Anna Bridge 186:707f6e361f3e 188 case I2C_3:
Anna Bridge 186:707f6e361f3e 189 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 190 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 191
Anna Bridge 186:707f6e361f3e 192 data_receive_byte = 0;
Anna Bridge 186:707f6e361f3e 193
Anna Bridge 186:707f6e361f3e 194 for (loop = 0; loop < 8; loop++) {
Anna Bridge 186:707f6e361f3e 195 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 196 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 197 if ((obj->i2c->CONTROL & SDA)) {
Anna Bridge 186:707f6e361f3e 198 data_receive_byte += (1 << (7 - loop));
Anna Bridge 186:707f6e361f3e 199 }
Anna Bridge 186:707f6e361f3e 200
Anna Bridge 186:707f6e361f3e 201 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 202 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 203 }
Anna Bridge 186:707f6e361f3e 204
Anna Bridge 186:707f6e361f3e 205 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 206 i2c_delay(SHIELD_TSU);
Anna Bridge 186:707f6e361f3e 207 break;
Anna Bridge 186:707f6e361f3e 208 }
Anna Bridge 186:707f6e361f3e 209 return data_receive_byte;
Anna Bridge 186:707f6e361f3e 210 }
Anna Bridge 186:707f6e361f3e 211
Anna Bridge 186:707f6e361f3e 212 static inline int i2c_receive_ack(i2c_t *obj)
Anna Bridge 186:707f6e361f3e 213 {
Anna Bridge 186:707f6e361f3e 214 int nack;
Anna Bridge 186:707f6e361f3e 215 int delay_value;
Anna Bridge 186:707f6e361f3e 216 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 217 case I2C_0:
Anna Bridge 186:707f6e361f3e 218 delay_value = TSC_TSU;
Anna Bridge 186:707f6e361f3e 219 break;
Anna Bridge 186:707f6e361f3e 220 case I2C_1:
Anna Bridge 186:707f6e361f3e 221 delay_value = AAIC_TSU;
Anna Bridge 186:707f6e361f3e 222 break;
Anna Bridge 186:707f6e361f3e 223 case I2C_2:
Anna Bridge 186:707f6e361f3e 224 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 225 break;
Anna Bridge 186:707f6e361f3e 226 case I2C_3:
Anna Bridge 186:707f6e361f3e 227 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 228 break;
Anna Bridge 186:707f6e361f3e 229 }
Anna Bridge 186:707f6e361f3e 230
Anna Bridge 186:707f6e361f3e 231 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 232 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 233 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 234 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 235 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 236 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 237 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 238 nack = obj->i2c->CONTROL & SDA;
Anna Bridge 186:707f6e361f3e 239 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 240 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 241 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 242 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 243 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 244 if (nack == 0) {
Anna Bridge 186:707f6e361f3e 245 return 1;
Anna Bridge 186:707f6e361f3e 246 }
Anna Bridge 186:707f6e361f3e 247
Anna Bridge 186:707f6e361f3e 248 return 0;
Anna Bridge 186:707f6e361f3e 249 }
Anna Bridge 186:707f6e361f3e 250
Anna Bridge 186:707f6e361f3e 251
Anna Bridge 186:707f6e361f3e 252 static inline void i2c_send_nack(i2c_t *obj)
Anna Bridge 186:707f6e361f3e 253 {
Anna Bridge 186:707f6e361f3e 254 int delay_value;
Anna Bridge 186:707f6e361f3e 255 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 256 case I2C_0:
Anna Bridge 186:707f6e361f3e 257 delay_value = TSC_TSU;
Anna Bridge 186:707f6e361f3e 258 break;
Anna Bridge 186:707f6e361f3e 259 case I2C_1:
Anna Bridge 186:707f6e361f3e 260 delay_value = AAIC_TSU;
Anna Bridge 186:707f6e361f3e 261 break;
Anna Bridge 186:707f6e361f3e 262 case I2C_2:
Anna Bridge 186:707f6e361f3e 263 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 264 break;
Anna Bridge 186:707f6e361f3e 265 case I2C_3:
Anna Bridge 186:707f6e361f3e 266 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 267 break;
Anna Bridge 186:707f6e361f3e 268 }
Anna Bridge 186:707f6e361f3e 269
Anna Bridge 186:707f6e361f3e 270 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 271 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 272 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 273 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 274 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 275 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 276 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 277 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 278 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 279 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 280 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 281
Anna Bridge 186:707f6e361f3e 282 }
Anna Bridge 186:707f6e361f3e 283
Anna Bridge 186:707f6e361f3e 284 static inline void i2c_send_ack(i2c_t *obj)
Anna Bridge 186:707f6e361f3e 285 {
Anna Bridge 186:707f6e361f3e 286 int delay_value;
Anna Bridge 186:707f6e361f3e 287 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 288 case I2C_0:
Anna Bridge 186:707f6e361f3e 289 delay_value = TSC_TSU;
Anna Bridge 186:707f6e361f3e 290 break;
Anna Bridge 186:707f6e361f3e 291 case I2C_1:
Anna Bridge 186:707f6e361f3e 292 delay_value = AAIC_TSU;
Anna Bridge 186:707f6e361f3e 293 break;
Anna Bridge 186:707f6e361f3e 294 case I2C_2:
Anna Bridge 186:707f6e361f3e 295 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 296 break;
Anna Bridge 186:707f6e361f3e 297 case I2C_3:
Anna Bridge 186:707f6e361f3e 298 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 299 break;
Anna Bridge 186:707f6e361f3e 300 }
Anna Bridge 186:707f6e361f3e 301
Anna Bridge 186:707f6e361f3e 302 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 303 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 304 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 305 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 306 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 307 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 308 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 309
Anna Bridge 186:707f6e361f3e 310 }
Anna Bridge 186:707f6e361f3e 311
Anna Bridge 186:707f6e361f3e 312 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
Anna Bridge 186:707f6e361f3e 313 {
Anna Bridge 186:707f6e361f3e 314 // determine the SPI to use
Anna Bridge 186:707f6e361f3e 315 I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA);
Anna Bridge 186:707f6e361f3e 316 I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL);
Anna Bridge 186:707f6e361f3e 317 obj->i2c = (MPS2_I2C_TypeDef *)pinmap_merge(i2c_sda, i2c_scl);
Anna Bridge 186:707f6e361f3e 318
Anna Bridge 186:707f6e361f3e 319 if ((int)obj->i2c == NC) {
Anna Bridge 186:707f6e361f3e 320 error("I2C pin mapping failed");
Anna Bridge 186:707f6e361f3e 321 }
Anna Bridge 186:707f6e361f3e 322
Anna Bridge 186:707f6e361f3e 323 pinmap_pinout(sda, PinMap_I2C_SDA);
Anna Bridge 186:707f6e361f3e 324 pinmap_pinout(scl, PinMap_I2C_SCL);
Anna Bridge 186:707f6e361f3e 325
Anna Bridge 186:707f6e361f3e 326 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 327 case I2C_2:
Anna Bridge 186:707f6e361f3e 328 CMSDK_GPIO0->ALTFUNCSET |= 0x8020;
Anna Bridge 186:707f6e361f3e 329 break;
Anna Bridge 186:707f6e361f3e 330 case I2C_3:
Anna Bridge 186:707f6e361f3e 331 CMSDK_GPIO1->ALTFUNCSET |= 0x8000;
Anna Bridge 186:707f6e361f3e 332 CMSDK_GPIO2->ALTFUNCSET |= 0x0200;
Anna Bridge 186:707f6e361f3e 333 break;
Anna Bridge 186:707f6e361f3e 334 }
Anna Bridge 186:707f6e361f3e 335
Anna Bridge 186:707f6e361f3e 336
Anna Bridge 186:707f6e361f3e 337 }
Anna Bridge 186:707f6e361f3e 338
Anna Bridge 186:707f6e361f3e 339 int i2c_start(i2c_t *obj)
Anna Bridge 186:707f6e361f3e 340 {
Anna Bridge 186:707f6e361f3e 341 int delay_value;
Anna Bridge 186:707f6e361f3e 342 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 343 case I2C_0:
Anna Bridge 186:707f6e361f3e 344 delay_value = TSC_TSU;
Anna Bridge 186:707f6e361f3e 345 break;
Anna Bridge 186:707f6e361f3e 346 case I2C_1:
Anna Bridge 186:707f6e361f3e 347 delay_value = AAIC_TSU;
Anna Bridge 186:707f6e361f3e 348 break;
Anna Bridge 186:707f6e361f3e 349 case I2C_2:
Anna Bridge 186:707f6e361f3e 350 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 351 break;
Anna Bridge 186:707f6e361f3e 352 case I2C_3:
Anna Bridge 186:707f6e361f3e 353 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 354 break;
Anna Bridge 186:707f6e361f3e 355 }
Anna Bridge 186:707f6e361f3e 356
Anna Bridge 186:707f6e361f3e 357 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 358 obj->i2c->CONTROLS = SDA | SCL;
Anna Bridge 186:707f6e361f3e 359 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 360 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 361 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 362
Anna Bridge 186:707f6e361f3e 363 return 0;
Anna Bridge 186:707f6e361f3e 364 }
Anna Bridge 186:707f6e361f3e 365
Anna Bridge 186:707f6e361f3e 366 int i2c_start_tsc(i2c_t *obj)
Anna Bridge 186:707f6e361f3e 367 {
Anna Bridge 186:707f6e361f3e 368 int delay_value;
Anna Bridge 186:707f6e361f3e 369 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 370 case I2C_0:
Anna Bridge 186:707f6e361f3e 371 delay_value = TSC_TSU;
Anna Bridge 186:707f6e361f3e 372 break;
Anna Bridge 186:707f6e361f3e 373 case I2C_1:
Anna Bridge 186:707f6e361f3e 374 delay_value = AAIC_TSU;
Anna Bridge 186:707f6e361f3e 375 break;
Anna Bridge 186:707f6e361f3e 376 case I2C_2:
Anna Bridge 186:707f6e361f3e 377 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 378 break;
Anna Bridge 186:707f6e361f3e 379 case I2C_3:
Anna Bridge 186:707f6e361f3e 380 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 381 break;
Anna Bridge 186:707f6e361f3e 382 }
Anna Bridge 186:707f6e361f3e 383
Anna Bridge 186:707f6e361f3e 384 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 385 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 386 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 387 obj->i2c->CONTROLC = SCL;
Anna Bridge 186:707f6e361f3e 388 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 389
Anna Bridge 186:707f6e361f3e 390 return 0;
Anna Bridge 186:707f6e361f3e 391 }
Anna Bridge 186:707f6e361f3e 392
Anna Bridge 186:707f6e361f3e 393 int i2c_stop(i2c_t *obj)
Anna Bridge 186:707f6e361f3e 394 {
Anna Bridge 186:707f6e361f3e 395 int delay_value;
Anna Bridge 186:707f6e361f3e 396 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 397 case I2C_0:
Anna Bridge 186:707f6e361f3e 398 delay_value = TSC_TSU;
Anna Bridge 186:707f6e361f3e 399 break;
Anna Bridge 186:707f6e361f3e 400 case I2C_1:
Anna Bridge 186:707f6e361f3e 401 delay_value = AAIC_TSU;
Anna Bridge 186:707f6e361f3e 402 break;
Anna Bridge 186:707f6e361f3e 403 case I2C_2:
Anna Bridge 186:707f6e361f3e 404 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 405 break;
Anna Bridge 186:707f6e361f3e 406 case I2C_3:
Anna Bridge 186:707f6e361f3e 407 delay_value = SHIELD_TSU;
Anna Bridge 186:707f6e361f3e 408 break;
Anna Bridge 186:707f6e361f3e 409 }
Anna Bridge 186:707f6e361f3e 410 // Actual stop bit
Anna Bridge 186:707f6e361f3e 411 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 412 obj->i2c->CONTROLC = SDA;
Anna Bridge 186:707f6e361f3e 413 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 414 obj->i2c->CONTROLS = SCL;
Anna Bridge 186:707f6e361f3e 415 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 416 obj->i2c->CONTROLS = SDA;
Anna Bridge 186:707f6e361f3e 417 i2c_delay(delay_value);
Anna Bridge 186:707f6e361f3e 418
Anna Bridge 186:707f6e361f3e 419 return 0;
Anna Bridge 186:707f6e361f3e 420 }
Anna Bridge 186:707f6e361f3e 421
Anna Bridge 186:707f6e361f3e 422
Anna Bridge 186:707f6e361f3e 423
Anna Bridge 186:707f6e361f3e 424 void i2c_frequency(i2c_t *obj, int hz)
Anna Bridge 186:707f6e361f3e 425 {
Anna Bridge 186:707f6e361f3e 426 }
Anna Bridge 186:707f6e361f3e 427
Anna Bridge 186:707f6e361f3e 428 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
Anna Bridge 186:707f6e361f3e 429 {
Anna Bridge 186:707f6e361f3e 430 unsigned int loop, rxdata;
Anna Bridge 186:707f6e361f3e 431 int sadr, ack, bytes_read;
Anna Bridge 186:707f6e361f3e 432 rxdata = 0;
Anna Bridge 186:707f6e361f3e 433 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 434 case I2C_0:
Anna Bridge 186:707f6e361f3e 435 sadr = TSC_I2C_ADDR;
Anna Bridge 186:707f6e361f3e 436 break;
Anna Bridge 186:707f6e361f3e 437 case I2C_1:
Anna Bridge 186:707f6e361f3e 438 sadr = AAIC_I2C_ADDR;
Anna Bridge 186:707f6e361f3e 439 break;
Anna Bridge 186:707f6e361f3e 440 case I2C_2:
Anna Bridge 186:707f6e361f3e 441 case I2C_3:
Anna Bridge 186:707f6e361f3e 442 sadr = address; //LM75_I2C_ADDR; or MMA7660_I2C_ADDR;
Anna Bridge 186:707f6e361f3e 443 break;
Anna Bridge 186:707f6e361f3e 444 }
Anna Bridge 186:707f6e361f3e 445 bytes_read = 0;
Anna Bridge 186:707f6e361f3e 446 // Start bit
Anna Bridge 186:707f6e361f3e 447 i2c_start(obj);
Anna Bridge 186:707f6e361f3e 448
Anna Bridge 186:707f6e361f3e 449 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 450 case I2C_0:
Anna Bridge 186:707f6e361f3e 451 // Set serial and register address
Anna Bridge 186:707f6e361f3e 452 i2c_send_byte(obj, sadr);
Anna Bridge 186:707f6e361f3e 453 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 454 i2c_send_byte(obj, address);
Anna Bridge 186:707f6e361f3e 455 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 456
Anna Bridge 186:707f6e361f3e 457 // Stop bit
Anna Bridge 186:707f6e361f3e 458 i2c_stop(obj);
Anna Bridge 186:707f6e361f3e 459
Anna Bridge 186:707f6e361f3e 460 // Start bit
Anna Bridge 186:707f6e361f3e 461 i2c_start_tsc(obj);
Anna Bridge 186:707f6e361f3e 462
Anna Bridge 186:707f6e361f3e 463 // Read from I2C address
Anna Bridge 186:707f6e361f3e 464 i2c_send_byte(obj, sadr | 1);
Anna Bridge 186:707f6e361f3e 465 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 466
Anna Bridge 186:707f6e361f3e 467 rxdata = (i2c_receive_byte(obj) & 0xFF);
Anna Bridge 186:707f6e361f3e 468 data[((length - 1) - bytes_read)] = (char)rxdata;
Anna Bridge 186:707f6e361f3e 469 bytes_read++;
Anna Bridge 186:707f6e361f3e 470 // Read multiple bytes
Anna Bridge 186:707f6e361f3e 471 if ((length > 1) && (length < 5)) {
Anna Bridge 186:707f6e361f3e 472 for (loop = 1; loop <= (length - 1); loop++) {
Anna Bridge 186:707f6e361f3e 473 // Send ACK
Anna Bridge 186:707f6e361f3e 474 i2c_send_ack(obj);
Anna Bridge 186:707f6e361f3e 475
Anna Bridge 186:707f6e361f3e 476 // Next byte
Anna Bridge 186:707f6e361f3e 477 //rxdata = ((rxdata << 8) & 0xFFFFFF00);
Anna Bridge 186:707f6e361f3e 478 //rxdata |= (i2c_receive_byte(obj) & 0xFF);
Anna Bridge 186:707f6e361f3e 479 rxdata = i2c_receive_byte(obj);
Anna Bridge 186:707f6e361f3e 480 data[(length - 1) - bytes_read] = (char)rxdata;
Anna Bridge 186:707f6e361f3e 481 bytes_read++;
Anna Bridge 186:707f6e361f3e 482
Anna Bridge 186:707f6e361f3e 483 }
Anna Bridge 186:707f6e361f3e 484 }
Anna Bridge 186:707f6e361f3e 485 break;
Anna Bridge 186:707f6e361f3e 486 case I2C_1:
Anna Bridge 186:707f6e361f3e 487 // Set serial and register address
Anna Bridge 186:707f6e361f3e 488 i2c_send_byte(obj, sadr);
Anna Bridge 186:707f6e361f3e 489 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 490 i2c_send_byte(obj, address);
Anna Bridge 186:707f6e361f3e 491 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 492
Anna Bridge 186:707f6e361f3e 493 // Stop bit
Anna Bridge 186:707f6e361f3e 494 i2c_stop(obj);
Anna Bridge 186:707f6e361f3e 495
Anna Bridge 186:707f6e361f3e 496 // Start bit
Anna Bridge 186:707f6e361f3e 497 i2c_start_tsc(obj);
Anna Bridge 186:707f6e361f3e 498 // Fall through to read data
Anna Bridge 186:707f6e361f3e 499 case I2C_2:
Anna Bridge 186:707f6e361f3e 500 case I2C_3:
Anna Bridge 186:707f6e361f3e 501 // Read from preset register address pointer
Anna Bridge 186:707f6e361f3e 502 i2c_send_byte(obj, sadr | 1);
Anna Bridge 186:707f6e361f3e 503 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 504
Anna Bridge 186:707f6e361f3e 505 rxdata = i2c_receive_byte(obj);
Anna Bridge 186:707f6e361f3e 506 data[bytes_read] = (char)rxdata;
Anna Bridge 186:707f6e361f3e 507 bytes_read++;
Anna Bridge 186:707f6e361f3e 508 // Read multiple bytes
Anna Bridge 186:707f6e361f3e 509 if ((length > 1) && (length < 5)) {
Anna Bridge 186:707f6e361f3e 510 for (loop = 1; loop <= (length - 1); loop++) {
Anna Bridge 186:707f6e361f3e 511 // Send ACK
Anna Bridge 186:707f6e361f3e 512 i2c_send_ack(obj);
Anna Bridge 186:707f6e361f3e 513
Anna Bridge 186:707f6e361f3e 514 // Next byte
Anna Bridge 186:707f6e361f3e 515 rxdata = i2c_receive_byte(obj);
Anna Bridge 186:707f6e361f3e 516 data[loop] = (char)rxdata;
Anna Bridge 186:707f6e361f3e 517 bytes_read++;
Anna Bridge 186:707f6e361f3e 518
Anna Bridge 186:707f6e361f3e 519 }
Anna Bridge 186:707f6e361f3e 520 }
Anna Bridge 186:707f6e361f3e 521 break;
Anna Bridge 186:707f6e361f3e 522 }
Anna Bridge 186:707f6e361f3e 523 i2c_send_nack(obj);
Anna Bridge 186:707f6e361f3e 524
Anna Bridge 186:707f6e361f3e 525 i2c_stop(obj); // Actual stop bit
Anna Bridge 186:707f6e361f3e 526
Anna Bridge 186:707f6e361f3e 527 return bytes_read;
Anna Bridge 186:707f6e361f3e 528 }
Anna Bridge 186:707f6e361f3e 529
Anna Bridge 186:707f6e361f3e 530 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
Anna Bridge 186:707f6e361f3e 531 {
Anna Bridge 186:707f6e361f3e 532 int ack = 0;
Anna Bridge 186:707f6e361f3e 533 int sadr;
Anna Bridge 186:707f6e361f3e 534 char *ptr;
Anna Bridge 186:707f6e361f3e 535 char addr;
Anna Bridge 186:707f6e361f3e 536 ptr = (char *)data;
Anna Bridge 186:707f6e361f3e 537 switch ((int)obj->i2c) {
Anna Bridge 186:707f6e361f3e 538 case I2C_0:
Anna Bridge 186:707f6e361f3e 539 sadr = TSC_I2C_ADDR;
Anna Bridge 186:707f6e361f3e 540 addr = address;
Anna Bridge 186:707f6e361f3e 541 break;
Anna Bridge 186:707f6e361f3e 542 case I2C_1:
Anna Bridge 186:707f6e361f3e 543 sadr = AAIC_I2C_ADDR;
Anna Bridge 186:707f6e361f3e 544 addr = address;
Anna Bridge 186:707f6e361f3e 545 break;
Anna Bridge 186:707f6e361f3e 546 case I2C_2:
Anna Bridge 186:707f6e361f3e 547 case I2C_3:
Anna Bridge 186:707f6e361f3e 548 sadr = address; //LM75_I2C_ADDR or MMA7660_I2C_ADDR;
Anna Bridge 186:707f6e361f3e 549 addr = *ptr++;
Anna Bridge 186:707f6e361f3e 550 break;
Anna Bridge 186:707f6e361f3e 551 }
Anna Bridge 186:707f6e361f3e 552
Anna Bridge 186:707f6e361f3e 553 // printf("adr = %x, reg = %x\n",sadr, address);
Anna Bridge 186:707f6e361f3e 554 i2c_start(obj);
Anna Bridge 186:707f6e361f3e 555
Anna Bridge 186:707f6e361f3e 556 // Set serial and register address
Anna Bridge 186:707f6e361f3e 557 i2c_send_byte(obj, sadr);
Anna Bridge 186:707f6e361f3e 558 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 559 i2c_send_byte(obj, addr);
Anna Bridge 186:707f6e361f3e 560 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 561
Anna Bridge 186:707f6e361f3e 562 for (int i = 1; i < length; i++) {
Anna Bridge 186:707f6e361f3e 563 i2c_send_byte(obj, *ptr++);
Anna Bridge 186:707f6e361f3e 564 ack += i2c_receive_ack(obj);
Anna Bridge 186:707f6e361f3e 565 }
Anna Bridge 186:707f6e361f3e 566
Anna Bridge 186:707f6e361f3e 567 i2c_stop(obj);
Anna Bridge 186:707f6e361f3e 568 if (ack == 3) {
Anna Bridge 186:707f6e361f3e 569 return 1;
Anna Bridge 186:707f6e361f3e 570 } else {
Anna Bridge 186:707f6e361f3e 571 return 0;
Anna Bridge 186:707f6e361f3e 572 }
Anna Bridge 186:707f6e361f3e 573
Anna Bridge 186:707f6e361f3e 574 }
Anna Bridge 186:707f6e361f3e 575
Anna Bridge 186:707f6e361f3e 576 void i2c_reset(i2c_t *obj)
Anna Bridge 186:707f6e361f3e 577 {
Anna Bridge 186:707f6e361f3e 578 i2c_stop(obj);
Anna Bridge 186:707f6e361f3e 579 }
Anna Bridge 186:707f6e361f3e 580
Anna Bridge 186:707f6e361f3e 581 int i2c_byte_read(i2c_t *obj, int last)
Anna Bridge 186:707f6e361f3e 582 {
Anna Bridge 186:707f6e361f3e 583 return 0;
Anna Bridge 186:707f6e361f3e 584 }
Anna Bridge 186:707f6e361f3e 585
Anna Bridge 186:707f6e361f3e 586 int i2c_byte_write(i2c_t *obj, int data)
Anna Bridge 186:707f6e361f3e 587 {
Anna Bridge 186:707f6e361f3e 588 return 0;
Anna Bridge 186:707f6e361f3e 589 }