added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
80:bdf1132a57cf
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

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 }