Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sun May 14 23:18:57 2017 +0000
Revision:
18:6a4db94011d3
Publishing again

Who changed what in which revision?

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