Исправления

This commit is contained in:
Tutukov Beslan
2021-11-12 07:10:36 +03:00
parent f818b6b602
commit f6b04a0135
2 changed files with 856 additions and 881 deletions

View File

@@ -25,12 +25,12 @@ Version: 1.0
************************************************************/
#include "eeprom.h"
#define BIT_SET(x,n) (x=x | (0x01<<n))
#define BIT_TEST(x,n) (x & (0x01<<n))
#define BIT_CLEAR(x,n) (x=x & ~(0x01<<n))
#define BIT_SET(x, n) (x=x | (0x01<<n))
#define BIT_TEST(x, n) (x & (0x01<<n))
#define BIT_CLEAR(x, n) (x=x & ~(0x01<<n))
const char * const EEPROM::_name[] = {"24C01","24C02","24C04","24C08","24C16","24C32",
"24C64","24C128","24C256","24C512","24C1024","24C1025"};
const char *const EEPROM::_name[] = {"24C01", "24C02", "24C04", "24C08", "24C16", "24C32",
"24C64", "24C128", "24C256", "24C512", "24C1024", "24C1025"};
/**
* EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl)
@@ -42,18 +42,17 @@ const char * const EEPROM::_name[] = {"24C01","24C02","24C04","24C08","24C16","2
* @param type eeprom type (TypeEeprom)
* @return none
*/
EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl)
{
EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl) {
_errnum = EEPROM_NoError;
_type = type;
// Check address range
_address = address;
switch(type) {
switch (type) {
case T24C01 :
case T24C02 :
if(address > 7) {
if (address > 7) {
_errnum = EEPROM_BadAddress;
}
_address = _address << 1;
@@ -61,7 +60,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
_page_number = 1;
break;
case T24C04 :
if(address > 7) {
if (address > 7) {
_errnum = EEPROM_BadAddress;
}
_address = (_address & 0xFE) << 1;
@@ -69,7 +68,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
_page_number = 2;
break;
case T24C08 :
if(address > 7) {
if (address > 7) {
_errnum = EEPROM_BadAddress;
}
_address = (_address & 0xFC) << 1;
@@ -83,7 +82,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
break;
case T24C32 :
case T24C64 :
if(address > 7) {
if (address > 7) {
_errnum = EEPROM_BadAddress;
}
_address = _address << 1;
@@ -92,7 +91,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
break;
case T24C128 :
case T24C256 :
if(address > 3) {
if (address > 3) {
_errnum = EEPROM_BadAddress;
}
_address = _address << 1;
@@ -100,7 +99,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
_page_number = 1;
break;
case T24C512 :
if(address > 3) {
if (address > 3) {
_errnum = EEPROM_BadAddress;
}
_address = _address << 1;
@@ -108,7 +107,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
_page_number = 1;
break;
case T24C1024 :
if(address > 7) {
if (address > 7) {
_errnum = EEPROM_BadAddress;
}
_address = (_address & 0xFE) << 1;
@@ -116,7 +115,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
_page_number = 2;
break;
case T24C1025 :
if(address > 3) {
if (address > 3) {
_errnum = EEPROM_BadAddress;
}
_address = _address << 1;
@@ -127,7 +126,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
// Size in bytes
_size = _type;
if(_type == T24C1025)
if (_type == T24C1025)
_size = T24C1024;
// Set I2C frequency
@@ -143,8 +142,7 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
* @param data byte to write (int8_t)
* @return none
*/
void EEPROM::write(uint32_t address, int8_t data)
{
void EEPROM::write(uint32_t address, int8_t data) {
uint8_t page;
uint8_t addr;
uint8_t cmd[3];
@@ -152,24 +150,24 @@ void EEPROM::write(uint32_t address, int8_t data)
int ack;
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address)) {
if (!checkAddress(address)) {
_errnum = EEPROM_OutOfRange;
return;
}
// Compute page number
page = 0;
if(_type < T24C32)
if (_type < T24C32)
page = (uint8_t) (address / 256);
// Device address
addr = EEPROM_Address | _address | (page << 1);
if(_type < T24C32) {
if (_type < T24C32) {
len = 2;
// Word address
@@ -177,8 +175,7 @@ void EEPROM::write(uint32_t address, int8_t data)
// Data
cmd[1] = (uint8_t) data;
}
else {
} else {
len = 3;
// First word address (MSB)
@@ -191,8 +188,8 @@ void EEPROM::write(uint32_t address, int8_t data)
cmd[2] = (uint8_t) data;
}
ack = _i2c.write((int)addr,(char *)cmd,len);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, len);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -211,28 +208,27 @@ void EEPROM::write(uint32_t address, int8_t data)
* @param size number of bytes to write (uint32_t)
* @return none
*/
void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
{
void EEPROM::write(uint32_t address, const int8_t data[], uint32_t length) {
uint8_t page;
uint8_t addr = 0;
uint8_t blocs,remain;
uint8_t fpart,lpart;
uint8_t i,j,ind;
uint8_t blocs, remain;
uint8_t fpart, lpart;
uint8_t i, j, ind;
uint8_t cmd[129];
int ack;
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address)) {
if (!checkAddress(address)) {
_errnum = EEPROM_OutOfRange;
return;
}
// Check length
if(!checkAddress(address + length - 1)) {
if (!checkAddress(address + length - 1)) {
_errnum = EEPROM_OutOfRange;
return;
}
@@ -243,27 +239,27 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
// Compute remaining bytes
remain = length - blocs * _page_write;
for(i = 0;i < blocs;i++) {
for (i = 0; i < blocs; i++) {
// Compute page number
page = 0;
if(_type < T24C32)
if (_type < T24C32)
page = (uint8_t) (address / 256);
// Device address
addr = EEPROM_Address | _address | (page << 1);
if(_type < T24C32) {
if (_type < T24C32) {
// Word address
cmd[0] = (uint8_t) (address - page * 256);
if((uint8_t) ((address + _page_write) / 256) == page) { // Data fit in the same page
if ((uint8_t) ((address + _page_write) / 256) == page) { // Data fit in the same page
// Add data
for(j = 0;j < _page_write;j++)
for (j = 0; j < _page_write; j++)
cmd[j + 1] = (uint8_t) data[i * _page_write + j];
// Write data
ack = _i2c.write((int)addr,(char *)cmd,_page_write + 1);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, _page_write + 1);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -273,18 +269,17 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
// Increment address
address += _page_write;
}
else { // Data on 2 pages. We must split the write
} else { // Data on 2 pages. We must split the write
// Number of bytes in current page
fpart = (page + 1) * 256 - address;
// Add data for current page
for(j = 0;j < fpart;j++)
for (j = 0; j < fpart; j++)
cmd[j + 1] = (uint8_t) data[i * _page_write + j];
// Write data for current page
ack = _i2c.write((int)addr,(char *)cmd,fpart + 1);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, fpart + 1);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -295,7 +290,7 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
// Increment address
address += fpart;
if(page < _page_number - 1) {
if (page < _page_number - 1) {
// Increment page
page++;
@@ -312,12 +307,12 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
lpart = _page_write - fpart;
// Add data for next page
for(j = 0;j < lpart;j++)
for (j = 0; j < lpart; j++)
cmd[j + 1] = (uint8_t) data[ind + j];
// Write data for next page
ack = _i2c.write((int)addr,(char *)cmd,lpart + 1);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, lpart + 1);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -329,8 +324,7 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
address += lpart;
}
}
}
else {
} else {
// First word address (MSB)
cmd[0] = (uint8_t) (address >> 8);
@@ -338,12 +332,12 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
cmd[1] = (uint8_t) address;
// Add data
for(j = 0;j < _page_write;j++)
for (j = 0; j < _page_write; j++)
cmd[j + 2] = (uint8_t) data[i * _page_write + j];
// Write data
ack = _i2c.write((int)addr,(char *)cmd,_page_write + 2);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, _page_write + 2);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -356,45 +350,44 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
}
}
if(remain) {
if (remain) {
// Compute page number
page = 0;
if(_type < T24C32)
if (_type < T24C32)
page = (uint8_t) (address / 256);
// Device address
addr = EEPROM_Address | _address | (page << 1);
if(_type < T24C32) {
if (_type < T24C32) {
// Word address
cmd[0] = (uint8_t) (address - page * 256);
if((uint8_t) ((address + remain) / 256) == page) { // Data fit in the same page
if ((uint8_t) ((address + remain) / 256) == page) { // Data fit in the same page
// Add data for the current page
for(j = 0;j < remain;j++)
for (j = 0; j < remain; j++)
cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
// Write data for the current page
ack = _i2c.write((int)addr,(char *)cmd,remain + 1);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, remain + 1);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
// Wait end of write
ready();
}
else { // Data on 2 pages. We must split the write
} else { // Data on 2 pages. We must split the write
// Number of bytes in current page
fpart = (page + 1) * 256 - address;
// Add data for current page
for(j = 0;j < fpart;j++)
for (j = 0; j < fpart; j++)
cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
// Write data for current page
ack = _i2c.write((int)addr,(char *)cmd,fpart + 1);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, fpart + 1);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -405,7 +398,7 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
// Increment address
address += fpart;
if(page < _page_number - 1) {
if (page < _page_number - 1) {
// Increment page
page++;
@@ -422,12 +415,12 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
lpart = remain - fpart;
// Add data for next page
for(j = 0;j < lpart;j++)
for (j = 0; j < lpart; j++)
cmd[j + 1] = (uint8_t) data[ind + j];
// Write data for next page
ack = _i2c.write((int)addr,(char *)cmd,lpart + 1);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, lpart + 1);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -436,8 +429,7 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
ready();
}
}
}
else {
} else {
// Fist word address (MSB)
cmd[0] = (uint8_t) (address >> 8);
@@ -445,12 +437,12 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
cmd[1] = (uint8_t) address;
// Add data for the current page
for(j = 0;j < remain;j++)
for (j = 0; j < remain; j++)
cmd[j + 2] = (uint8_t) data[blocs * _page_write + j];
// Write data for the current page
ack = _i2c.write((int)addr,(char *)cmd,remain + 2);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, remain + 2);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -470,23 +462,22 @@ void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
* @param data short to write (int16_t)
* @return none
*/
void EEPROM::write(uint32_t address, int16_t data)
{
void EEPROM::write(uint32_t address, int16_t data) {
int8_t cmd[2];
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address + 1)) {
if (!checkAddress(address + 1)) {
_errnum = EEPROM_OutOfRange;
return;
}
memcpy(cmd,&data,2);
memcpy(cmd, &data, 2);
write(address,cmd,2);
write(address, cmd, 2);
}
@@ -498,23 +489,22 @@ void EEPROM::write(uint32_t address, int16_t data)
* @param data long to write (int32_t)
* @return none
*/
void EEPROM::write(uint32_t address, int32_t data)
{
void EEPROM::write(uint32_t address, int32_t data) {
int8_t cmd[4];
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address + 3)) {
if (!checkAddress(address + 3)) {
_errnum = EEPROM_OutOfRange;
return;
}
memcpy(cmd,&data,4);
memcpy(cmd, &data, 4);
write(address,cmd,4);
write(address, cmd, 4);
}
@@ -526,23 +516,22 @@ void EEPROM::write(uint32_t address, int32_t data)
* @param data float to write (float)
* @return none
*/
void EEPROM::write(uint32_t address, float data)
{
void EEPROM::write(uint32_t address, float data) {
int8_t cmd[4];
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address + 3)) {
if (!checkAddress(address + 3)) {
_errnum = EEPROM_OutOfRange;
return;
}
memcpy(cmd,&data,4);
memcpy(cmd, &data, 4);
write(address,cmd,4);
write(address, cmd, 4);
}
@@ -555,29 +544,28 @@ void EEPROM::write(uint32_t address, float data)
* @param size number of bytes to write (uint32_t)
* @return none
*/
void EEPROM::write(uint32_t address, void *data, uint32_t size)
{
int8_t *cmd = NULL;
void EEPROM::write(uint32_t address, void *data, uint32_t size) {
int8_t *cmd = nullptr;
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address + size - 1)) {
if (!checkAddress(address + size - 1)) {
_errnum = EEPROM_OutOfRange;
return;
}
cmd = (int8_t *)malloc(size);
if(cmd == NULL) {
cmd = (int8_t *) malloc(size);
if (cmd == nullptr) {
_errnum = EEPROM_MallocError;
return;
}
memcpy(cmd,(uint8_t *)data,size);
memcpy(cmd, (uint8_t *) data, size);
write(address,cmd,size);
write(address, cmd, size);
free(cmd);
@@ -591,8 +579,7 @@ void EEPROM::write(uint32_t address, void *data, uint32_t size)
* @param data byte to read (int8_t&)
* @return none
*/
void EEPROM::read(uint32_t address, int8_t& data)
{
void EEPROM::read(uint32_t address, int8_t &data) {
uint8_t page;
uint8_t addr;
uint8_t cmd[2];
@@ -600,49 +587,48 @@ void EEPROM::read(uint32_t address, int8_t& data)
int ack;
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address)) {
if (!checkAddress(address)) {
_errnum = EEPROM_OutOfRange;
return;
}
// Compute page number
page = 0;
if(_type < T24C32)
if (_type < T24C32)
page = (uint8_t) (address / 256);
// Device address
addr = EEPROM_Address | _address | (page << 1);
if(_type < T24C32) {
if (_type < T24C32) {
len = 1;
// Word address
cmd[0] = (uint8_t) (address - page * 256);
}
else {
} else {
len = 2;
// First word address (MSB)
cmd[0] = (uint8_t) (address >> 8);
// Second word address (LSB)
cmd[1] = (uint8_t)address;
cmd[1] = (uint8_t) address;
}
// Write command
ack = _i2c.write((int)addr,(char *)cmd,len,true);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, len, true);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
// Read data
ack = _i2c.read((int)addr,(char *)&data,sizeof(data));
if(ack != 0) {
ack = _i2c.read((int) addr, (char *) &data, sizeof(data));
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -658,8 +644,7 @@ void EEPROM::read(uint32_t address, int8_t& data)
* @param size number of bytes to read (uint32_t)
* @return none
*/
void EEPROM::read(uint32_t address, int8_t *data, uint32_t size)
{
void EEPROM::read(uint32_t address, int8_t *data, uint32_t size) {
uint8_t page;
uint8_t addr;
uint8_t cmd[2];
@@ -667,36 +652,35 @@ void EEPROM::read(uint32_t address, int8_t *data, uint32_t size)
int ack;
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address)) {
if (!checkAddress(address)) {
_errnum = EEPROM_OutOfRange;
return;
}
// Check size
if(!checkAddress(address + size - 1)) {
if (!checkAddress(address + size - 1)) {
_errnum = EEPROM_OutOfRange;
return;
}
// Compute page number
page = 0;
if(_type < T24C32)
if (_type < T24C32)
page = (uint8_t) (address / 256);
// Device address
addr = EEPROM_Address | _address | (page << 1);
if(_type < T24C32) {
if (_type < T24C32) {
len = 1;
// Word address
cmd[0] = (uint8_t) (address - page * 256);
}
else {
} else {
len = 2;
// First word address (MSB)
@@ -707,15 +691,15 @@ void EEPROM::read(uint32_t address, int8_t *data, uint32_t size)
}
// Write command
ack = _i2c.write((int)addr,(char *)cmd,len,true);
if(ack != 0) {
ack = _i2c.write((int) addr, (char *) cmd, len, true);
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
// Sequential read
ack = _i2c.read((int)addr,(char *)data,size);
if(ack != 0) {
ack = _i2c.read((int) addr, (char *) data, static_cast<int>(size));
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -729,21 +713,20 @@ void EEPROM::read(uint32_t address, int8_t *data, uint32_t size)
* @param data byte to read (int8_t&)
* @return none
*/
void EEPROM::read(int8_t& data)
{
void EEPROM::read(int8_t &data) {
uint8_t addr;
int ack;
// Check error
if(_errnum)
if (_errnum)
return;
// Device address
addr = EEPROM_Address | _address;
// Read data
ack = _i2c.read((int)addr,(char *)&data,sizeof(data));
if(ack != 0) {
ack = _i2c.read((int) addr, (char *) &data, sizeof(data));
if (ack != 0) {
_errnum = EEPROM_I2cError;
return;
}
@@ -758,23 +741,22 @@ void EEPROM::read(int8_t& data)
* @param data short to read (int16_t&)
* @return none
*/
void EEPROM::read(uint32_t address, int16_t& data)
{
void EEPROM::read(uint32_t address, int16_t &data) {
int8_t cmd[2];
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address + 1)) {
if (!checkAddress(address + 1)) {
_errnum = EEPROM_OutOfRange;
return;
}
read(address,cmd,2);
read(address, cmd, 2);
memcpy(&data,cmd,2);
memcpy(&data, cmd, 2);
}
@@ -786,23 +768,22 @@ void EEPROM::read(uint32_t address, int16_t& data)
* @param data long to read (int32_t&)
* @return none
*/
void EEPROM::read(uint32_t address, int32_t& data)
{
void EEPROM::read(uint32_t address, int32_t &data) {
int8_t cmd[4];
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address + 3)) {
if (!checkAddress(address + 3)) {
_errnum = EEPROM_OutOfRange;
return;
}
read(address,cmd,4);
read(address, cmd, 4);
memcpy(&data,cmd,4);
memcpy(&data, cmd, 4);
}
@@ -814,23 +795,22 @@ void EEPROM::read(uint32_t address, int32_t& data)
* @param data float to read (float&)
* @return none
*/
void EEPROM::read(uint32_t address, float& data)
{
void EEPROM::read(uint32_t address, float &data) {
int8_t cmd[4];
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address + 3)) {
if (!checkAddress(address + 3)) {
_errnum = EEPROM_OutOfRange;
return;
}
read(address,cmd,4);
read(address, cmd, 4);
memcpy(&data,cmd,4);
memcpy(&data, cmd, 4);
}
@@ -843,30 +823,29 @@ void EEPROM::read(uint32_t address, float& data)
* @param size number of bytes to read (uint32_t)
* @return none
*/
void EEPROM::read(uint32_t address, void *data, uint32_t size)
{
int8_t *cmd = NULL;
void EEPROM::read(uint32_t address, void *data, uint32_t size) {
int8_t *cmd = nullptr;
// Check error
if(_errnum)
if (_errnum)
return;
// Check address
if(!checkAddress(address + size - 1)) {
if (!checkAddress(address + size - 1)) {
_errnum = EEPROM_OutOfRange;
return;
}
cmd = (int8_t *)malloc(size);
cmd = (int8_t *) malloc(size);
if(cmd == NULL) {
if (cmd == nullptr) {
_errnum = EEPROM_MallocError;
return;
}
read(address,(int8_t *)cmd,size);
read(address, (int8_t *) cmd, size);
memcpy(data,cmd,size);
memcpy(data, cmd, size);
free(cmd);
@@ -879,15 +858,14 @@ void EEPROM::read(uint32_t address, void *data, uint32_t size)
* @param none
* @return none
*/
void EEPROM::clear(void)
{
void EEPROM::clear() {
int32_t data;
uint32_t i;
data = 0;
for(i = 0; i < _size / 4;i++) {
write((uint32_t)(i * 4),data);
for (i = 0; i < _size / 4; i++) {
write((uint32_t) (i * 4), data);
}
}
@@ -898,14 +876,13 @@ void EEPROM::clear(void)
* @param none
* @return none
*/
void EEPROM::ready(void)
{
void EEPROM::ready() {
int ack;
uint8_t addr;
uint8_t cmd[2];
// Check error
if(_errnum)
if (_errnum)
return;
// Device address
@@ -915,9 +892,9 @@ void EEPROM::ready(void)
// Wait end of write
do {
ack = _i2c.write((int)addr,(char *)cmd,0);
ack = _i2c.write((int) addr, (char *) cmd, 0);
ThisThread::sleep_for(1ms);
} while(ack != 0);
} while (ack != 0);
}
@@ -928,9 +905,8 @@ void EEPROM::ready(void)
* @param none
* @return size in bytes (uint32_t)
*/
uint32_t EEPROM::getSize(void)
{
return(_size);
uint32_t EEPROM::getSize() {
return (_size);
}
/**
@@ -940,11 +916,10 @@ uint32_t EEPROM::getSize(void)
* @param none
* @return name (const char*)
*/
const char* EEPROM::getName(void)
{
const char *EEPROM::getName() {
uint8_t i = 0;
switch(_type) {
switch (_type) {
case T24C01 :
i = 0;
break;
@@ -983,7 +958,7 @@ const char* EEPROM::getName(void)
break;
}
return(_name[i]);
return (_name[i]);
}
/**
@@ -993,9 +968,8 @@ const char* EEPROM::getName(void)
* @param none
* @return none
*/
uint8_t EEPROM::getError(void)
{
return(_errnum);
uint8_t EEPROM::getError() {
return (_errnum);
}
/**
@@ -1005,60 +979,59 @@ uint8_t EEPROM::getError(void)
* @param address address to check (uint32_t)
* @return true if in eeprom range, overwise false (bool)
*/
bool EEPROM::checkAddress(uint32_t address)
{
bool EEPROM::checkAddress(uint32_t address) {
bool ret = true;
switch(_type) {
switch (_type) {
case T24C01 :
if(address >= T24C01)
if (address >= T24C01)
ret = false;
break;
case T24C02 :
if(address >= T24C02)
if (address >= T24C02)
ret = false;
break;
case T24C04 :
if(address >= T24C04)
if (address >= T24C04)
ret = false;
break;
case T24C08 :
if(address >= T24C08)
if (address >= T24C08)
ret = false;
break;
case T24C16 :
if(address >= T24C16)
if (address >= T24C16)
ret = false;
break;
case T24C32 :
if(address >= T24C32)
if (address >= T24C32)
ret = false;
break;
case T24C64 :
if(address >= T24C64)
if (address >= T24C64)
ret = false;
break;
case T24C128 :
if(address >= T24C128)
if (address >= T24C128)
ret = false;
break;
case T24C256 :
if(address >= T24C256)
if (address >= T24C256)
ret = false;
break;
case T24C512 :
if(address >= T24C512)
if (address >= T24C512)
ret = false;
break;
case T24C1024 :
if(address >= T24C1024)
if (address >= T24C1024)
ret = false;
break;
case T24C1025 :
if(address >= T24C1025 - 1)
if (address >= T24C1025 - 1)
ret = false;
break;
}
return(ret);
return (ret);
}

View File

@@ -26,15 +26,17 @@ static std::string _ErrorMessageEEPROM[EEPROM_MaxError] = {
"Invalid parameter",
"Data address out of range",
"Memory allocation error"
};
};
/** EEPROM Class
*/
class EEPROM {
public:
enum TypeEeprom {T24C01=128,T24C02=256,T24C04=512,T24C08=1024,T24C16=2048,
T24C32=4096,T24C64=8192,T24C128=16384,T24C256=32768,
T24C512=65536,T24C1024=131072,T24C1025=131073} Type;
enum TypeEeprom {
T24C01 = 128, T24C02 = 256, T24C04 = 512, T24C08 = 1024, T24C16 = 2048,
T24C32 = 4096, T24C64 = 8192, T24C128 = 16384, T24C256 = 32768,
T24C512 = 65536, T24C1024 = 131072, T24C1025 = 131073
} Type;
/**
* Constructor, initialize the eeprom on i2c interface.
@@ -52,7 +54,7 @@ public:
* @param data byte to read (int8_t&)
* @return none
*/
void read(uint32_t address, int8_t& data);
void read(uint32_t address, int8_t &data);
/**
* Random read short
@@ -60,7 +62,7 @@ public:
* @param data short to read (int16_t&)
* @return none
*/
void read(uint32_t address, int16_t& data);
void read(uint32_t address, int16_t &data);
/**
* Random read long
@@ -68,7 +70,7 @@ public:
* @param data long to read (int32_t&)
* @return none
*/
void read(uint32_t address, int32_t& data);
void read(uint32_t address, int32_t &data);
/**
* Random read float
@@ -76,7 +78,7 @@ public:
* @param data float to read (float&)
* @return none
*/
void read(uint32_t address, float& data);
void read(uint32_t address, float &data);
/**
* Random read anything
@@ -92,7 +94,7 @@ public:
* @param data byte to read (int8_t&)
* @return none
*/
void read(int8_t& data);
void read(int8_t &data);
/**
* Sequential read byte
@@ -151,51 +153,50 @@ public:
* @param size number of bytes to write (uint32_t)
* @return none
*/
void write(uint32_t address, int8_t data[], uint32_t size);
void write(uint32_t address, const int8_t data[], uint32_t size);
/**
* Wait eeprom ready
* @param none
* @return none
*/
void ready(void);
void ready();
/**
* Get eeprom size in bytes
* @param none
* @return size in bytes (uint32_t)
*/
uint32_t getSize(void);
uint32_t getSize();
/**
* Get eeprom name
* @param none
* @return name (const char*)
*/
const char* getName(void);
const char *getName();
/**
* Clear eeprom (write with 0)
* @param none
* @return none
*/
void clear(void);
void clear();
/**
* Get the current error number (EEPROM_NoError if no error)
* @param none
* @return none
*/
uint8_t getError(void);
uint8_t getError();
/**
* Get current error message
* @param none
* @return current error message(std::string)
*/
std::string getErrorMessage(void)
{
return(_ErrorMessageEEPROM[_errnum]);
std::string getErrorMessage(void) const {
return (_ErrorMessageEEPROM[_errnum]);
}
//---------- local variables ----------
@@ -208,7 +209,8 @@ private:
uint8_t _page_number; // Number of page
uint32_t _size; // Size in bytes
bool checkAddress(uint32_t address); // Check address range
static const char * const _name[]; // eeprom name
static const char *const _name[]; // eeprom name
//-------------------------------------
};
#endif