mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Sun Oct 26 13:45:07 2014 +0000
Revision:
367:d0878bd5474b
Parent:
366:2c37f9c21d44
Synchronized with git revision e770e6257e1470048bd5102cc8c881038ae2edfa

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

HAL: LPC824 - I2C ROMAPI/bitrate related fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 337:6ed01c00b962 1 /* mbed Microcontroller Library
mbed_official 337:6ed01c00b962 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 337:6ed01c00b962 3 *
mbed_official 337:6ed01c00b962 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 337:6ed01c00b962 5 * you may not use this file except in compliance with the License.
mbed_official 337:6ed01c00b962 6 * You may obtain a copy of the License at
mbed_official 337:6ed01c00b962 7 *
mbed_official 337:6ed01c00b962 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 337:6ed01c00b962 9 *
mbed_official 337:6ed01c00b962 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 337:6ed01c00b962 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 337:6ed01c00b962 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 337:6ed01c00b962 13 * See the License for the specific language governing permissions and
mbed_official 337:6ed01c00b962 14 * limitations under the License.
mbed_official 337:6ed01c00b962 15 */
mbed_official 337:6ed01c00b962 16 #include <stdlib.h>
mbed_official 337:6ed01c00b962 17 #include <string.h>
mbed_official 337:6ed01c00b962 18
mbed_official 337:6ed01c00b962 19 #include "i2c_api.h"
mbed_official 337:6ed01c00b962 20 #include "cmsis.h"
mbed_official 337:6ed01c00b962 21 #include "pinmap.h"
mbed_official 337:6ed01c00b962 22
mbed_official 337:6ed01c00b962 23 #include "rom_i2c_8xx.h"
mbed_official 337:6ed01c00b962 24
mbed_official 337:6ed01c00b962 25 #if DEVICE_I2C
mbed_official 337:6ed01c00b962 26
mbed_official 337:6ed01c00b962 27 typedef struct ROM_API {
mbed_official 337:6ed01c00b962 28 const uint32_t unused[5];
mbed_official 337:6ed01c00b962 29 const I2CD_API_T *pI2CD; /*!< I2C driver routines functions table */
mbed_official 337:6ed01c00b962 30 } LPC_ROM_API_T;
mbed_official 337:6ed01c00b962 31
mbed_official 337:6ed01c00b962 32
mbed_official 337:6ed01c00b962 33 /* Pointer to ROM API function address */
mbed_official 337:6ed01c00b962 34 #define LPC_ROM_API_BASE_LOC 0x1FFF1FF8UL
mbed_official 337:6ed01c00b962 35 #define LPC_ROM_API (*(LPC_ROM_API_T * *) LPC_ROM_API_BASE_LOC)
mbed_official 337:6ed01c00b962 36
mbed_official 337:6ed01c00b962 37 /* Pointer to @ref I2CD_API_T functions in ROM */
mbed_official 337:6ed01c00b962 38 #define LPC_I2CD_API ((LPC_ROM_API)->pI2CD)
mbed_official 337:6ed01c00b962 39
mbed_official 337:6ed01c00b962 40 static const SWM_Map SWM_I2C_SDA[] = {
mbed_official 337:6ed01c00b962 41 { 9, 8},
mbed_official 337:6ed01c00b962 42 { 9, 24},
mbed_official 337:6ed01c00b962 43 {10, 8},
mbed_official 337:6ed01c00b962 44 };
mbed_official 337:6ed01c00b962 45
mbed_official 337:6ed01c00b962 46 static const SWM_Map SWM_I2C_SCL[] = {
mbed_official 337:6ed01c00b962 47 { 9, 16},
mbed_official 337:6ed01c00b962 48 {10, 0},
mbed_official 337:6ed01c00b962 49 {10, 16},
mbed_official 337:6ed01c00b962 50 };
mbed_official 337:6ed01c00b962 51
mbed_official 337:6ed01c00b962 52
mbed_official 337:6ed01c00b962 53 static int i2c_used = 0;
mbed_official 337:6ed01c00b962 54 static uint8_t repeated_start = 0;
mbed_official 337:6ed01c00b962 55 static uint32_t *i2c_buffer;
mbed_official 337:6ed01c00b962 56
mbed_official 337:6ed01c00b962 57 #define I2C_DAT(x) (x->i2c->MSTDAT)
mbed_official 337:6ed01c00b962 58 #define I2C_STAT(x) ((x->i2c->STAT >> 1) & (0x07))
mbed_official 337:6ed01c00b962 59
mbed_official 337:6ed01c00b962 60 static inline int i2c_status(i2c_t *obj)
mbed_official 337:6ed01c00b962 61 {
mbed_official 337:6ed01c00b962 62 return I2C_STAT(obj);
mbed_official 337:6ed01c00b962 63 }
mbed_official 337:6ed01c00b962 64
mbed_official 337:6ed01c00b962 65 // Wait until the Serial Interrupt (SI) is set
mbed_official 337:6ed01c00b962 66 static int i2c_wait_SI(i2c_t *obj)
mbed_official 337:6ed01c00b962 67 {
mbed_official 337:6ed01c00b962 68 volatile int timeout = 0;
mbed_official 337:6ed01c00b962 69 while (!(obj->i2c->STAT & (1 << 0))) {
mbed_official 337:6ed01c00b962 70 timeout++;
mbed_official 337:6ed01c00b962 71 if (timeout > 100000) return -1;
mbed_official 337:6ed01c00b962 72 }
mbed_official 337:6ed01c00b962 73 return 0;
mbed_official 337:6ed01c00b962 74 }
mbed_official 337:6ed01c00b962 75
mbed_official 337:6ed01c00b962 76 static inline void i2c_interface_enable(i2c_t *obj)
mbed_official 337:6ed01c00b962 77 {
mbed_official 337:6ed01c00b962 78 obj->i2c->CFG |= 1;
mbed_official 337:6ed01c00b962 79 }
mbed_official 337:6ed01c00b962 80
mbed_official 337:6ed01c00b962 81 static inline void i2c_power_enable(int ch)
mbed_official 337:6ed01c00b962 82 {
mbed_official 337:6ed01c00b962 83 switch(ch) {
mbed_official 337:6ed01c00b962 84 case 0:
mbed_official 337:6ed01c00b962 85 LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 5);
mbed_official 337:6ed01c00b962 86 LPC_SYSCON->PRESETCTRL &= ~(1 << 6);
mbed_official 337:6ed01c00b962 87 LPC_SYSCON->PRESETCTRL |= (1 << 6);
mbed_official 337:6ed01c00b962 88 break;
mbed_official 337:6ed01c00b962 89 case 1:
mbed_official 337:6ed01c00b962 90 case 2:
mbed_official 337:6ed01c00b962 91 case 3:
mbed_official 337:6ed01c00b962 92 LPC_SYSCON->SYSAHBCLKCTRL |= (1 << (20 + ch));
mbed_official 337:6ed01c00b962 93 LPC_SYSCON->PRESETCTRL &= ~(1 << (13 + ch));
mbed_official 337:6ed01c00b962 94 LPC_SYSCON->PRESETCTRL |= (1 << (13 + ch));
mbed_official 337:6ed01c00b962 95 break;
mbed_official 337:6ed01c00b962 96 default:
mbed_official 337:6ed01c00b962 97 break;
mbed_official 337:6ed01c00b962 98 }
mbed_official 337:6ed01c00b962 99 }
mbed_official 337:6ed01c00b962 100
mbed_official 337:6ed01c00b962 101
mbed_official 337:6ed01c00b962 102 static int get_available_i2c(void) {
mbed_official 337:6ed01c00b962 103 int i;
mbed_official 337:6ed01c00b962 104 for (i=0; i<3; i++) {
mbed_official 337:6ed01c00b962 105 if ((i2c_used & (1 << i)) == 0)
mbed_official 337:6ed01c00b962 106 return i+1;
mbed_official 337:6ed01c00b962 107 }
mbed_official 337:6ed01c00b962 108 return -1;
mbed_official 337:6ed01c00b962 109 }
mbed_official 337:6ed01c00b962 110
mbed_official 337:6ed01c00b962 111 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
mbed_official 337:6ed01c00b962 112 {
mbed_official 337:6ed01c00b962 113 const SWM_Map *swm;
mbed_official 337:6ed01c00b962 114 uint32_t regVal;
mbed_official 337:6ed01c00b962 115 int i2c_ch = 0;
mbed_official 337:6ed01c00b962 116
mbed_official 337:6ed01c00b962 117 if (sda == I2C_SDA && scl == I2C_SCL) {
mbed_official 337:6ed01c00b962 118 LPC_SWM->PINENABLE0 &= ~(0x3 << 11);
mbed_official 337:6ed01c00b962 119 }
mbed_official 337:6ed01c00b962 120 else {
mbed_official 337:6ed01c00b962 121 i2c_ch = get_available_i2c();
mbed_official 337:6ed01c00b962 122 if (i2c_ch == -1)
mbed_official 337:6ed01c00b962 123 return;
mbed_official 366:2c37f9c21d44 124 i2c_used |= (1 << (i2c_ch - 1));
mbed_official 337:6ed01c00b962 125
mbed_official 337:6ed01c00b962 126 swm = &SWM_I2C_SDA[i2c_ch - 1];
mbed_official 337:6ed01c00b962 127 regVal = LPC_SWM->PINASSIGN[swm->n] & ~(0xFF << swm->offset);
mbed_official 337:6ed01c00b962 128 LPC_SWM->PINASSIGN[swm->n] = regVal | ((sda >> PIN_SHIFT) << swm->offset);
mbed_official 337:6ed01c00b962 129
mbed_official 337:6ed01c00b962 130 swm = &SWM_I2C_SCL[i2c_ch - 1];
mbed_official 337:6ed01c00b962 131 regVal = LPC_SWM->PINASSIGN[swm->n] & ~(0xFF << swm->offset);
mbed_official 337:6ed01c00b962 132 LPC_SWM->PINASSIGN[swm->n] = regVal | ((scl >> PIN_SHIFT) << swm->offset);
mbed_official 337:6ed01c00b962 133 }
mbed_official 337:6ed01c00b962 134
mbed_official 337:6ed01c00b962 135 switch(i2c_ch) {
mbed_official 337:6ed01c00b962 136 case 0:
mbed_official 337:6ed01c00b962 137 obj->i2c = (LPC_I2C0_Type *)LPC_I2C0;
mbed_official 337:6ed01c00b962 138 break;
mbed_official 337:6ed01c00b962 139 case 1:
mbed_official 337:6ed01c00b962 140 obj->i2c = (LPC_I2C0_Type *)LPC_I2C1;
mbed_official 337:6ed01c00b962 141 break;
mbed_official 337:6ed01c00b962 142 case 2:
mbed_official 337:6ed01c00b962 143 obj->i2c = (LPC_I2C0_Type *)LPC_I2C2;
mbed_official 337:6ed01c00b962 144 break;
mbed_official 337:6ed01c00b962 145 case 3:
mbed_official 337:6ed01c00b962 146 obj->i2c = (LPC_I2C0_Type *)LPC_I2C3;
mbed_official 337:6ed01c00b962 147 break;
mbed_official 337:6ed01c00b962 148 default:
mbed_official 337:6ed01c00b962 149 break;
mbed_official 337:6ed01c00b962 150 }
mbed_official 337:6ed01c00b962 151
mbed_official 337:6ed01c00b962 152 // enable power
mbed_official 337:6ed01c00b962 153 i2c_power_enable(i2c_ch);
mbed_official 337:6ed01c00b962 154
mbed_official 337:6ed01c00b962 155 uint32_t size_in_bytes = LPC_I2CD_API->i2c_get_mem_size();
mbed_official 337:6ed01c00b962 156 i2c_buffer = malloc(size_in_bytes);
mbed_official 337:6ed01c00b962 157 obj->handler = LPC_I2CD_API->i2c_setup((uint32_t)(obj->i2c), i2c_buffer);
mbed_official 337:6ed01c00b962 158 LPC_I2CD_API->i2c_set_bitrate(obj->handler, SystemCoreClock, 100000);
mbed_official 337:6ed01c00b962 159 LPC_I2CD_API->i2c_set_timeout(obj->handler, 100000);
mbed_official 367:d0878bd5474b 160
mbed_official 367:d0878bd5474b 161 i2c_interface_enable(obj);
mbed_official 337:6ed01c00b962 162 }
mbed_official 337:6ed01c00b962 163
mbed_official 337:6ed01c00b962 164 inline int i2c_start(i2c_t *obj)
mbed_official 337:6ed01c00b962 165 {
mbed_official 337:6ed01c00b962 166 int status = 0;
mbed_official 337:6ed01c00b962 167 if (repeated_start) {
mbed_official 337:6ed01c00b962 168 obj->i2c->MSTCTL = (1 << 1) | (1 << 0);
mbed_official 337:6ed01c00b962 169 repeated_start = 0;
mbed_official 337:6ed01c00b962 170 } else {
mbed_official 337:6ed01c00b962 171 obj->i2c->MSTCTL = (1 << 1);
mbed_official 337:6ed01c00b962 172 }
mbed_official 337:6ed01c00b962 173 return status;
mbed_official 337:6ed01c00b962 174 }
mbed_official 337:6ed01c00b962 175
mbed_official 337:6ed01c00b962 176 inline int i2c_stop(i2c_t *obj)
mbed_official 337:6ed01c00b962 177 {
mbed_official 337:6ed01c00b962 178 volatile int timeout = 0;
mbed_official 337:6ed01c00b962 179
mbed_official 337:6ed01c00b962 180 obj->i2c->MSTCTL = (1 << 2) | (1 << 0);
mbed_official 337:6ed01c00b962 181 while ((obj->i2c->STAT & ((1 << 0) | (7 << 1))) != ((1 << 0) | (0 << 1))) {
mbed_official 337:6ed01c00b962 182 timeout ++;
mbed_official 337:6ed01c00b962 183 if (timeout > 100000) return 1;
mbed_official 337:6ed01c00b962 184 }
mbed_official 337:6ed01c00b962 185
mbed_official 337:6ed01c00b962 186 return 0;
mbed_official 337:6ed01c00b962 187 }
mbed_official 337:6ed01c00b962 188
mbed_official 337:6ed01c00b962 189 static inline int i2c_do_write(i2c_t *obj, int value, uint8_t addr)
mbed_official 337:6ed01c00b962 190 {
mbed_official 337:6ed01c00b962 191 // write the data
mbed_official 337:6ed01c00b962 192 I2C_DAT(obj) = value;
mbed_official 337:6ed01c00b962 193
mbed_official 337:6ed01c00b962 194 if (!addr)
mbed_official 337:6ed01c00b962 195 obj->i2c->MSTCTL = (1 << 0);
mbed_official 337:6ed01c00b962 196
mbed_official 337:6ed01c00b962 197 // wait and return status
mbed_official 337:6ed01c00b962 198 i2c_wait_SI(obj);
mbed_official 337:6ed01c00b962 199 return i2c_status(obj);
mbed_official 337:6ed01c00b962 200 }
mbed_official 337:6ed01c00b962 201
mbed_official 337:6ed01c00b962 202 static inline int i2c_do_read(i2c_t *obj, int last)
mbed_official 337:6ed01c00b962 203 {
mbed_official 337:6ed01c00b962 204 // wait for it to arrive
mbed_official 337:6ed01c00b962 205 i2c_wait_SI(obj);
mbed_official 337:6ed01c00b962 206 if (!last)
mbed_official 337:6ed01c00b962 207 obj->i2c->MSTCTL = (1 << 0);
mbed_official 337:6ed01c00b962 208
mbed_official 337:6ed01c00b962 209 // return the data
mbed_official 337:6ed01c00b962 210 return (I2C_DAT(obj) & 0xFF);
mbed_official 337:6ed01c00b962 211 }
mbed_official 337:6ed01c00b962 212
mbed_official 337:6ed01c00b962 213 void i2c_frequency(i2c_t *obj, int hz)
mbed_official 337:6ed01c00b962 214 {
mbed_official 367:d0878bd5474b 215 LPC_I2CD_API->i2c_set_bitrate(obj->handler, SystemCoreClock, hz);
mbed_official 337:6ed01c00b962 216 }
mbed_official 337:6ed01c00b962 217
mbed_official 337:6ed01c00b962 218 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
mbed_official 337:6ed01c00b962 219 {
mbed_official 337:6ed01c00b962 220 ErrorCode_t err;
mbed_official 337:6ed01c00b962 221 I2C_PARAM_T i2c_param;
mbed_official 337:6ed01c00b962 222 I2C_RESULT_T i2c_result;
mbed_official 337:6ed01c00b962 223
mbed_official 337:6ed01c00b962 224 uint8_t *buf = malloc(length + 1);
mbed_official 337:6ed01c00b962 225 buf[0] = (uint8_t)((address | 0x01) & 0xFF);
mbed_official 337:6ed01c00b962 226 i2c_param.buffer_ptr_rec = buf;
mbed_official 337:6ed01c00b962 227 i2c_param.num_bytes_rec = length + 1;
mbed_official 337:6ed01c00b962 228 i2c_param.stop_flag = stop;
mbed_official 337:6ed01c00b962 229 err = LPC_I2CD_API->i2c_master_receive_poll(obj->handler, &i2c_param, &i2c_result);
mbed_official 337:6ed01c00b962 230 memcpy(data, buf + 1, i2c_result.n_bytes_recd);
mbed_official 337:6ed01c00b962 231 free(buf);
mbed_official 337:6ed01c00b962 232 if (err == 0)
mbed_official 350:a00142a134db 233 return i2c_result.n_bytes_recd - 1;
mbed_official 337:6ed01c00b962 234 else
mbed_official 337:6ed01c00b962 235 return -1;
mbed_official 337:6ed01c00b962 236 }
mbed_official 337:6ed01c00b962 237
mbed_official 337:6ed01c00b962 238 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
mbed_official 337:6ed01c00b962 239 {
mbed_official 337:6ed01c00b962 240 ErrorCode_t err;
mbed_official 337:6ed01c00b962 241 I2C_PARAM_T i2c_param;
mbed_official 337:6ed01c00b962 242 I2C_RESULT_T i2c_result;
mbed_official 337:6ed01c00b962 243
mbed_official 337:6ed01c00b962 244 uint8_t *buf = malloc(length + 1);
mbed_official 337:6ed01c00b962 245 buf[0] = (uint8_t)(address & 0xFE);
mbed_official 337:6ed01c00b962 246 memcpy(buf + 1, data, length);
mbed_official 337:6ed01c00b962 247 i2c_param.buffer_ptr_send = buf;
mbed_official 337:6ed01c00b962 248 i2c_param.num_bytes_send = length + 1;
mbed_official 337:6ed01c00b962 249 i2c_param.stop_flag = stop;
mbed_official 337:6ed01c00b962 250 err = LPC_I2CD_API->i2c_master_transmit_poll(obj->handler, &i2c_param, &i2c_result);
mbed_official 337:6ed01c00b962 251 free(buf);
mbed_official 337:6ed01c00b962 252 if (err == 0)
mbed_official 350:a00142a134db 253 return i2c_result.n_bytes_sent - 1;
mbed_official 337:6ed01c00b962 254 else
mbed_official 337:6ed01c00b962 255 return -1;
mbed_official 337:6ed01c00b962 256 }
mbed_official 337:6ed01c00b962 257
mbed_official 337:6ed01c00b962 258 void i2c_reset(i2c_t *obj)
mbed_official 337:6ed01c00b962 259 {
mbed_official 337:6ed01c00b962 260 i2c_stop(obj);
mbed_official 337:6ed01c00b962 261 }
mbed_official 337:6ed01c00b962 262
mbed_official 337:6ed01c00b962 263 int i2c_byte_read(i2c_t *obj, int last)
mbed_official 337:6ed01c00b962 264 {
mbed_official 337:6ed01c00b962 265 return (i2c_do_read(obj, last) & 0xFF);
mbed_official 337:6ed01c00b962 266 }
mbed_official 337:6ed01c00b962 267
mbed_official 337:6ed01c00b962 268 int i2c_byte_write(i2c_t *obj, int data)
mbed_official 337:6ed01c00b962 269 {
mbed_official 337:6ed01c00b962 270 int ack;
mbed_official 337:6ed01c00b962 271 int status = i2c_do_write(obj, (data & 0xFF), 0);
mbed_official 337:6ed01c00b962 272
mbed_official 337:6ed01c00b962 273 switch(status) {
mbed_official 337:6ed01c00b962 274 case 2:
mbed_official 337:6ed01c00b962 275 ack = 1;
mbed_official 337:6ed01c00b962 276 break;
mbed_official 337:6ed01c00b962 277 default:
mbed_official 337:6ed01c00b962 278 ack = 0;
mbed_official 337:6ed01c00b962 279 break;
mbed_official 337:6ed01c00b962 280 }
mbed_official 337:6ed01c00b962 281
mbed_official 337:6ed01c00b962 282 return ack;
mbed_official 337:6ed01c00b962 283 }
mbed_official 337:6ed01c00b962 284
mbed_official 337:6ed01c00b962 285 #if DEVICE_I2CSLAVE
mbed_official 337:6ed01c00b962 286
mbed_official 350:a00142a134db 287 void i2c_slave_mode(i2c_t *obj, int enable_slave)
mbed_official 337:6ed01c00b962 288 {
mbed_official 337:6ed01c00b962 289 obj->handler = LPC_I2CD_API->i2c_setup((uint32_t)(obj->i2c), i2c_buffer);
mbed_official 337:6ed01c00b962 290 if (enable_slave != 0) {
mbed_official 337:6ed01c00b962 291 obj->i2c->CFG &= ~(1 << 0);
mbed_official 337:6ed01c00b962 292 obj->i2c->CFG |= (1 << 1);
mbed_official 337:6ed01c00b962 293 }
mbed_official 337:6ed01c00b962 294 else {
mbed_official 337:6ed01c00b962 295 obj->i2c->CFG |= (1 << 0);
mbed_official 337:6ed01c00b962 296 obj->i2c->CFG &= ~(1 << 1);
mbed_official 337:6ed01c00b962 297 }
mbed_official 337:6ed01c00b962 298
mbed_official 337:6ed01c00b962 299 }
mbed_official 337:6ed01c00b962 300
mbed_official 337:6ed01c00b962 301 int i2c_slave_receive(i2c_t *obj)
mbed_official 337:6ed01c00b962 302 {
mbed_official 337:6ed01c00b962 303 CHIP_I2C_MODE_T mode;
mbed_official 337:6ed01c00b962 304 int ret;
mbed_official 337:6ed01c00b962 305
mbed_official 337:6ed01c00b962 306 mode = LPC_I2CD_API->i2c_get_status(obj->handler);
mbed_official 337:6ed01c00b962 307 switch(mode) {
mbed_official 337:6ed01c00b962 308 case SLAVE_SEND:
mbed_official 337:6ed01c00b962 309 ret = 1;
mbed_official 337:6ed01c00b962 310 break;
mbed_official 337:6ed01c00b962 311 case SLAVE_RECEIVE:
mbed_official 337:6ed01c00b962 312 ret = 3;
mbed_official 337:6ed01c00b962 313 break;
mbed_official 337:6ed01c00b962 314 case MASTER_SEND:
mbed_official 337:6ed01c00b962 315 case MASTER_RECEIVE:
mbed_official 337:6ed01c00b962 316 default:
mbed_official 337:6ed01c00b962 317 ret = 0;
mbed_official 337:6ed01c00b962 318 break;
mbed_official 337:6ed01c00b962 319 }
mbed_official 337:6ed01c00b962 320 return ret;
mbed_official 337:6ed01c00b962 321 }
mbed_official 337:6ed01c00b962 322
mbed_official 337:6ed01c00b962 323 int i2c_slave_read(i2c_t *obj, char *data, int length)
mbed_official 337:6ed01c00b962 324 {
mbed_official 337:6ed01c00b962 325 ErrorCode_t err;
mbed_official 337:6ed01c00b962 326 I2C_PARAM_T i2c_param;
mbed_official 337:6ed01c00b962 327 I2C_RESULT_T i2c_result;
mbed_official 337:6ed01c00b962 328
mbed_official 337:6ed01c00b962 329 i2c_param.buffer_ptr_send = (uint8_t *)data;
mbed_official 337:6ed01c00b962 330 i2c_param.num_bytes_send = length;
mbed_official 337:6ed01c00b962 331 err = LPC_I2CD_API->i2c_slave_transmit_poll(obj->handler, &i2c_param, &i2c_result);
mbed_official 337:6ed01c00b962 332 if (err == 0)
mbed_official 337:6ed01c00b962 333 return i2c_result.n_bytes_sent;
mbed_official 337:6ed01c00b962 334 else
mbed_official 337:6ed01c00b962 335 return -1;
mbed_official 337:6ed01c00b962 336 }
mbed_official 337:6ed01c00b962 337
mbed_official 337:6ed01c00b962 338 int i2c_slave_write(i2c_t *obj, const char *data, int length)
mbed_official 337:6ed01c00b962 339 {
mbed_official 337:6ed01c00b962 340 ErrorCode_t err;
mbed_official 337:6ed01c00b962 341 I2C_PARAM_T i2c_param;
mbed_official 337:6ed01c00b962 342 I2C_RESULT_T i2c_result;
mbed_official 337:6ed01c00b962 343
mbed_official 337:6ed01c00b962 344 i2c_param.buffer_ptr_rec = (uint8_t *)data;
mbed_official 337:6ed01c00b962 345 i2c_param.num_bytes_rec = length;
mbed_official 337:6ed01c00b962 346 err = LPC_I2CD_API->i2c_slave_receive_poll(obj->handler, &i2c_param, &i2c_result);
mbed_official 337:6ed01c00b962 347 if (err == 0)
mbed_official 337:6ed01c00b962 348 return i2c_result.n_bytes_recd;
mbed_official 337:6ed01c00b962 349 else
mbed_official 337:6ed01c00b962 350 return -1;
mbed_official 337:6ed01c00b962 351 }
mbed_official 337:6ed01c00b962 352
mbed_official 337:6ed01c00b962 353 void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask)
mbed_official 337:6ed01c00b962 354 {
mbed_official 337:6ed01c00b962 355 LPC_I2CD_API->i2c_set_slave_addr(obj->handler, address, 0);
mbed_official 337:6ed01c00b962 356 }
mbed_official 337:6ed01c00b962 357
mbed_official 337:6ed01c00b962 358 #endif
mbed_official 337:6ed01c00b962 359
mbed_official 337:6ed01c00b962 360 #endif