LTC2945 ported

Dependencies:   mbed

Committer:
odtulumbedder
Date:
Wed Sep 20 09:03:56 2017 +0000
Revision:
4:d32eaca53504
Parent:
3:2ab78e7e8518
I decided to remove the C-linkage specifiers, they are really not that necessary.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
odtulumbedder 0:6be57f391716 1 #include "LT_I2C.h"
odtulumbedder 0:6be57f391716 2
odtulumbedder 0:6be57f391716 3 /* mbed headers */
odtulumbedder 0:6be57f391716 4 #include <mbed.h>
odtulumbedder 0:6be57f391716 5 #include <I2C.h>
odtulumbedder 0:6be57f391716 6
odtulumbedder 2:7e390bcce297 7 I2C *i2c_object = NULL;
odtulumbedder 1:6d4265aa4184 8
odtulumbedder 0:6be57f391716 9 int lt_i2c_init(int sda, int scl) {
odtulumbedder 0:6be57f391716 10 if (i2c_object == NULL) {
odtulumbedder 0:6be57f391716 11 i2c_object = new I2C((PinName) sda, (PinName) scl);
odtulumbedder 0:6be57f391716 12 return LT_I2C_INIT_FINE;
odtulumbedder 0:6be57f391716 13 }
odtulumbedder 0:6be57f391716 14 else {
odtulumbedder 0:6be57f391716 15 return LT_I2C_INIT_QUIT_FIRST;
odtulumbedder 0:6be57f391716 16 }
odtulumbedder 0:6be57f391716 17 }
odtulumbedder 0:6be57f391716 18
odtulumbedder 0:6be57f391716 19 int lt_i2c_quit() {
odtulumbedder 0:6be57f391716 20 delete i2c_object;
odtulumbedder 0:6be57f391716 21 return LT_I2C_SUCCESS;
odtulumbedder 0:6be57f391716 22 }
odtulumbedder 0:6be57f391716 23
odtulumbedder 0:6be57f391716 24 int lt_i2c_init_attach(void *p_i2c_object) {
odtulumbedder 0:6be57f391716 25 if (i2c_object == NULL) {
odtulumbedder 0:6be57f391716 26 i2c_object = (I2C *) p_i2c_object;
odtulumbedder 0:6be57f391716 27 return LT_I2C_INIT_FINE;
odtulumbedder 0:6be57f391716 28 }
odtulumbedder 0:6be57f391716 29 else {
odtulumbedder 0:6be57f391716 30 return LT_I2C_INIT_QUIT_FIRST;
odtulumbedder 0:6be57f391716 31 }
odtulumbedder 0:6be57f391716 32 }
odtulumbedder 0:6be57f391716 33
odtulumbedder 0:6be57f391716 34 void *lt_i2c_get_i2c_object() {
odtulumbedder 0:6be57f391716 35 return i2c_object;
odtulumbedder 0:6be57f391716 36 }
odtulumbedder 0:6be57f391716 37
odtulumbedder 0:6be57f391716 38 int lt_i2c_start() {
odtulumbedder 0:6be57f391716 39 i2c_object->start();
odtulumbedder 0:6be57f391716 40 return LT_I2C_SUCCESS;
odtulumbedder 0:6be57f391716 41 }
odtulumbedder 0:6be57f391716 42
odtulumbedder 0:6be57f391716 43 int lt_i2c_stop() {
odtulumbedder 0:6be57f391716 44 i2c_object->stop();
odtulumbedder 0:6be57f391716 45 return LT_I2C_SUCCESS;
odtulumbedder 0:6be57f391716 46 }
odtulumbedder 0:6be57f391716 47
odtulumbedder 0:6be57f391716 48 uint8_t lt_i2c_write(uint8_t data) {
odtulumbedder 2:7e390bcce297 49 return 1-i2c_object->write(data);
odtulumbedder 0:6be57f391716 50 }
odtulumbedder 0:6be57f391716 51
odtulumbedder 0:6be57f391716 52 uint8_t lt_i2c_read(int8_t ack) {
odtulumbedder 0:6be57f391716 53 return (uint8_t) (i2c_object->read(1-ack)); // act is different in mbed
odtulumbedder 0:6be57f391716 54 }
odtulumbedder 0:6be57f391716 55
odtulumbedder 0:6be57f391716 56 int8_t lt_i2c_write_byte_data(
odtulumbedder 0:6be57f391716 57 uint8_t address,
odtulumbedder 0:6be57f391716 58 uint8_t command,
odtulumbedder 0:6be57f391716 59 uint8_t value) {
odtulumbedder 0:6be57f391716 60 int8_t ret = 0;
odtulumbedder 0:6be57f391716 61 if (lt_i2c_start()!=0) //I2C START
odtulumbedder 1:6d4265aa4184 62 {
odtulumbedder 0:6be57f391716 63 return(1); //Stop and return 0 if START fail
odtulumbedder 1:6d4265aa4184 64 }
odtulumbedder 0:6be57f391716 65 ret |= lt_i2c_write((address<<1)|LT_I2C_WRITE_BIT);
odtulumbedder 0:6be57f391716 66 // Write 7 bit address with W bit
odtulumbedder 0:6be57f391716 67 ret|= lt_i2c_write(command); // Set register to be read to command
odtulumbedder 0:6be57f391716 68 ret|= lt_i2c_write(value);
odtulumbedder 0:6be57f391716 69 lt_i2c_stop(); // I2C STOP
odtulumbedder 0:6be57f391716 70 if (ret!=0) //If there was a NAK return 1
odtulumbedder 1:6d4265aa4184 71 {
odtulumbedder 0:6be57f391716 72 return(1);
odtulumbedder 1:6d4265aa4184 73 }
odtulumbedder 0:6be57f391716 74 return(0); // Return success
odtulumbedder 0:6be57f391716 75 }
odtulumbedder 0:6be57f391716 76
odtulumbedder 0:6be57f391716 77 int8_t lt_i2c_write_word_data(
odtulumbedder 0:6be57f391716 78 uint8_t address,
odtulumbedder 0:6be57f391716 79 uint8_t command,
odtulumbedder 0:6be57f391716 80 uint16_t value) {
odtulumbedder 0:6be57f391716 81 int8_t ret=0;
odtulumbedder 0:6be57f391716 82 union
odtulumbedder 0:6be57f391716 83 {
odtulumbedder 0:6be57f391716 84 uint8_t b[2];
odtulumbedder 0:6be57f391716 85 uint16_t w;
odtulumbedder 0:6be57f391716 86 } data;
odtulumbedder 0:6be57f391716 87 data.w = value;
odtulumbedder 0:6be57f391716 88 if (lt_i2c_start()!=0) //I2C START
odtulumbedder 1:6d4265aa4184 89 {
odtulumbedder 0:6be57f391716 90 return(1); //Stop and return 0 if START fail
odtulumbedder 1:6d4265aa4184 91 }
odtulumbedder 0:6be57f391716 92 ret |= lt_i2c_write((address<<1)|LT_I2C_WRITE_BIT);
odtulumbedder 0:6be57f391716 93 // Write 7 bit address with W bit
odtulumbedder 0:6be57f391716 94 ret|= lt_i2c_write(command); // Set register to be read to command
odtulumbedder 0:6be57f391716 95 ret|= lt_i2c_write(data.b[1]); //Write MSB
odtulumbedder 0:6be57f391716 96 ret|= lt_i2c_write(data.b[0]); //Write LSB;
odtulumbedder 0:6be57f391716 97 lt_i2c_stop(); // I2C STOP
odtulumbedder 0:6be57f391716 98 if (ret!=0) //If there was a NAK return 1
odtulumbedder 1:6d4265aa4184 99 {
odtulumbedder 2:7e390bcce297 100 return(1);
odtulumbedder 1:6d4265aa4184 101 }
odtulumbedder 0:6be57f391716 102 return(0);
odtulumbedder 0:6be57f391716 103 }
odtulumbedder 0:6be57f391716 104
odtulumbedder 0:6be57f391716 105 uint8_t lt_i2c_write_block_data(
odtulumbedder 0:6be57f391716 106 uint8_t address,
odtulumbedder 0:6be57f391716 107 uint8_t command,
odtulumbedder 0:6be57f391716 108 uint8_t length,
odtulumbedder 0:6be57f391716 109 uint8_t *values) {
odtulumbedder 0:6be57f391716 110 int8_t i = length-1;
odtulumbedder 0:6be57f391716 111 int8_t ret = 0;
odtulumbedder 0:6be57f391716 112 if (lt_i2c_start()!=0) //I2C START
odtulumbedder 0:6be57f391716 113 return(1); //Stop and return 0 if START fail
odtulumbedder 0:6be57f391716 114 ret |= lt_i2c_write((address<<1)|LT_I2C_WRITE_BIT);
odtulumbedder 0:6be57f391716 115 // Write 7 bit address with W bit
odtulumbedder 0:6be57f391716 116 ret|= lt_i2c_write(command); // Set register to be read to command
odtulumbedder 0:6be57f391716 117 while (i>=0)
odtulumbedder 0:6be57f391716 118 {
odtulumbedder 0:6be57f391716 119 ret|= lt_i2c_write(values[i]); //Write Value
odtulumbedder 0:6be57f391716 120 i--;
odtulumbedder 0:6be57f391716 121 }
odtulumbedder 0:6be57f391716 122 lt_i2c_stop(); // I2C STOP
odtulumbedder 0:6be57f391716 123 if (ret!=0)
odtulumbedder 1:6d4265aa4184 124 {
odtulumbedder 0:6be57f391716 125 return(1);
odtulumbedder 1:6d4265aa4184 126 }
odtulumbedder 0:6be57f391716 127 else
odtulumbedder 1:6d4265aa4184 128 {
odtulumbedder 0:6be57f391716 129 return(0); // Success!
odtulumbedder 1:6d4265aa4184 130 }
odtulumbedder 0:6be57f391716 131 }
odtulumbedder 0:6be57f391716 132
odtulumbedder 0:6be57f391716 133 uint8_t lt_i2c_read_byte_data(
odtulumbedder 0:6be57f391716 134 uint8_t address,
odtulumbedder 0:6be57f391716 135 uint8_t command,
odtulumbedder 0:6be57f391716 136 uint8_t *value) {
odtulumbedder 0:6be57f391716 137 int8_t ret = 0;
odtulumbedder 0:6be57f391716 138 if (lt_i2c_start() != 0) // I2C START
odtulumbedder 0:6be57f391716 139 {
odtulumbedder 0:6be57f391716 140 return (1); // Stop and return 0 if START fail
odtulumbedder 0:6be57f391716 141 }
odtulumbedder 0:6be57f391716 142 ret |= lt_i2c_write((address << 1) | LT_I2C_WRITE_BIT); // Write 7 bit address with W bit
odtulumbedder 0:6be57f391716 143 if (ret != 0) // If NACK return 1
odtulumbedder 0:6be57f391716 144 {
odtulumbedder 0:6be57f391716 145 lt_i2c_stop(); // I2C STOP
odtulumbedder 0:6be57f391716 146 return (1);
odtulumbedder 0:6be57f391716 147 }
odtulumbedder 0:6be57f391716 148 ret |= lt_i2c_write(command); // Set register to be read to command
odtulumbedder 0:6be57f391716 149 if (ret != 0) // If NACK return 1
odtulumbedder 0:6be57f391716 150 {
odtulumbedder 0:6be57f391716 151 lt_i2c_stop(); // I2C STOP
odtulumbedder 0:6be57f391716 152 return (1);
odtulumbedder 0:6be57f391716 153 }
odtulumbedder 0:6be57f391716 154 if (lt_i2c_start() != 0) // I2C repeated START
odtulumbedder 0:6be57f391716 155 {
odtulumbedder 0:6be57f391716 156 lt_i2c_stop(); // Attempt to issue I2C STOP
odtulumbedder 0:6be57f391716 157 return (1); // Stop and return 0 if START fail
odtulumbedder 0:6be57f391716 158 }
odtulumbedder 0:6be57f391716 159 ret |= lt_i2c_write((address << 1) | LT_I2C_READ_BIT); // Write 7 bit address with R bit
odtulumbedder 0:6be57f391716 160 *value = lt_i2c_read(LT_I2C_WITH_NACK); // Read byte from buffer with NAK
odtulumbedder 0:6be57f391716 161 lt_i2c_stop(); // I2C STOP
odtulumbedder 0:6be57f391716 162 if (ret != 0) // If there was a NACK return 1
odtulumbedder 0:6be57f391716 163 {
odtulumbedder 0:6be57f391716 164 return (1);
odtulumbedder 0:6be57f391716 165 }
odtulumbedder 0:6be57f391716 166 return (0); // Return success
odtulumbedder 0:6be57f391716 167 }
odtulumbedder 0:6be57f391716 168
odtulumbedder 0:6be57f391716 169 uint8_t lt_i2c_read_word_data(
odtulumbedder 0:6be57f391716 170 uint8_t address,
odtulumbedder 0:6be57f391716 171 uint8_t command,
odtulumbedder 0:6be57f391716 172 uint16_t *value) {
odtulumbedder 0:6be57f391716 173 int8_t ret = 0;
odtulumbedder 0:6be57f391716 174 union {
odtulumbedder 0:6be57f391716 175 uint8_t b[2];
odtulumbedder 0:6be57f391716 176 uint16_t w;
odtulumbedder 0:6be57f391716 177 } data;
odtulumbedder 0:6be57f391716 178 if (lt_i2c_start() != 0) //I2C START
odtulumbedder 1:6d4265aa4184 179 {
odtulumbedder 0:6be57f391716 180 return (1); //Stop and return 0 if START fail
odtulumbedder 1:6d4265aa4184 181 }
odtulumbedder 0:6be57f391716 182 ret |= lt_i2c_write((address << 1) | LT_I2C_WRITE_BIT); // Write 7 bit address with W bit
odtulumbedder 0:6be57f391716 183 if (ret != 0) //If NACK return 1
odtulumbedder 0:6be57f391716 184 {
odtulumbedder 0:6be57f391716 185 lt_i2c_stop(); //I2C STOP
odtulumbedder 0:6be57f391716 186 return (1);
odtulumbedder 0:6be57f391716 187 }
odtulumbedder 0:6be57f391716 188 ret |= lt_i2c_write(command); // Set register to be read to command
odtulumbedder 0:6be57f391716 189 if (ret != 0) //If NACK return 1
odtulumbedder 0:6be57f391716 190 {
odtulumbedder 0:6be57f391716 191 lt_i2c_stop(); //I2C STOP
odtulumbedder 0:6be57f391716 192 return (1);
odtulumbedder 0:6be57f391716 193 }
odtulumbedder 0:6be57f391716 194 if (lt_i2c_start() != 0) //I2C START
odtulumbedder 0:6be57f391716 195 {
odtulumbedder 0:6be57f391716 196 lt_i2c_stop(); //Attempt to issue I2C STOP
odtulumbedder 0:6be57f391716 197 return (1); //Stop and return 0 if START fail
odtulumbedder 0:6be57f391716 198 }
odtulumbedder 0:6be57f391716 199 ret |= lt_i2c_write((address << 1) | LT_I2C_READ_BIT); // Write 7 bit address with R bit
odtulumbedder 0:6be57f391716 200 data.b[1] = lt_i2c_read(LT_I2C_WITH_ACK); // Read MSB from buffer
odtulumbedder 0:6be57f391716 201 data.b[0] = lt_i2c_read(LT_I2C_WITH_NACK); // Read LSB from buffer
odtulumbedder 0:6be57f391716 202 lt_i2c_stop(); //I2C STOP
odtulumbedder 0:6be57f391716 203 *value = data.w;
odtulumbedder 0:6be57f391716 204 if (ret != 0) //If NAK
odtulumbedder 1:6d4265aa4184 205 {
odtulumbedder 0:6be57f391716 206 return (1); //return 1
odtulumbedder 1:6d4265aa4184 207 }
odtulumbedder 0:6be57f391716 208 return (0); // Return success
odtulumbedder 0:6be57f391716 209 }
odtulumbedder 0:6be57f391716 210
odtulumbedder 0:6be57f391716 211 uint8_t lt_i2c_read_block_data(
odtulumbedder 0:6be57f391716 212 uint8_t address,
odtulumbedder 0:6be57f391716 213 uint8_t command,
odtulumbedder 0:6be57f391716 214 uint8_t length,
odtulumbedder 0:6be57f391716 215 uint8_t *values) {
odtulumbedder 0:6be57f391716 216 uint8_t i = (length - 1);
odtulumbedder 0:6be57f391716 217 int8_t ret = 0;
odtulumbedder 0:6be57f391716 218 if (lt_i2c_start() != 0) //I2C START
odtulumbedder 1:6d4265aa4184 219 {
odtulumbedder 0:6be57f391716 220 return (1); //Stop and return 0 if START fail
odtulumbedder 1:6d4265aa4184 221 }
odtulumbedder 0:6be57f391716 222 ret |= lt_i2c_write((address << 1) | LT_I2C_WRITE_BIT); //Write 7-bit address with W bit
odtulumbedder 0:6be57f391716 223 if (ret != 0) //If NACK return 1
odtulumbedder 0:6be57f391716 224 {
odtulumbedder 0:6be57f391716 225 lt_i2c_stop(); //I2C STOP
odtulumbedder 0:6be57f391716 226 return (1);
odtulumbedder 0:6be57f391716 227 }
odtulumbedder 0:6be57f391716 228 ret |= lt_i2c_write(command); //Write 8 bit command word
odtulumbedder 0:6be57f391716 229 if (ret != 0) //If NACK return 1
odtulumbedder 0:6be57f391716 230 {
odtulumbedder 0:6be57f391716 231 lt_i2c_stop(); //I2C STOP
odtulumbedder 0:6be57f391716 232 return (1);
odtulumbedder 0:6be57f391716 233 }
odtulumbedder 0:6be57f391716 234 if (lt_i2c_start() != 0) //I2C repeated START
odtulumbedder 0:6be57f391716 235 {
odtulumbedder 0:6be57f391716 236 lt_i2c_stop(); //Attempt to issue I2C STOP
odtulumbedder 0:6be57f391716 237 return (1); //Stop and return 0 if START fail
odtulumbedder 0:6be57f391716 238 }
odtulumbedder 0:6be57f391716 239 ret |= lt_i2c_write((address << 1) | LT_I2C_READ_BIT); //Write 7-bit address with R bit
odtulumbedder 0:6be57f391716 240 if (ret != 0) //If NACK return 1
odtulumbedder 0:6be57f391716 241 {
odtulumbedder 0:6be57f391716 242 lt_i2c_stop(); //I2C STOP
odtulumbedder 0:6be57f391716 243 return (1);
odtulumbedder 0:6be57f391716 244 }
odtulumbedder 0:6be57f391716 245 while (i > 0) //Begin read loop
odtulumbedder 0:6be57f391716 246 {
odtulumbedder 0:6be57f391716 247 values[i] = lt_i2c_read(LT_I2C_WITH_ACK); //Read from bus with ACK
odtulumbedder 0:6be57f391716 248 i--;
odtulumbedder 0:6be57f391716 249 }
odtulumbedder 0:6be57f391716 250 values[0] = lt_i2c_read(LT_I2C_WITH_NACK); //Read from bus with NACK for the last one;
odtulumbedder 0:6be57f391716 251 lt_i2c_stop(); //I2C STOP
odtulumbedder 0:6be57f391716 252 return (0); // Success!
odtulumbedder 0:6be57f391716 253 }