This class provides simplified I2C access to a Microchip 24LCxx Serial EEPROM device: - Rename the class (C2424 -> C24) - Add EraseMemoryArea method - Add DumpMemoryArea method only accessible in DEBUG mode - Add 'const' qualifier in parameters

Fork of 24LCxx_I2C by Yann Garcia

Committer:
acesrobertm
Date:
Mon Sep 25 18:59:44 2017 +0000
Revision:
3:5df584fbabfe
Parent:
2:16ce7dae9019
Child:
4:650f3259bd4f
Bug fixes and modifications my my program.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yann 0:21c698aa86f6 1 /* mbed simplified access to Microchip 24LCxx Serial EEPROM devices (I2C)
Yann 0:21c698aa86f6 2 * Copyright (c) 2010-2012 ygarcia, MIT License
Yann 0:21c698aa86f6 3 *
Yann 0:21c698aa86f6 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Yann 0:21c698aa86f6 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
Yann 0:21c698aa86f6 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
Yann 0:21c698aa86f6 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Yann 0:21c698aa86f6 8 * furnished to do so, subject to the following conditions:
Yann 0:21c698aa86f6 9 *
Yann 0:21c698aa86f6 10 * The above copyright notice and this permission notice shall be included in all copies or
Yann 0:21c698aa86f6 11 * substantial portions of the Software.
Yann 0:21c698aa86f6 12 *
Yann 0:21c698aa86f6 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Yann 0:21c698aa86f6 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Yann 0:21c698aa86f6 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Yann 0:21c698aa86f6 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Yann 0:21c698aa86f6 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Yann 0:21c698aa86f6 18 */
Yann 0:21c698aa86f6 19 #include <iostream>
Yann 0:21c698aa86f6 20 #include <sstream>
Yann 0:21c698aa86f6 21
Yann 0:21c698aa86f6 22 #include "24LCxx_I2C.h"
Yann 0:21c698aa86f6 23
Yann 0:21c698aa86f6 24 namespace _24LCXX_I2C {
Yann 0:21c698aa86f6 25
Yann 1:bdf87ab4cdb8 26 unsigned char C24LCXX_I2C::I2CModuleRefCounter = 0;
Yann 0:21c698aa86f6 27
Yann 2:16ce7dae9019 28 C24LCXX_I2C::C24LCXX_I2C(const PinName p_sda, const PinName p_scl, const unsigned char p_address, const PinName p_wp, const unsigned int p_frequency) : _internalId("") {
Yann 1:bdf87ab4cdb8 29 if (C24LCXX_I2C::I2CModuleRefCounter != 0) {
Yann 0:21c698aa86f6 30 error("C24LCXX_I2C: Wrong params");
Yann 0:21c698aa86f6 31 }
Yann 0:21c698aa86f6 32 #ifdef __DEBUG
Yann 0:21c698aa86f6 33 std::ostringstream out(std::ostringstream::out);
Yann 1:bdf87ab4cdb8 34 out << "C24LCXX_I2C #" << C24LCXX_I2C::I2CModuleRefCounter;
Yann 0:21c698aa86f6 35 _internalId.assign(out.str());
Yann 0:21c698aa86f6 36 DEBUG("C24LCXX_I2C: _internalId='%s'", _internalId.c_str())
Yann 0:21c698aa86f6 37 #endif // __DEBUG
acesrobertm 3:5df584fbabfe 38 _i2cInstance = new I2C(p_sda, p_scl); //, "24LCxx_I2C"
Yann 1:bdf87ab4cdb8 39 C24LCXX_I2C::I2CModuleRefCounter += 1;
Yann 0:21c698aa86f6 40
Yann 0:21c698aa86f6 41 _slaveAddress = (p_address << 1) | 0xa0; // Slave address format is: 1 0 1 0 A3 A2 A1 R/W
Yann 0:21c698aa86f6 42 _i2cInstance->frequency(p_frequency); // Set the frequency of the I2C interface
Yann 0:21c698aa86f6 43 if (p_wp != NC) {
Yann 0:21c698aa86f6 44 _wp = new DigitalOut(p_wp);
Yann 0:21c698aa86f6 45 _wp->write(0); // Disable write protect
Yann 0:21c698aa86f6 46 } else {
Yann 0:21c698aa86f6 47 _wp = NULL; // Not used
Yann 0:21c698aa86f6 48 }
Yann 0:21c698aa86f6 49 }
Yann 0:21c698aa86f6 50
Yann 0:21c698aa86f6 51 C24LCXX_I2C::~C24LCXX_I2C() {
Yann 0:21c698aa86f6 52 // Release I2C instance
Yann 1:bdf87ab4cdb8 53 C24LCXX_I2C::I2CModuleRefCounter -= 1;
Yann 1:bdf87ab4cdb8 54 if (C24LCXX_I2C::I2CModuleRefCounter == 0) {
Yann 0:21c698aa86f6 55 delete _i2cInstance;
Yann 0:21c698aa86f6 56 _i2cInstance = NULL;
Yann 0:21c698aa86f6 57 }
Yann 0:21c698aa86f6 58 // Release _wp if required
Yann 0:21c698aa86f6 59 if (_wp != NULL) {
Yann 0:21c698aa86f6 60 _wp->write(0);
Yann 0:21c698aa86f6 61 delete _wp;
Yann 0:21c698aa86f6 62 }
Yann 0:21c698aa86f6 63 }
Yann 0:21c698aa86f6 64
Yann 0:21c698aa86f6 65 bool C24LCXX_I2C::WriteProtect(const bool p_writeProtect) {
Yann 0:21c698aa86f6 66 if (_wp != NULL) {
Yann 0:21c698aa86f6 67 _wp->write((int)(p_writeProtect));
Yann 0:21c698aa86f6 68 return true;
Yann 0:21c698aa86f6 69 }
Yann 0:21c698aa86f6 70
Yann 0:21c698aa86f6 71 return false;
Yann 0:21c698aa86f6 72 }
Yann 0:21c698aa86f6 73
Yann 0:21c698aa86f6 74 bool C24LCXX_I2C::EraseMemoryArea(const short p_startAddress, const int p_count, const unsigned char p_pattern) {
Yann 0:21c698aa86f6 75 std::vector<unsigned char> eraseBuffer(p_count, p_pattern);
Yann 0:21c698aa86f6 76 return Write(p_startAddress, eraseBuffer, false);
Yann 0:21c698aa86f6 77 }
Yann 0:21c698aa86f6 78
Yann 0:21c698aa86f6 79 bool C24LCXX_I2C::Write(const short p_address, const unsigned char p_byte) {
Yann 0:21c698aa86f6 80 // 1.Prepare buffer
Yann 0:21c698aa86f6 81 char i2cBuffer[3]; // Memory address + one byte of data
Yann 0:21c698aa86f6 82 // 1.1. Memory address
acesrobertm 3:5df584fbabfe 83 short address = p_address;
Yann 0:21c698aa86f6 84 i2cBuffer[0] = (unsigned char)(address >> 8);
Yann 0:21c698aa86f6 85 i2cBuffer[1] = (unsigned char)((unsigned char)address & 0xff);
Yann 0:21c698aa86f6 86 // 1.2. Datas
Yann 0:21c698aa86f6 87 i2cBuffer[2] = p_byte;
Yann 0:21c698aa86f6 88
Yann 0:21c698aa86f6 89 // 2. Send I2C start + I2C address + Memory Address + Datas + I2C stop
Yann 0:21c698aa86f6 90 int result = _i2cInstance->write(_slaveAddress, i2cBuffer, 3);
Yann 0:21c698aa86f6 91 wait(0.02);
Yann 0:21c698aa86f6 92
Yann 0:21c698aa86f6 93 return (bool)(result == 0);
Yann 0:21c698aa86f6 94 }
Yann 0:21c698aa86f6 95
Yann 0:21c698aa86f6 96 bool C24LCXX_I2C::Write(const short p_address, const short p_short, const C24LCXX_I2C::Mode p_mode) {
Yann 0:21c698aa86f6 97 // 1.Prepare buffer
Yann 0:21c698aa86f6 98 char i2cBuffer[4]; // Memory address + one short (2 bytes)
Yann 0:21c698aa86f6 99 // 1.1. Memory address
acesrobertm 3:5df584fbabfe 100 short address = p_address;
Yann 0:21c698aa86f6 101 i2cBuffer[0] = (unsigned char)(address >> 8);
Yann 0:21c698aa86f6 102 i2cBuffer[1] = (unsigned char)((unsigned char)address & 0xff);
Yann 0:21c698aa86f6 103 // 1.2. Datas
Yann 0:21c698aa86f6 104 if (p_mode == BigEndian) {
Yann 0:21c698aa86f6 105 i2cBuffer[2] = (unsigned char)(p_short >> 8);
Yann 0:21c698aa86f6 106 i2cBuffer[3] = (unsigned char)((unsigned char)p_short & 0xff);
Yann 0:21c698aa86f6 107 } else {
Yann 0:21c698aa86f6 108 i2cBuffer[2] = (unsigned char)((unsigned char)p_short & 0xff);
Yann 0:21c698aa86f6 109 i2cBuffer[3] = (unsigned char)(p_short >> 8);
Yann 0:21c698aa86f6 110 }
Yann 0:21c698aa86f6 111
Yann 0:21c698aa86f6 112 // 2. Send I2C start + I2C address + Memory Address + Datas + I2C stop
Yann 0:21c698aa86f6 113 int result = _i2cInstance->write(_slaveAddress, i2cBuffer, 4);
Yann 0:21c698aa86f6 114 wait(0.02);
Yann 0:21c698aa86f6 115
Yann 0:21c698aa86f6 116 return (bool)(result == 0);
Yann 0:21c698aa86f6 117 }
Yann 0:21c698aa86f6 118
Yann 0:21c698aa86f6 119 bool C24LCXX_I2C::Write(const short p_address, const int p_int, const C24LCXX_I2C::Mode p_mode) {
Yann 0:21c698aa86f6 120 // 1.Prepare buffer
Yann 0:21c698aa86f6 121 char i2cBuffer[6]; // Memory address + one integer (4 bytes)
Yann 0:21c698aa86f6 122 // 1.1. Memory address
acesrobertm 3:5df584fbabfe 123 short address = p_address;
Yann 0:21c698aa86f6 124 i2cBuffer[0] = (unsigned char)(address >> 8);
Yann 0:21c698aa86f6 125 i2cBuffer[1] = (unsigned char)((unsigned char)address & 0xff);
Yann 0:21c698aa86f6 126 // 1.2. Datas
Yann 0:21c698aa86f6 127 if (p_mode == BigEndian) {
Yann 0:21c698aa86f6 128 i2cBuffer[2] = (unsigned char)(p_int >> 24);
Yann 0:21c698aa86f6 129 i2cBuffer[3] = (unsigned char)(p_int >> 16);
Yann 0:21c698aa86f6 130 i2cBuffer[4] = (unsigned char)(p_int >> 8);
Yann 0:21c698aa86f6 131 i2cBuffer[5] = (unsigned char)((unsigned char)p_int & 0xff);
Yann 0:21c698aa86f6 132 } else {
Yann 0:21c698aa86f6 133 i2cBuffer[2] = (unsigned char)((unsigned char)p_int & 0xff);
Yann 0:21c698aa86f6 134 i2cBuffer[3] = (unsigned char)(p_int >> 8);
Yann 0:21c698aa86f6 135 i2cBuffer[4] = (unsigned char)(p_int >> 16);
Yann 0:21c698aa86f6 136 i2cBuffer[5] = (unsigned char)(p_int >> 24);
Yann 0:21c698aa86f6 137 }
Yann 0:21c698aa86f6 138
Yann 0:21c698aa86f6 139 // 2. Send I2C start + I2C address + Memory Address + Datas + I2C stop
Yann 0:21c698aa86f6 140 int result = _i2cInstance->write(_slaveAddress, i2cBuffer, 6);
Yann 0:21c698aa86f6 141 wait(0.02);
Yann 0:21c698aa86f6 142
Yann 0:21c698aa86f6 143 return (bool)(result == 0);
Yann 0:21c698aa86f6 144 }
Yann 0:21c698aa86f6 145
Yann 0:21c698aa86f6 146 bool C24LCXX_I2C::Write(const short p_address, const std::string & p_string, const bool p_storeLength, const int p_length2write) {
Yann 0:21c698aa86f6 147 return Write(p_address, p_string.c_str(), p_storeLength, p_length2write);
Yann 0:21c698aa86f6 148 }
Yann 0:21c698aa86f6 149
Yann 0:21c698aa86f6 150 bool C24LCXX_I2C::Write(const short p_address, const std::vector<unsigned char> & p_datas, const bool p_storeLength, const int p_length2write) {
Yann 0:21c698aa86f6 151 int length = (p_length2write == -1) ? p_datas.size() : p_length2write;
Yann 0:21c698aa86f6 152 unsigned char array[length];
Yann 0:21c698aa86f6 153 std::copy(p_datas.begin(), p_datas.end(), array);
Yann 0:21c698aa86f6 154 bool result = Write(p_address, array, p_storeLength, length);
Yann 0:21c698aa86f6 155 wait(0.02);
Yann 0:21c698aa86f6 156
Yann 0:21c698aa86f6 157 return result;
Yann 0:21c698aa86f6 158 }
Yann 0:21c698aa86f6 159
Yann 0:21c698aa86f6 160 bool C24LCXX_I2C::Write(const short p_address, const char *p_datas, const bool p_storeLength, const int p_length2write) {
Yann 0:21c698aa86f6 161 // 1.Prepare buffer
Yann 0:21c698aa86f6 162 int length = (p_length2write == -1) ? strlen(p_datas) : p_length2write;
Yann 0:21c698aa86f6 163 if (p_storeLength) {
Yann 0:21c698aa86f6 164 length += 4; // Add four bytes for the length as integer
Yann 0:21c698aa86f6 165 }
Yann 0:21c698aa86f6 166
Yann 0:21c698aa86f6 167 char i2cBuffer[2 + length];
Yann 0:21c698aa86f6 168 // 1.1. Memory address
acesrobertm 3:5df584fbabfe 169 short address = p_address;
Yann 0:21c698aa86f6 170 i2cBuffer[0] = (unsigned char)(address >> 8);
Yann 0:21c698aa86f6 171 i2cBuffer[1] = (unsigned char)((unsigned char)address & 0xff);
Yann 0:21c698aa86f6 172 // 1.2. Datas
Yann 0:21c698aa86f6 173 if (p_storeLength) {
Yann 0:21c698aa86f6 174 // Fill the length
Yann 0:21c698aa86f6 175 i2cBuffer[2] = (unsigned char)(length >> 24);
Yann 0:21c698aa86f6 176 i2cBuffer[3] = (unsigned char)(length >> 16);
Yann 0:21c698aa86f6 177 i2cBuffer[4] = (unsigned char)(length >> 8);
Yann 0:21c698aa86f6 178 i2cBuffer[5] = (unsigned char)((unsigned char)length & 0xff);
Yann 0:21c698aa86f6 179 for (int i = 0; i < length - 4; i++) {
Yann 0:21c698aa86f6 180 i2cBuffer[6 + i] = *(p_datas + i);
Yann 0:21c698aa86f6 181 }
Yann 0:21c698aa86f6 182 } else { // The length was not stored
Yann 0:21c698aa86f6 183 for (int i = 0; i < length; i++) {
Yann 0:21c698aa86f6 184 i2cBuffer[2 + i] = *(p_datas + i);
Yann 0:21c698aa86f6 185 }
Yann 0:21c698aa86f6 186 }
Yann 0:21c698aa86f6 187
Yann 0:21c698aa86f6 188 // 2. Send I2C start + I2C address + Memory Address + Datas + I2C stop
Yann 0:21c698aa86f6 189 int result = _i2cInstance->write(_slaveAddress, i2cBuffer, 2 + length);
Yann 0:21c698aa86f6 190 wait(0.02);
Yann 0:21c698aa86f6 191
Yann 0:21c698aa86f6 192 return (bool)(result == 0);
Yann 0:21c698aa86f6 193 }
Yann 0:21c698aa86f6 194
Yann 0:21c698aa86f6 195 bool C24LCXX_I2C::Write(const short p_address, const unsigned char *p_datas, const bool p_storeLength, const int p_length2write) {
Yann 0:21c698aa86f6 196 return Write(p_address, (const char *)p_datas, p_storeLength, p_length2write);
Yann 0:21c698aa86f6 197 }
Yann 0:21c698aa86f6 198
Yann 0:21c698aa86f6 199 bool C24LCXX_I2C::Read(const short p_address, unsigned char * p_byte) {
Yann 0:21c698aa86f6 200 // 1.Prepare buffer
Yann 0:21c698aa86f6 201 char i2cBuffer[2];
Yann 0:21c698aa86f6 202 // 1.1. Memory address
Yann 0:21c698aa86f6 203 i2cBuffer[0] = (unsigned char)(p_address >> 8);
Yann 0:21c698aa86f6 204 i2cBuffer[1] = (unsigned char)((unsigned char)p_address & 0xff);
Yann 0:21c698aa86f6 205
Yann 0:21c698aa86f6 206 // 2. Send I2C start + memory address
Yann 0:21c698aa86f6 207 if (_i2cInstance->write(_slaveAddress, i2cBuffer, 2, true) == 0) {
Yann 0:21c698aa86f6 208 // 2. Read data + I2C stop
Yann 0:21c698aa86f6 209 int result = _i2cInstance->read(_slaveAddress, (char *)p_byte, 1);
Yann 0:21c698aa86f6 210
Yann 0:21c698aa86f6 211 return (bool)(result == 0);
Yann 0:21c698aa86f6 212 }
Yann 0:21c698aa86f6 213
Yann 0:21c698aa86f6 214 return false;
Yann 0:21c698aa86f6 215 }
Yann 0:21c698aa86f6 216
Yann 0:21c698aa86f6 217 bool C24LCXX_I2C::Read(const short p_address, short *p_short, const C24LCXX_I2C::Mode p_mode) {
Yann 0:21c698aa86f6 218 // 1.Prepare buffer
Yann 0:21c698aa86f6 219 char i2cBuffer[2];
Yann 0:21c698aa86f6 220 // 1.1. Memory address
Yann 0:21c698aa86f6 221 i2cBuffer[0] = (unsigned char)(p_address >> 8);
Yann 0:21c698aa86f6 222 i2cBuffer[1] = (unsigned char)((unsigned char)p_address & 0xff);
Yann 0:21c698aa86f6 223
Yann 0:21c698aa86f6 224 // 2. Send I2C start + memory address
Yann 0:21c698aa86f6 225 if (_i2cInstance->write(_slaveAddress, i2cBuffer, 2, true) == 0) {
Yann 0:21c698aa86f6 226 // 2. Read data + I2C stop
Yann 0:21c698aa86f6 227 int result = _i2cInstance->read(_slaveAddress, i2cBuffer, 2);
Yann 0:21c698aa86f6 228 if (result == 0) {
Yann 0:21c698aa86f6 229 if (p_mode == BigEndian) {
Yann 0:21c698aa86f6 230 *p_short = (short)(i2cBuffer[0] << 8 | i2cBuffer[1]);
Yann 0:21c698aa86f6 231 } else {
Yann 0:21c698aa86f6 232 *p_short = (short)(i2cBuffer[1] << 8 | i2cBuffer[0]);
Yann 0:21c698aa86f6 233 }
Yann 0:21c698aa86f6 234
Yann 0:21c698aa86f6 235 return true;
Yann 0:21c698aa86f6 236 }
Yann 0:21c698aa86f6 237 }
Yann 0:21c698aa86f6 238
Yann 0:21c698aa86f6 239 return false;
Yann 0:21c698aa86f6 240 }
Yann 0:21c698aa86f6 241
Yann 0:21c698aa86f6 242 bool C24LCXX_I2C::Read(const short p_address, int *p_int, const C24LCXX_I2C::Mode p_mode) {
Yann 0:21c698aa86f6 243 // 1.Prepare buffer
Yann 0:21c698aa86f6 244 char i2cBuffer[4];
Yann 0:21c698aa86f6 245 // 1.1. Memory address
Yann 0:21c698aa86f6 246 i2cBuffer[0] = (unsigned char)(p_address >> 8);
Yann 0:21c698aa86f6 247 i2cBuffer[1] = (unsigned char)((unsigned char)p_address & 0xff);
Yann 0:21c698aa86f6 248
Yann 0:21c698aa86f6 249 // 2. Send I2C start + memory address
Yann 0:21c698aa86f6 250 if (_i2cInstance->write(_slaveAddress, i2cBuffer, 2, true) == 0) {
Yann 0:21c698aa86f6 251 // 2. Read data + I2C stop
Yann 0:21c698aa86f6 252 int result = _i2cInstance->read(_slaveAddress, i2cBuffer, 4);
Yann 0:21c698aa86f6 253 if (result == 0) {
Yann 0:21c698aa86f6 254 if (p_mode == BigEndian) {
Yann 0:21c698aa86f6 255 *p_int = (int)(i2cBuffer[0] << 24 | i2cBuffer[1] << 16 | i2cBuffer[2] << 8 | i2cBuffer[3]);
Yann 0:21c698aa86f6 256 } else {
Yann 0:21c698aa86f6 257 *p_int = (int)(i2cBuffer[3] << 24 | i2cBuffer[2] << 16 | i2cBuffer[1] << 8 | i2cBuffer[0]);
Yann 0:21c698aa86f6 258 }
Yann 0:21c698aa86f6 259 return true;
Yann 0:21c698aa86f6 260 }
Yann 0:21c698aa86f6 261 return false;
Yann 0:21c698aa86f6 262 }
Yann 0:21c698aa86f6 263 return false;
Yann 0:21c698aa86f6 264 }
Yann 0:21c698aa86f6 265
Yann 0:21c698aa86f6 266 bool C24LCXX_I2C::Read(const short p_address, std::vector<unsigned char> & p_datas, const bool p_readLengthFirst, const int p_length2write) {
Yann 0:21c698aa86f6 267 // 1.Prepare buffer
Yann 0:21c698aa86f6 268 short address = p_address;
Yann 0:21c698aa86f6 269 int length = 0;
Yann 0:21c698aa86f6 270 if (p_readLengthFirst) {
Yann 0:21c698aa86f6 271 if (!Read(address, &length)) { // Read the length in big endian mode
Yann 0:21c698aa86f6 272 return false;
Yann 0:21c698aa86f6 273 }
Yann 0:21c698aa86f6 274 if (length == 0) {
Yann 0:21c698aa86f6 275 return true;
Yann 0:21c698aa86f6 276 }
Yann 0:21c698aa86f6 277 address += 4; // Skip the length value
Yann 0:21c698aa86f6 278 length -= 4; // length is the size of (string length + string)
Yann 0:21c698aa86f6 279 } else {
Yann 0:21c698aa86f6 280 if (p_length2write == -1) {
Yann 0:21c698aa86f6 281 length = p_datas.size();
Yann 0:21c698aa86f6 282 } else {
Yann 0:21c698aa86f6 283 length = p_length2write;
Yann 0:21c698aa86f6 284 }
Yann 0:21c698aa86f6 285 }
Yann 0:21c698aa86f6 286
Yann 0:21c698aa86f6 287 // 2. Memory address
Yann 0:21c698aa86f6 288 char i2cBuffer[2];
Yann 0:21c698aa86f6 289 i2cBuffer[0] = (unsigned char)(address >> 8);
Yann 0:21c698aa86f6 290 i2cBuffer[1] = (unsigned char)((unsigned char)address & 0xff);
Yann 0:21c698aa86f6 291
Yann 0:21c698aa86f6 292 // 3. Send I2C start + memory address
Yann 0:21c698aa86f6 293 if (_i2cInstance->write(_slaveAddress, i2cBuffer, 2, true) == 0) {
Yann 0:21c698aa86f6 294 // 4. read data + I2C stop
Yann 0:21c698aa86f6 295 unsigned char buffer[length];
Yann 0:21c698aa86f6 296 int result = _i2cInstance->read(_slaveAddress, (char *)buffer, length);
acesrobertm 3:5df584fbabfe 297
Yann 0:21c698aa86f6 298 if (result == 0) {
Yann 0:21c698aa86f6 299 p_datas.assign(buffer, buffer + length);
Yann 0:21c698aa86f6 300 return (bool)(result == 0);
Yann 0:21c698aa86f6 301 }
Yann 0:21c698aa86f6 302 }
acesrobertm 3:5df584fbabfe 303
Yann 0:21c698aa86f6 304 return false;
Yann 0:21c698aa86f6 305 }
Yann 0:21c698aa86f6 306
Yann 0:21c698aa86f6 307 bool C24LCXX_I2C::Read(const short p_address, std::string & p_string, const bool p_readLengthFirst, const int p_length2write) {
Yann 0:21c698aa86f6 308 /* std::vector<unsigned char> datas;
Yann 0:21c698aa86f6 309 if (Read(p_address, datas, p_readLengthFirst, p_length2write) == true) {
Yann 0:21c698aa86f6 310 p_string.assign((char *)datas.begin(), datas.size());
Yann 0:21c698aa86f6 311
Yann 0:21c698aa86f6 312 return true;
Yann 0:21c698aa86f6 313 }
Yann 0:21c698aa86f6 314 return false;
Yann 0:21c698aa86f6 315 */
Yann 0:21c698aa86f6 316
Yann 0:21c698aa86f6 317 // 1.Prepare buffer
Yann 0:21c698aa86f6 318 short address = p_address;
Yann 0:21c698aa86f6 319 int length = -1;
Yann 0:21c698aa86f6 320 if (p_readLengthFirst) { // The string was stored with its length
Yann 0:21c698aa86f6 321 if (!Read(address, &length)) { // Read the length as integer in big endian mode
Yann 0:21c698aa86f6 322 return false;
Yann 0:21c698aa86f6 323 }
Yann 0:21c698aa86f6 324 if (length == 0) {
Yann 0:21c698aa86f6 325 return true;
Yann 0:21c698aa86f6 326 }
Yann 0:21c698aa86f6 327 address += 4; // Skip the length value size
Yann 0:21c698aa86f6 328 length -= 4; // length is the size of (string length + string)
Yann 0:21c698aa86f6 329 } else { // The string length is provided by p_length2write parameter
Yann 0:21c698aa86f6 330 if (p_length2write == -1) {
Yann 0:21c698aa86f6 331 length = p_string.size();
Yann 0:21c698aa86f6 332 } else {
Yann 0:21c698aa86f6 333 length = p_length2write;
Yann 0:21c698aa86f6 334 p_string.resize(p_length2write);
Yann 0:21c698aa86f6 335 }
Yann 0:21c698aa86f6 336 }
Yann 0:21c698aa86f6 337
Yann 0:21c698aa86f6 338 // 2. Memory address
Yann 0:21c698aa86f6 339 char i2cBuffer[2];
Yann 0:21c698aa86f6 340 i2cBuffer[0] = (unsigned char)(address >> 8);
Yann 0:21c698aa86f6 341 i2cBuffer[1] = (unsigned char)((unsigned char)address & 0xff);
Yann 0:21c698aa86f6 342
Yann 0:21c698aa86f6 343 // 3. Send I2C start + memory address with repeat start
Yann 0:21c698aa86f6 344 if (_i2cInstance->write(_slaveAddress, i2cBuffer, 2, true) == 0) {
Yann 0:21c698aa86f6 345 // 4. Read data + I2C stop
Yann 0:21c698aa86f6 346 char buffer[length];
Yann 0:21c698aa86f6 347 int result = _i2cInstance->read(_slaveAddress, (char *)buffer, length);
Yann 0:21c698aa86f6 348 if (result == 0) {
Yann 0:21c698aa86f6 349 p_string.assign(buffer, length);
Yann 0:21c698aa86f6 350
Yann 0:21c698aa86f6 351 return true;
Yann 0:21c698aa86f6 352 }
Yann 0:21c698aa86f6 353 }
Yann 0:21c698aa86f6 354
Yann 0:21c698aa86f6 355 return false;
Yann 0:21c698aa86f6 356 }
Yann 0:21c698aa86f6 357
Yann 0:21c698aa86f6 358 #if defined(__DEBUG)
Yann 0:21c698aa86f6 359 void C24LCXX_I2C::DumpMemoryArea(const int p_address, const int p_count) {
Yann 0:21c698aa86f6 360 DEBUG_ENTER("C24LCXX_I2C::DumpMemoryArea: %d - %d", p_address, p_count)
Yann 0:21c698aa86f6 361
Yann 0:21c698aa86f6 362 DEBUG("C24LCXX_I2C::DumpMemoryArea: Reading datas...");
Yann 0:21c698aa86f6 363 std::vector<unsigned char> datas(p_count);
Yann 0:21c698aa86f6 364 if (!Read(p_address, datas, false)) { // Read bytes, including the lenght indication, buffer size is not set before the call
Yann 0:21c698aa86f6 365 std::cout << "C24LCXX_I2C::DumpMemoryArea: read failed\r" << std::endl;
Yann 0:21c698aa86f6 366 } else {
Yann 0:21c698aa86f6 367 std::cout << "C24LCXX_I2C::DumpMemoryArea: Read bytes:\r" << std::endl;
Yann 0:21c698aa86f6 368 HEXADUMP(&datas[0], p_count);
Yann 0:21c698aa86f6 369 std::cout << "\r" << std::endl;
Yann 0:21c698aa86f6 370 }
Yann 0:21c698aa86f6 371 }
Yann 0:21c698aa86f6 372 #endif // _DEBUG
Yann 0:21c698aa86f6 373
Yann 0:21c698aa86f6 374 } // End of namespace _24LCXX_I2C