mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
149:156823d33999
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /* mbed Microcontroller Library
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2013 Nordic Semiconductor
<> 144:ef7eb2e8f9f7 3 *
<> 144:ef7eb2e8f9f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 5 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 6 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 13 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 14 * limitations under the License.
<> 144:ef7eb2e8f9f7 15 */
<> 144:ef7eb2e8f9f7 16 #include "mbed_assert.h"
<> 144:ef7eb2e8f9f7 17 #include "i2c_api.h"
<> 144:ef7eb2e8f9f7 18 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 19 #include "pinmap.h"
<> 144:ef7eb2e8f9f7 20 #include "twi_master.h"
<> 144:ef7eb2e8f9f7 21 #include "mbed_error.h"
<> 144:ef7eb2e8f9f7 22
<> 144:ef7eb2e8f9f7 23 // nRF51822's I2C_0 and SPI_0 (I2C_1, SPI_1 and SPIS1) share the same address.
<> 144:ef7eb2e8f9f7 24 // They can't be used at the same time. So we use two global variable to track the usage.
<> 144:ef7eb2e8f9f7 25 // See nRF51822 address information at nRF51822_PS v2.0.pdf - Table 15 Peripheral instance reference
<> 144:ef7eb2e8f9f7 26 volatile i2c_spi_peripheral_t i2c0_spi0_peripheral = {0, 0, 0, 0};
<> 144:ef7eb2e8f9f7 27 volatile i2c_spi_peripheral_t i2c1_spi1_peripheral = {0, 0, 0, 0};
<> 144:ef7eb2e8f9f7 28
<> 144:ef7eb2e8f9f7 29 void i2c_interface_enable(i2c_t *obj)
<> 144:ef7eb2e8f9f7 30 {
<> 144:ef7eb2e8f9f7 31 obj->i2c->ENABLE = (TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos);
<> 144:ef7eb2e8f9f7 32 }
<> 144:ef7eb2e8f9f7 33
<> 144:ef7eb2e8f9f7 34 void twi_master_init(i2c_t *obj, PinName sda, PinName scl, int frequency)
<> 144:ef7eb2e8f9f7 35 {
<> 144:ef7eb2e8f9f7 36 NRF_GPIO->PIN_CNF[scl] = ((GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
<> 144:ef7eb2e8f9f7 37 (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
<> 144:ef7eb2e8f9f7 38 (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
<> 144:ef7eb2e8f9f7 39 (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
<> 144:ef7eb2e8f9f7 40 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos));
<> 144:ef7eb2e8f9f7 41
<> 144:ef7eb2e8f9f7 42 NRF_GPIO->PIN_CNF[sda] = ((GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
<> 144:ef7eb2e8f9f7 43 (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
<> 144:ef7eb2e8f9f7 44 (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
<> 144:ef7eb2e8f9f7 45 (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
<> 144:ef7eb2e8f9f7 46 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos));
<> 144:ef7eb2e8f9f7 47
<> 144:ef7eb2e8f9f7 48 obj->i2c->PSELSCL = scl;
<> 144:ef7eb2e8f9f7 49 obj->i2c->PSELSDA = sda;
<> 144:ef7eb2e8f9f7 50 // set default frequency at 100k
<> 144:ef7eb2e8f9f7 51 i2c_frequency(obj, frequency);
<> 144:ef7eb2e8f9f7 52 i2c_interface_enable(obj);
<> 144:ef7eb2e8f9f7 53 }
<> 144:ef7eb2e8f9f7 54
<> 144:ef7eb2e8f9f7 55 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
<> 144:ef7eb2e8f9f7 56 {
<> 144:ef7eb2e8f9f7 57 NRF_TWI_Type *i2c = NULL;
<> 144:ef7eb2e8f9f7 58
<> 144:ef7eb2e8f9f7 59 if (i2c0_spi0_peripheral.usage == I2C_SPI_PERIPHERAL_FOR_I2C &&
<> 144:ef7eb2e8f9f7 60 i2c0_spi0_peripheral.sda_mosi == (uint8_t)sda &&
<> 144:ef7eb2e8f9f7 61 i2c0_spi0_peripheral.scl_miso == (uint8_t)scl) {
<> 144:ef7eb2e8f9f7 62 // The I2C with the same pins is already initialized
<> 144:ef7eb2e8f9f7 63 i2c = (NRF_TWI_Type *)I2C_0;
<> 144:ef7eb2e8f9f7 64 obj->peripheral = 0x1;
<> 144:ef7eb2e8f9f7 65 } else if (i2c1_spi1_peripheral.usage == I2C_SPI_PERIPHERAL_FOR_I2C &&
<> 144:ef7eb2e8f9f7 66 i2c1_spi1_peripheral.sda_mosi == (uint8_t)sda &&
<> 144:ef7eb2e8f9f7 67 i2c1_spi1_peripheral.scl_miso == (uint8_t)scl) {
<> 144:ef7eb2e8f9f7 68 // The I2C with the same pins is already initialized
<> 144:ef7eb2e8f9f7 69 i2c = (NRF_TWI_Type *)I2C_1;
<> 144:ef7eb2e8f9f7 70 obj->peripheral = 0x2;
<> 144:ef7eb2e8f9f7 71 } else if (i2c0_spi0_peripheral.usage == 0) {
<> 144:ef7eb2e8f9f7 72 i2c0_spi0_peripheral.usage = I2C_SPI_PERIPHERAL_FOR_I2C;
<> 144:ef7eb2e8f9f7 73 i2c0_spi0_peripheral.sda_mosi = (uint8_t)sda;
<> 144:ef7eb2e8f9f7 74 i2c0_spi0_peripheral.scl_miso = (uint8_t)scl;
<> 144:ef7eb2e8f9f7 75
<> 144:ef7eb2e8f9f7 76 i2c = (NRF_TWI_Type *)I2C_0;
<> 144:ef7eb2e8f9f7 77 obj->peripheral = 0x1;
<> 144:ef7eb2e8f9f7 78 } else if (i2c1_spi1_peripheral.usage == 0) {
<> 144:ef7eb2e8f9f7 79 i2c1_spi1_peripheral.usage = I2C_SPI_PERIPHERAL_FOR_I2C;
<> 144:ef7eb2e8f9f7 80 i2c1_spi1_peripheral.sda_mosi = (uint8_t)sda;
<> 144:ef7eb2e8f9f7 81 i2c1_spi1_peripheral.scl_miso = (uint8_t)scl;
<> 144:ef7eb2e8f9f7 82
<> 144:ef7eb2e8f9f7 83 i2c = (NRF_TWI_Type *)I2C_1;
<> 144:ef7eb2e8f9f7 84 obj->peripheral = 0x2;
<> 144:ef7eb2e8f9f7 85 } else {
<> 144:ef7eb2e8f9f7 86 // No available peripheral
<> 144:ef7eb2e8f9f7 87 error("No available I2C");
<> 144:ef7eb2e8f9f7 88 }
<> 144:ef7eb2e8f9f7 89
<> 144:ef7eb2e8f9f7 90 twi_master_init_and_clear(i2c);
<> 144:ef7eb2e8f9f7 91
<> 144:ef7eb2e8f9f7 92 obj->i2c = i2c;
<> 144:ef7eb2e8f9f7 93 obj->scl = scl;
<> 144:ef7eb2e8f9f7 94 obj->sda = sda;
<> 144:ef7eb2e8f9f7 95 obj->i2c->EVENTS_ERROR = 0;
<> 144:ef7eb2e8f9f7 96 obj->i2c->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
<> 144:ef7eb2e8f9f7 97 obj->i2c->POWER = 0;
<> 144:ef7eb2e8f9f7 98
<> 144:ef7eb2e8f9f7 99 for (int i = 0; i<100; i++) {
<> 144:ef7eb2e8f9f7 100 }
<> 144:ef7eb2e8f9f7 101
<> 144:ef7eb2e8f9f7 102 obj->i2c->POWER = 1;
<> 144:ef7eb2e8f9f7 103 twi_master_init(obj, sda, scl, 100000);
<> 144:ef7eb2e8f9f7 104 }
<> 144:ef7eb2e8f9f7 105
<> 144:ef7eb2e8f9f7 106 void i2c_reset(i2c_t *obj)
<> 144:ef7eb2e8f9f7 107 {
<> 144:ef7eb2e8f9f7 108 obj->i2c->EVENTS_ERROR = 0;
<> 144:ef7eb2e8f9f7 109 obj->i2c->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
<> 144:ef7eb2e8f9f7 110 obj->i2c->POWER = 0;
<> 144:ef7eb2e8f9f7 111 for (int i = 0; i<100; i++) {
<> 144:ef7eb2e8f9f7 112 }
<> 144:ef7eb2e8f9f7 113
<> 144:ef7eb2e8f9f7 114 obj->i2c->POWER = 1;
<> 144:ef7eb2e8f9f7 115 twi_master_init(obj, obj->sda, obj->scl, obj->freq);
<> 144:ef7eb2e8f9f7 116 }
<> 144:ef7eb2e8f9f7 117
<> 144:ef7eb2e8f9f7 118 int i2c_start(i2c_t *obj)
<> 144:ef7eb2e8f9f7 119 {
<> 144:ef7eb2e8f9f7 120 int status = 0;
<> 144:ef7eb2e8f9f7 121 i2c_reset(obj);
<> 144:ef7eb2e8f9f7 122 obj->address_set = 0;
<> 144:ef7eb2e8f9f7 123 return status;
<> 144:ef7eb2e8f9f7 124 }
<> 144:ef7eb2e8f9f7 125
<> 144:ef7eb2e8f9f7 126 int i2c_stop(i2c_t *obj)
<> 144:ef7eb2e8f9f7 127 {
<> 144:ef7eb2e8f9f7 128 int timeOut = 100000;
<> 144:ef7eb2e8f9f7 129 obj->i2c->EVENTS_STOPPED = 0;
<> 144:ef7eb2e8f9f7 130 // write the stop bit
<> 144:ef7eb2e8f9f7 131 obj->i2c->TASKS_STOP = 1;
<> 144:ef7eb2e8f9f7 132 while (!obj->i2c->EVENTS_STOPPED) {
<> 144:ef7eb2e8f9f7 133 timeOut--;
<> 144:ef7eb2e8f9f7 134 if (timeOut<0) {
<> 144:ef7eb2e8f9f7 135 return 1;
<> 144:ef7eb2e8f9f7 136 }
<> 144:ef7eb2e8f9f7 137 }
<> 144:ef7eb2e8f9f7 138 obj->address_set = 0;
<> 144:ef7eb2e8f9f7 139 i2c_reset(obj);
<> 144:ef7eb2e8f9f7 140 return 0;
<> 144:ef7eb2e8f9f7 141 }
<> 144:ef7eb2e8f9f7 142
<> 144:ef7eb2e8f9f7 143 int i2c_do_write(i2c_t *obj, int value)
<> 144:ef7eb2e8f9f7 144 {
<> 144:ef7eb2e8f9f7 145 int timeOut = 100000;
<> 144:ef7eb2e8f9f7 146 obj->i2c->TXD = value;
<> 144:ef7eb2e8f9f7 147 while (!obj->i2c->EVENTS_TXDSENT) {
<> 144:ef7eb2e8f9f7 148 timeOut--;
<> 144:ef7eb2e8f9f7 149 if (timeOut<0) {
<> 144:ef7eb2e8f9f7 150 return 1;
<> 144:ef7eb2e8f9f7 151 }
<> 144:ef7eb2e8f9f7 152 }
<> 144:ef7eb2e8f9f7 153 obj->i2c->EVENTS_TXDSENT = 0;
<> 144:ef7eb2e8f9f7 154 return 0;
<> 144:ef7eb2e8f9f7 155 }
<> 144:ef7eb2e8f9f7 156
<> 144:ef7eb2e8f9f7 157 int i2c_do_read(i2c_t *obj, char *data, int last)
<> 144:ef7eb2e8f9f7 158 {
<> 144:ef7eb2e8f9f7 159 int timeOut = 100000;
<> 144:ef7eb2e8f9f7 160
<> 144:ef7eb2e8f9f7 161 if (last) {
<> 144:ef7eb2e8f9f7 162 // To trigger stop task when a byte is received,
<> 144:ef7eb2e8f9f7 163 // must be set before resume task.
<> 144:ef7eb2e8f9f7 164 obj->i2c->SHORTS = 2;
<> 144:ef7eb2e8f9f7 165 }
<> 144:ef7eb2e8f9f7 166
<> 144:ef7eb2e8f9f7 167 obj->i2c->TASKS_RESUME = 1;
<> 144:ef7eb2e8f9f7 168
<> 144:ef7eb2e8f9f7 169 while (!obj->i2c->EVENTS_RXDREADY) {
<> 144:ef7eb2e8f9f7 170 timeOut--;
<> 144:ef7eb2e8f9f7 171 if (timeOut<0) {
<> 144:ef7eb2e8f9f7 172 return 1;
<> 144:ef7eb2e8f9f7 173 }
<> 144:ef7eb2e8f9f7 174 }
<> 144:ef7eb2e8f9f7 175 obj->i2c->EVENTS_RXDREADY = 0;
<> 144:ef7eb2e8f9f7 176 *data = obj->i2c->RXD;
<> 144:ef7eb2e8f9f7 177
<> 144:ef7eb2e8f9f7 178 return 0;
<> 144:ef7eb2e8f9f7 179 }
<> 144:ef7eb2e8f9f7 180
<> 144:ef7eb2e8f9f7 181 void i2c_frequency(i2c_t *obj, int hz)
<> 144:ef7eb2e8f9f7 182 {
<> 144:ef7eb2e8f9f7 183 if (hz<250000) {
<> 144:ef7eb2e8f9f7 184 obj->freq = 100000;
<> 144:ef7eb2e8f9f7 185 obj->i2c->FREQUENCY = (TWI_FREQUENCY_FREQUENCY_K100 << TWI_FREQUENCY_FREQUENCY_Pos);
<> 144:ef7eb2e8f9f7 186 } else if (hz<400000) {
<> 144:ef7eb2e8f9f7 187 obj->freq = 250000;
<> 144:ef7eb2e8f9f7 188 obj->i2c->FREQUENCY = (TWI_FREQUENCY_FREQUENCY_K250 << TWI_FREQUENCY_FREQUENCY_Pos);
<> 144:ef7eb2e8f9f7 189 } else {
<> 144:ef7eb2e8f9f7 190 obj->freq = 400000;
<> 144:ef7eb2e8f9f7 191 obj->i2c->FREQUENCY = (TWI_FREQUENCY_FREQUENCY_K400 << TWI_FREQUENCY_FREQUENCY_Pos);
<> 144:ef7eb2e8f9f7 192 }
<> 144:ef7eb2e8f9f7 193 }
<> 144:ef7eb2e8f9f7 194
<> 144:ef7eb2e8f9f7 195 int checkError(i2c_t *obj)
<> 144:ef7eb2e8f9f7 196 {
<> 144:ef7eb2e8f9f7 197 if (obj->i2c->EVENTS_ERROR == 1) {
<> 144:ef7eb2e8f9f7 198 if (obj->i2c->ERRORSRC & TWI_ERRORSRC_ANACK_Msk) {
<> 144:ef7eb2e8f9f7 199 obj->i2c->EVENTS_ERROR = 0;
<> 144:ef7eb2e8f9f7 200 obj->i2c->TASKS_STOP = 1;
<> 144:ef7eb2e8f9f7 201 return I2C_ERROR_BUS_BUSY;
<> 144:ef7eb2e8f9f7 202 }
<> 144:ef7eb2e8f9f7 203
<> 144:ef7eb2e8f9f7 204 obj->i2c->EVENTS_ERROR = 0;
<> 144:ef7eb2e8f9f7 205 obj->i2c->TASKS_STOP = 1;
<> 144:ef7eb2e8f9f7 206 return I2C_ERROR_NO_SLAVE;
<> 144:ef7eb2e8f9f7 207 }
<> 144:ef7eb2e8f9f7 208 return 0;
<> 144:ef7eb2e8f9f7 209 }
<> 144:ef7eb2e8f9f7 210
<> 144:ef7eb2e8f9f7 211 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
<> 144:ef7eb2e8f9f7 212 {
<> 144:ef7eb2e8f9f7 213 int status, count, errorResult;
<> 144:ef7eb2e8f9f7 214 obj->i2c->ADDRESS = (address >> 1);
<> 144:ef7eb2e8f9f7 215 obj->i2c->SHORTS = 1; // to trigger suspend task when a byte is received
<> 144:ef7eb2e8f9f7 216 obj->i2c->EVENTS_RXDREADY = 0;
<> 144:ef7eb2e8f9f7 217 obj->i2c->TASKS_STARTRX = 1;
<> 144:ef7eb2e8f9f7 218
<> 144:ef7eb2e8f9f7 219 // Read in all except last byte
<> 144:ef7eb2e8f9f7 220 for (count = 0; count < (length - 1); count++) {
<> 144:ef7eb2e8f9f7 221 status = i2c_do_read(obj, &data[count], 0);
<> 144:ef7eb2e8f9f7 222 if (status) {
<> 144:ef7eb2e8f9f7 223 errorResult = checkError(obj);
<> 144:ef7eb2e8f9f7 224 i2c_reset(obj);
<> 144:ef7eb2e8f9f7 225 if (errorResult<0) {
<> 144:ef7eb2e8f9f7 226 return errorResult;
<> 144:ef7eb2e8f9f7 227 }
<> 144:ef7eb2e8f9f7 228 return count;
<> 144:ef7eb2e8f9f7 229 }
<> 144:ef7eb2e8f9f7 230 }
<> 144:ef7eb2e8f9f7 231
<> 144:ef7eb2e8f9f7 232 // read in last byte
<> 144:ef7eb2e8f9f7 233 status = i2c_do_read(obj, &data[length - 1], 1);
<> 144:ef7eb2e8f9f7 234 if (status) {
<> 144:ef7eb2e8f9f7 235 i2c_reset(obj);
<> 144:ef7eb2e8f9f7 236 return length - 1;
<> 144:ef7eb2e8f9f7 237 }
<> 144:ef7eb2e8f9f7 238 // If not repeated start, send stop.
<> 144:ef7eb2e8f9f7 239 if (stop) {
<> 144:ef7eb2e8f9f7 240 while (!obj->i2c->EVENTS_STOPPED) {
<> 144:ef7eb2e8f9f7 241 }
<> 144:ef7eb2e8f9f7 242 obj->i2c->EVENTS_STOPPED = 0;
<> 144:ef7eb2e8f9f7 243 }
<> 144:ef7eb2e8f9f7 244 return length;
<> 144:ef7eb2e8f9f7 245 }
<> 144:ef7eb2e8f9f7 246
<> 144:ef7eb2e8f9f7 247 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
<> 144:ef7eb2e8f9f7 248 {
<> 144:ef7eb2e8f9f7 249 int status, errorResult;
<> 144:ef7eb2e8f9f7 250 obj->i2c->ADDRESS = (address >> 1);
<> 144:ef7eb2e8f9f7 251 obj->i2c->SHORTS = 0;
<> 144:ef7eb2e8f9f7 252 obj->i2c->TASKS_STARTTX = 1;
<> 144:ef7eb2e8f9f7 253
<> 144:ef7eb2e8f9f7 254 for (int i = 0; i<length; i++) {
<> 144:ef7eb2e8f9f7 255 status = i2c_do_write(obj, data[i]);
<> 144:ef7eb2e8f9f7 256 if (status) {
<> 144:ef7eb2e8f9f7 257 i2c_reset(obj);
<> 144:ef7eb2e8f9f7 258 errorResult = checkError(obj);
<> 144:ef7eb2e8f9f7 259 if (errorResult<0) {
<> 144:ef7eb2e8f9f7 260 return errorResult;
<> 144:ef7eb2e8f9f7 261 }
<> 144:ef7eb2e8f9f7 262 return i;
<> 144:ef7eb2e8f9f7 263 }
<> 144:ef7eb2e8f9f7 264 }
<> 144:ef7eb2e8f9f7 265
<> 144:ef7eb2e8f9f7 266 // If not repeated start, send stop.
<> 144:ef7eb2e8f9f7 267 if (stop) {
<> 144:ef7eb2e8f9f7 268 if (i2c_stop(obj)) {
<> 144:ef7eb2e8f9f7 269 return I2C_ERROR_NO_SLAVE;
<> 144:ef7eb2e8f9f7 270 }
<> 144:ef7eb2e8f9f7 271 }
<> 144:ef7eb2e8f9f7 272 return length;
<> 144:ef7eb2e8f9f7 273 }
<> 144:ef7eb2e8f9f7 274
<> 144:ef7eb2e8f9f7 275 int i2c_byte_read(i2c_t *obj, int last)
<> 144:ef7eb2e8f9f7 276 {
<> 144:ef7eb2e8f9f7 277 char data;
<> 144:ef7eb2e8f9f7 278 int status;
<> 144:ef7eb2e8f9f7 279
<> 144:ef7eb2e8f9f7 280 status = i2c_do_read(obj, &data, last);
<> 144:ef7eb2e8f9f7 281 if (status) {
<> 144:ef7eb2e8f9f7 282 i2c_reset(obj);
<> 144:ef7eb2e8f9f7 283 }
<> 144:ef7eb2e8f9f7 284 return data;
<> 144:ef7eb2e8f9f7 285 }
<> 144:ef7eb2e8f9f7 286
<> 144:ef7eb2e8f9f7 287 int i2c_byte_write(i2c_t *obj, int data)
<> 144:ef7eb2e8f9f7 288 {
<> 144:ef7eb2e8f9f7 289 int status = 0;
<> 144:ef7eb2e8f9f7 290 if (!obj->address_set) {
<> 144:ef7eb2e8f9f7 291 obj->address_set = 1;
<> 144:ef7eb2e8f9f7 292 obj->i2c->ADDRESS = (data >> 1);
<> 144:ef7eb2e8f9f7 293
<> 144:ef7eb2e8f9f7 294 if (data & 1) {
<> 144:ef7eb2e8f9f7 295 obj->i2c->EVENTS_RXDREADY = 0;
<> 144:ef7eb2e8f9f7 296 obj->i2c->SHORTS = 1;
<> 144:ef7eb2e8f9f7 297 obj->i2c->TASKS_STARTRX = 1;
<> 144:ef7eb2e8f9f7 298 } else {
<> 144:ef7eb2e8f9f7 299 obj->i2c->SHORTS = 0;
<> 144:ef7eb2e8f9f7 300 obj->i2c->TASKS_STARTTX = 1;
<> 144:ef7eb2e8f9f7 301 }
<> 144:ef7eb2e8f9f7 302 } else {
<> 144:ef7eb2e8f9f7 303 status = i2c_do_write(obj, data);
<> 144:ef7eb2e8f9f7 304 if (status) {
<> 144:ef7eb2e8f9f7 305 i2c_reset(obj);
<> 144:ef7eb2e8f9f7 306 }
<> 144:ef7eb2e8f9f7 307 }
<> 144:ef7eb2e8f9f7 308 return (1 - status);
<> 144:ef7eb2e8f9f7 309 }