Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

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