added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Wed Mar 02 14:30:11 2016 +0000
Revision:
80:bdf1132a57cf
Synchronized with git revision de3b14ec9234d586b155fd24badc22775489a3dc

Full URL: https://github.com/mbedmicro/mbed/commit/de3b14ec9234d586b155fd24badc22775489a3dc/

latest changes to add arduino support, plus fixes for IOTSS BEID

Who changed what in which revision?

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