LTC2945 ported

Dependencies:   mbed

Committer:
odtulumbedder
Date:
Wed Aug 23 10:49:21 2017 +0000
Revision:
0:6be57f391716
Child:
1:6d4265aa4184
initial problematic code

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