mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

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