mbed library sources(for async_print)

Dependents:   AsyncPrint

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Jul 02 16:15:09 2015 +0100
Revision:
580:3c14cb9b87c5
Synchronized with git revision 213caf296f26963a7bea129b8ec4f33bbd1e6588

Full URL: https://github.com/mbedmicro/mbed/commit/213caf296f26963a7bea129b8ec4f33bbd1e6588/

commit of mps2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 580:3c14cb9b87c5 1 /* mbed Microcontroller Library
mbed_official 580:3c14cb9b87c5 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 580:3c14cb9b87c5 3 *
mbed_official 580:3c14cb9b87c5 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 580:3c14cb9b87c5 5 * you may not use this file except in compliance with the License.
mbed_official 580:3c14cb9b87c5 6 * You may obtain a copy of the License at
mbed_official 580:3c14cb9b87c5 7 *
mbed_official 580:3c14cb9b87c5 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 580:3c14cb9b87c5 9 *
mbed_official 580:3c14cb9b87c5 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 580:3c14cb9b87c5 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 580:3c14cb9b87c5 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 580:3c14cb9b87c5 13 * See the License for the specific language governing permissions and
mbed_official 580:3c14cb9b87c5 14 * limitations under the License.
mbed_official 580:3c14cb9b87c5 15 */
mbed_official 580:3c14cb9b87c5 16 #include "i2c_api.h"
mbed_official 580:3c14cb9b87c5 17 #include "cmsis.h"
mbed_official 580:3c14cb9b87c5 18 #include "pinmap.h"
mbed_official 580:3c14cb9b87c5 19 #include "mbed_error.h"
mbed_official 580:3c14cb9b87c5 20 #include "SMM_MPS2.h"
mbed_official 580:3c14cb9b87c5 21 #include "wait_api.h"
mbed_official 580:3c14cb9b87c5 22 #include "fpga.h"
mbed_official 580:3c14cb9b87c5 23
mbed_official 580:3c14cb9b87c5 24 // Types
mbed_official 580:3c14cb9b87c5 25 #undef FALSE
mbed_official 580:3c14cb9b87c5 26 #undef TRUE
mbed_official 580:3c14cb9b87c5 27 #define FALSE 0
mbed_official 580:3c14cb9b87c5 28 #define TRUE 1
mbed_official 580:3c14cb9b87c5 29
mbed_official 580:3c14cb9b87c5 30 // TSC I2C controller
mbed_official 580:3c14cb9b87c5 31 #define TSC_I2C_ADDR 0x82
mbed_official 580:3c14cb9b87c5 32 // AACI I2C controller I2C address
mbed_official 580:3c14cb9b87c5 33 #define AAIC_I2C_ADDR 0x96
mbed_official 580:3c14cb9b87c5 34
mbed_official 580:3c14cb9b87c5 35 #define TSC_I2C_CID 0x0811
mbed_official 580:3c14cb9b87c5 36
mbed_official 580:3c14cb9b87c5 37 // TSC I2C controller registers
mbed_official 580:3c14cb9b87c5 38 #define TSC_I2C_CRID 0x00
mbed_official 580:3c14cb9b87c5 39
mbed_official 580:3c14cb9b87c5 40
mbed_official 580:3c14cb9b87c5 41 // TSSPCPSR Clock prescale register
mbed_official 580:3c14cb9b87c5 42 #define TSSPCPSR_DFLT 0x0002 // Clock prescale (use with SCR)
mbed_official 580:3c14cb9b87c5 43
mbed_official 580:3c14cb9b87c5 44 // TSC defaults
mbed_official 580:3c14cb9b87c5 45 #define TSC_XOFF 20 // X offset
mbed_official 580:3c14cb9b87c5 46 #define TSC_YOFF 20 // Y offset
mbed_official 580:3c14cb9b87c5 47 #define TSC_MAXVAL 37000 // 0x0FFF * 10 with TSC to LCD scaling
mbed_official 580:3c14cb9b87c5 48
mbed_official 580:3c14cb9b87c5 49 #define TSC_TSU 15 // Setup delay 600nS min
mbed_official 580:3c14cb9b87c5 50 #define AAIC_TSU 25 // Setup delay 1000nS min
mbed_official 580:3c14cb9b87c5 51
mbed_official 580:3c14cb9b87c5 52
mbed_official 580:3c14cb9b87c5 53 static const PinMap PinMap_I2C_SDA[] = {
mbed_official 580:3c14cb9b87c5 54 {TSC_SDA, I2C_0, 0},
mbed_official 580:3c14cb9b87c5 55 {AUD_SDA, I2C_1, 0},
mbed_official 580:3c14cb9b87c5 56 // {EXP_SDA, I2C_2, 0}, //only used in extended version
mbed_official 580:3c14cb9b87c5 57 {NC , NC , 0}
mbed_official 580:3c14cb9b87c5 58 };
mbed_official 580:3c14cb9b87c5 59
mbed_official 580:3c14cb9b87c5 60 static const PinMap PinMap_I2C_SCL[] = {
mbed_official 580:3c14cb9b87c5 61 {TSC_SCL, I2C_0, 0},
mbed_official 580:3c14cb9b87c5 62 {AUD_SCL, I2C_1, 0},
mbed_official 580:3c14cb9b87c5 63 // {EXP_SCL, I2C_2, 0}, //only used in extended version
mbed_official 580:3c14cb9b87c5 64 {NC , NC, 0}
mbed_official 580:3c14cb9b87c5 65 };
mbed_official 580:3c14cb9b87c5 66
mbed_official 580:3c14cb9b87c5 67 static inline void i2c_send_byte(i2c_t *obj, unsigned char c)
mbed_official 580:3c14cb9b87c5 68 {
mbed_official 580:3c14cb9b87c5 69 int loop;
mbed_official 580:3c14cb9b87c5 70 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 71 case I2C_0:
mbed_official 580:3c14cb9b87c5 72 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 73 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 74
mbed_official 580:3c14cb9b87c5 75 for (loop = 0; loop < 8; loop++)
mbed_official 580:3c14cb9b87c5 76 {
mbed_official 580:3c14cb9b87c5 77 if (c & (1 << (7 - loop)))
mbed_official 580:3c14cb9b87c5 78 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 79 else
mbed_official 580:3c14cb9b87c5 80 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 81 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 82 obj->i2c->CONTROLS = SCL;
mbed_official 580:3c14cb9b87c5 83 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 84 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 85 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 86 }
mbed_official 580:3c14cb9b87c5 87
mbed_official 580:3c14cb9b87c5 88 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 89 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 90 break;
mbed_official 580:3c14cb9b87c5 91 case I2C_1:
mbed_official 580:3c14cb9b87c5 92 for (loop = 0; loop < 8; loop++) {
mbed_official 580:3c14cb9b87c5 93 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 94 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 95 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 96 if (c & (1 << (7 - loop)))
mbed_official 580:3c14cb9b87c5 97 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 98 else
mbed_official 580:3c14cb9b87c5 99 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 100 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 101 obj->i2c->CONTROLS = SCL;
mbed_official 580:3c14cb9b87c5 102 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 103 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 104 }
mbed_official 580:3c14cb9b87c5 105
mbed_official 580:3c14cb9b87c5 106 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 107 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 108 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 109 break;
mbed_official 580:3c14cb9b87c5 110 }
mbed_official 580:3c14cb9b87c5 111 }
mbed_official 580:3c14cb9b87c5 112
mbed_official 580:3c14cb9b87c5 113 static inline unsigned char i2c_receive_byte(i2c_t *obj)
mbed_official 580:3c14cb9b87c5 114 {
mbed_official 580:3c14cb9b87c5 115 int data_receive_byte, loop;
mbed_official 580:3c14cb9b87c5 116 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 117 case I2C_0:
mbed_official 580:3c14cb9b87c5 118 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 119 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 120
mbed_official 580:3c14cb9b87c5 121 data_receive_byte = 0;
mbed_official 580:3c14cb9b87c5 122
mbed_official 580:3c14cb9b87c5 123 for (loop = 0; loop < 8; loop++)
mbed_official 580:3c14cb9b87c5 124 {
mbed_official 580:3c14cb9b87c5 125 obj->i2c->CONTROLS = SCL;
mbed_official 580:3c14cb9b87c5 126 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 127 if ((obj->i2c->CONTROL & SDA))
mbed_official 580:3c14cb9b87c5 128 data_receive_byte += (1 << (7 - loop));
mbed_official 580:3c14cb9b87c5 129 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 130 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 131 }
mbed_official 580:3c14cb9b87c5 132
mbed_official 580:3c14cb9b87c5 133 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 134 i2c_delay(TSC_TSU);
mbed_official 580:3c14cb9b87c5 135 break;
mbed_official 580:3c14cb9b87c5 136 case I2C_1:
mbed_official 580:3c14cb9b87c5 137 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 138 data_receive_byte = 0;
mbed_official 580:3c14cb9b87c5 139
mbed_official 580:3c14cb9b87c5 140 for (loop = 0; loop < 8; loop++) {
mbed_official 580:3c14cb9b87c5 141 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 142 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 143 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 144 obj->i2c->CONTROLS = SCL | SDA;
mbed_official 580:3c14cb9b87c5 145 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 146 if ((obj->i2c->CONTROL & SDA))
mbed_official 580:3c14cb9b87c5 147 data_receive_byte += (1 << (7 - loop));
mbed_official 580:3c14cb9b87c5 148 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 149 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 150 }
mbed_official 580:3c14cb9b87c5 151
mbed_official 580:3c14cb9b87c5 152 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 153 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 154 i2c_delay(AAIC_TSU);
mbed_official 580:3c14cb9b87c5 155 break;
mbed_official 580:3c14cb9b87c5 156 }
mbed_official 580:3c14cb9b87c5 157 return data_receive_byte;
mbed_official 580:3c14cb9b87c5 158 }
mbed_official 580:3c14cb9b87c5 159
mbed_official 580:3c14cb9b87c5 160 static inline int i2c_receive_ack(i2c_t *obj)
mbed_official 580:3c14cb9b87c5 161 {
mbed_official 580:3c14cb9b87c5 162 int nack;
mbed_official 580:3c14cb9b87c5 163 int delay_value;
mbed_official 580:3c14cb9b87c5 164 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 165 case I2C_0: delay_value = TSC_TSU; break;
mbed_official 580:3c14cb9b87c5 166 case I2C_1: delay_value = AAIC_TSU; break;
mbed_official 580:3c14cb9b87c5 167 }
mbed_official 580:3c14cb9b87c5 168
mbed_official 580:3c14cb9b87c5 169 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 170 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 171 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 172 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 173 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 174 obj->i2c->CONTROLS = SCL;
mbed_official 580:3c14cb9b87c5 175 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 176 nack = obj->i2c->CONTROL & SDA;
mbed_official 580:3c14cb9b87c5 177 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 178 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 179 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 180 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 181 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 182 if(nack==0)
mbed_official 580:3c14cb9b87c5 183 return 1;
mbed_official 580:3c14cb9b87c5 184
mbed_official 580:3c14cb9b87c5 185 return 0;
mbed_official 580:3c14cb9b87c5 186 }
mbed_official 580:3c14cb9b87c5 187
mbed_official 580:3c14cb9b87c5 188
mbed_official 580:3c14cb9b87c5 189 static inline void i2c_send_ack(i2c_t *obj)
mbed_official 580:3c14cb9b87c5 190 {
mbed_official 580:3c14cb9b87c5 191 int delay_value;
mbed_official 580:3c14cb9b87c5 192 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 193 case I2C_0: delay_value = TSC_TSU; break;
mbed_official 580:3c14cb9b87c5 194 case I2C_1: delay_value = AAIC_TSU; break;
mbed_official 580:3c14cb9b87c5 195 }
mbed_official 580:3c14cb9b87c5 196
mbed_official 580:3c14cb9b87c5 197 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 198 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 199 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 200 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 201 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 202 obj->i2c->CONTROLS = SCL;
mbed_official 580:3c14cb9b87c5 203 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 204 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 205 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 206 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 207 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 208
mbed_official 580:3c14cb9b87c5 209 }
mbed_official 580:3c14cb9b87c5 210
mbed_official 580:3c14cb9b87c5 211
mbed_official 580:3c14cb9b87c5 212 void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
mbed_official 580:3c14cb9b87c5 213
mbed_official 580:3c14cb9b87c5 214
mbed_official 580:3c14cb9b87c5 215 // determine the SPI to use
mbed_official 580:3c14cb9b87c5 216 I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA);
mbed_official 580:3c14cb9b87c5 217 I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL);
mbed_official 580:3c14cb9b87c5 218 obj->i2c = (MPS2_I2C_TypeDef *)pinmap_merge(i2c_sda, i2c_scl);
mbed_official 580:3c14cb9b87c5 219
mbed_official 580:3c14cb9b87c5 220 if ((int)obj->i2c == NC) {
mbed_official 580:3c14cb9b87c5 221 error("I2C pin mapping failed");
mbed_official 580:3c14cb9b87c5 222 }
mbed_official 580:3c14cb9b87c5 223
mbed_official 580:3c14cb9b87c5 224 pinmap_pinout(sda, PinMap_I2C_SDA);
mbed_official 580:3c14cb9b87c5 225 pinmap_pinout(scl, PinMap_I2C_SCL);
mbed_official 580:3c14cb9b87c5 226 }
mbed_official 580:3c14cb9b87c5 227
mbed_official 580:3c14cb9b87c5 228 int i2c_start(i2c_t *obj) {
mbed_official 580:3c14cb9b87c5 229
mbed_official 580:3c14cb9b87c5 230 int delay_value;
mbed_official 580:3c14cb9b87c5 231 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 232 case I2C_0: delay_value = TSC_TSU; break;
mbed_official 580:3c14cb9b87c5 233 case I2C_1: delay_value = AAIC_TSU; break;
mbed_official 580:3c14cb9b87c5 234 }
mbed_official 580:3c14cb9b87c5 235 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 236 obj->i2c->CONTROLS = SDA | SCL;
mbed_official 580:3c14cb9b87c5 237 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 238 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 239 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 240
mbed_official 580:3c14cb9b87c5 241
mbed_official 580:3c14cb9b87c5 242
mbed_official 580:3c14cb9b87c5 243 return 0;
mbed_official 580:3c14cb9b87c5 244 }
mbed_official 580:3c14cb9b87c5 245
mbed_official 580:3c14cb9b87c5 246 int i2c_start_tsc(i2c_t *obj) {
mbed_official 580:3c14cb9b87c5 247
mbed_official 580:3c14cb9b87c5 248 int delay_value;
mbed_official 580:3c14cb9b87c5 249 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 250 case I2C_0: delay_value = TSC_TSU; break;
mbed_official 580:3c14cb9b87c5 251 case I2C_1: delay_value = AAIC_TSU; break;
mbed_official 580:3c14cb9b87c5 252 }
mbed_official 580:3c14cb9b87c5 253 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 254 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 255 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 256 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 257 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 258
mbed_official 580:3c14cb9b87c5 259 return 0;
mbed_official 580:3c14cb9b87c5 260 }
mbed_official 580:3c14cb9b87c5 261
mbed_official 580:3c14cb9b87c5 262 int i2c_stop(i2c_t *obj) {
mbed_official 580:3c14cb9b87c5 263
mbed_official 580:3c14cb9b87c5 264 int delay_value;
mbed_official 580:3c14cb9b87c5 265 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 266 case I2C_0: delay_value = TSC_TSU; break;
mbed_official 580:3c14cb9b87c5 267 case I2C_1: delay_value = AAIC_TSU; break;
mbed_official 580:3c14cb9b87c5 268 }
mbed_official 580:3c14cb9b87c5 269 // Actual stop bit
mbed_official 580:3c14cb9b87c5 270 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 271 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 272 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 273 obj->i2c->CONTROLS = SCL;
mbed_official 580:3c14cb9b87c5 274 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 275 obj->i2c->CONTROLS = SDA;
mbed_official 580:3c14cb9b87c5 276 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 277
mbed_official 580:3c14cb9b87c5 278 return 0;
mbed_official 580:3c14cb9b87c5 279 }
mbed_official 580:3c14cb9b87c5 280
mbed_official 580:3c14cb9b87c5 281
mbed_official 580:3c14cb9b87c5 282
mbed_official 580:3c14cb9b87c5 283 void i2c_frequency(i2c_t *obj, int hz) {
mbed_official 580:3c14cb9b87c5 284 }
mbed_official 580:3c14cb9b87c5 285
mbed_official 580:3c14cb9b87c5 286 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
mbed_official 580:3c14cb9b87c5 287 unsigned int loop, rxdata;
mbed_official 580:3c14cb9b87c5 288 int delay_value, sadr, ack, bytes_read;
mbed_official 580:3c14cb9b87c5 289 rxdata=0;
mbed_official 580:3c14cb9b87c5 290 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 291 case I2C_0:
mbed_official 580:3c14cb9b87c5 292 delay_value = TSC_TSU;
mbed_official 580:3c14cb9b87c5 293 sadr = TSC_I2C_ADDR;
mbed_official 580:3c14cb9b87c5 294 break;
mbed_official 580:3c14cb9b87c5 295 case I2C_1:
mbed_official 580:3c14cb9b87c5 296 delay_value = AAIC_TSU;
mbed_official 580:3c14cb9b87c5 297 sadr = AAIC_I2C_ADDR;
mbed_official 580:3c14cb9b87c5 298 break;
mbed_official 580:3c14cb9b87c5 299 }
mbed_official 580:3c14cb9b87c5 300 // Start bit
mbed_official 580:3c14cb9b87c5 301 i2c_start(obj);
mbed_official 580:3c14cb9b87c5 302
mbed_official 580:3c14cb9b87c5 303 // Set serial and register address
mbed_official 580:3c14cb9b87c5 304 i2c_send_byte(obj,sadr);
mbed_official 580:3c14cb9b87c5 305 ack += i2c_receive_ack(obj);
mbed_official 580:3c14cb9b87c5 306 i2c_send_byte(obj, address);
mbed_official 580:3c14cb9b87c5 307 ack += i2c_receive_ack(obj);
mbed_official 580:3c14cb9b87c5 308
mbed_official 580:3c14cb9b87c5 309 // Stop bit
mbed_official 580:3c14cb9b87c5 310 i2c_stop(obj);
mbed_official 580:3c14cb9b87c5 311
mbed_official 580:3c14cb9b87c5 312 // Start bit
mbed_official 580:3c14cb9b87c5 313 i2c_start_tsc(obj);
mbed_official 580:3c14cb9b87c5 314
mbed_official 580:3c14cb9b87c5 315 // Read from serial address
mbed_official 580:3c14cb9b87c5 316 i2c_send_byte(obj,sadr | 1);
mbed_official 580:3c14cb9b87c5 317 ack += i2c_receive_ack(obj);
mbed_official 580:3c14cb9b87c5 318 bytes_read = 0;
mbed_official 580:3c14cb9b87c5 319
mbed_official 580:3c14cb9b87c5 320 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 321 case I2C_0:
mbed_official 580:3c14cb9b87c5 322 rxdata = (i2c_receive_byte(obj) & 0xFF);
mbed_official 580:3c14cb9b87c5 323 data[((length-1)-bytes_read)] = (char)rxdata;
mbed_official 580:3c14cb9b87c5 324 bytes_read++;
mbed_official 580:3c14cb9b87c5 325 // Read multiple bytes
mbed_official 580:3c14cb9b87c5 326 if ((length > 1) && (length < 5))
mbed_official 580:3c14cb9b87c5 327 {
mbed_official 580:3c14cb9b87c5 328 for (loop = 1; loop <= (length - 1); loop++)
mbed_official 580:3c14cb9b87c5 329 {
mbed_official 580:3c14cb9b87c5 330 // Send ACK
mbed_official 580:3c14cb9b87c5 331 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 332 obj->i2c->CONTROLC = SDA;
mbed_official 580:3c14cb9b87c5 333 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 334 obj->i2c->CONTROLS = SCL;
mbed_official 580:3c14cb9b87c5 335 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 336 obj->i2c->CONTROLC = SCL;
mbed_official 580:3c14cb9b87c5 337 i2c_delay(delay_value);
mbed_official 580:3c14cb9b87c5 338
mbed_official 580:3c14cb9b87c5 339 rxdata = i2c_receive_byte(obj);
mbed_official 580:3c14cb9b87c5 340 data[(length-1)-bytes_read] = (char)rxdata;
mbed_official 580:3c14cb9b87c5 341 bytes_read++;
mbed_official 580:3c14cb9b87c5 342
mbed_official 580:3c14cb9b87c5 343 }
mbed_official 580:3c14cb9b87c5 344 }
mbed_official 580:3c14cb9b87c5 345 break;
mbed_official 580:3c14cb9b87c5 346 case I2C_1:
mbed_official 580:3c14cb9b87c5 347 rxdata = i2c_receive_byte(obj);
mbed_official 580:3c14cb9b87c5 348 data[bytes_read] = (char)rxdata;
mbed_official 580:3c14cb9b87c5 349 bytes_read++;
mbed_official 580:3c14cb9b87c5 350 break;
mbed_official 580:3c14cb9b87c5 351 }
mbed_official 580:3c14cb9b87c5 352 i2c_send_ack(obj);
mbed_official 580:3c14cb9b87c5 353
mbed_official 580:3c14cb9b87c5 354 // Actual stop bit
mbed_official 580:3c14cb9b87c5 355 i2c_stop(obj);
mbed_official 580:3c14cb9b87c5 356
mbed_official 580:3c14cb9b87c5 357 return bytes_read;
mbed_official 580:3c14cb9b87c5 358 }
mbed_official 580:3c14cb9b87c5 359
mbed_official 580:3c14cb9b87c5 360 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
mbed_official 580:3c14cb9b87c5 361 int ack=0;
mbed_official 580:3c14cb9b87c5 362 int sadr;
mbed_official 580:3c14cb9b87c5 363 switch ((int)obj->i2c) {
mbed_official 580:3c14cb9b87c5 364 case I2C_0: sadr = TSC_I2C_ADDR; break;
mbed_official 580:3c14cb9b87c5 365 case I2C_1: sadr = AAIC_I2C_ADDR; break;
mbed_official 580:3c14cb9b87c5 366 }
mbed_official 580:3c14cb9b87c5 367 for(int i = 1; i<=length; i++)
mbed_official 580:3c14cb9b87c5 368 {
mbed_official 580:3c14cb9b87c5 369 i2c_start(obj);
mbed_official 580:3c14cb9b87c5 370
mbed_official 580:3c14cb9b87c5 371 // Set serial and register address
mbed_official 580:3c14cb9b87c5 372 i2c_send_byte(obj,sadr);
mbed_official 580:3c14cb9b87c5 373 ack += i2c_receive_ack(obj);
mbed_official 580:3c14cb9b87c5 374 i2c_send_byte(obj, address);
mbed_official 580:3c14cb9b87c5 375 ack += i2c_receive_ack(obj);
mbed_official 580:3c14cb9b87c5 376 i2c_send_byte(obj, *data);
mbed_official 580:3c14cb9b87c5 377 ack += i2c_receive_ack(obj);
mbed_official 580:3c14cb9b87c5 378 }
mbed_official 580:3c14cb9b87c5 379
mbed_official 580:3c14cb9b87c5 380 i2c_stop(obj);
mbed_official 580:3c14cb9b87c5 381 if(ack==3) { return 1; }
mbed_official 580:3c14cb9b87c5 382 else{ return 0; }
mbed_official 580:3c14cb9b87c5 383
mbed_official 580:3c14cb9b87c5 384 }
mbed_official 580:3c14cb9b87c5 385
mbed_official 580:3c14cb9b87c5 386 void i2c_reset(i2c_t *obj) {
mbed_official 580:3c14cb9b87c5 387 i2c_stop(obj);
mbed_official 580:3c14cb9b87c5 388 }
mbed_official 580:3c14cb9b87c5 389
mbed_official 580:3c14cb9b87c5 390 int i2c_byte_read(i2c_t *obj, int last) {
mbed_official 580:3c14cb9b87c5 391 return 0;
mbed_official 580:3c14cb9b87c5 392 }
mbed_official 580:3c14cb9b87c5 393
mbed_official 580:3c14cb9b87c5 394 int i2c_byte_write(i2c_t *obj, int data) {
mbed_official 580:3c14cb9b87c5 395 return 0;
mbed_official 580:3c14cb9b87c5 396 }
mbed_official 580:3c14cb9b87c5 397
mbed_official 580:3c14cb9b87c5 398 void i2c_slave_mode(i2c_t *obj, int enable_slave) {
mbed_official 580:3c14cb9b87c5 399 }
mbed_official 580:3c14cb9b87c5 400
mbed_official 580:3c14cb9b87c5 401 int i2c_slave_receive(i2c_t *obj) {
mbed_official 580:3c14cb9b87c5 402 return 0;
mbed_official 580:3c14cb9b87c5 403 }
mbed_official 580:3c14cb9b87c5 404
mbed_official 580:3c14cb9b87c5 405 int i2c_slave_read(i2c_t *obj, char *data, int length) {
mbed_official 580:3c14cb9b87c5 406 return 0;
mbed_official 580:3c14cb9b87c5 407 }
mbed_official 580:3c14cb9b87c5 408
mbed_official 580:3c14cb9b87c5 409 int i2c_slave_write(i2c_t *obj, const char *data, int length) {
mbed_official 580:3c14cb9b87c5 410 return 0;
mbed_official 580:3c14cb9b87c5 411 }
mbed_official 580:3c14cb9b87c5 412
mbed_official 580:3c14cb9b87c5 413 void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask) {
mbed_official 580:3c14cb9b87c5 414 }
mbed_official 580:3c14cb9b87c5 415