+ fixed 64 bit boundary bug

+ refactor _readBlock + return value
This commit is contained in:
Rob Tillaart 2013-09-30 16:41:52 +02:00
parent d406766659
commit aab07947c8
2 changed files with 22 additions and 13 deletions

View File

@ -1,12 +1,14 @@
// //
// FILE: I2C_eeprom.cpp // FILE: I2C_eeprom.cpp
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.1.00 // VERSION: 0.2.01
// PURPOSE: Simple I2C_eeprom library for Arduino with EEPROM 24LC256 et al. // PURPOSE: Simple I2C_eeprom library for Arduino with EEPROM 24LC256 et al.
// //
// HISTORY: // HISTORY:
// 0.1.00 - 2011-01-21 initial version // 0.1.00 - 2011-01-21 initial version
// 0.1.01 - 2011-02-07 added setBlock function // 0.1.01 - 2011-02-07 added setBlock function
// 0.2.00 - 2011-02-11 fixed 64 bit boundary bug
// 0.2.01 - 2011-08-13 _readBlock made more robust + return value
// //
// Released to the public domain // Released to the public domain
// //
@ -38,16 +40,16 @@ void I2C_eeprom::writeBlock(unsigned int address, uint8_t* buffer, int length)
int le = endOfPage(address); int le = endOfPage(address);
if (le > 0) if (le > 0)
{ {
_WriteBlock(address, buffer, le); _WriteBlock(address, buffer, le); // todo check return value..
address += le; address += le;
buffer += le; buffer += le;
length -= le; length -= le;
} }
// write the rest at BLOCKSIZE (16) byte boundaries // write the rest at BLOCKSIZE (16) byte boundaries ///
while (length > 0) while (length > 0)
{ {
_WriteBlock(address, buffer, min(length, BLOCKSIZE)); _WriteBlock(address, buffer, min(length, BLOCKSIZE)); // todo check return value..
address += BLOCKSIZE; address += BLOCKSIZE;
buffer += BLOCKSIZE; buffer += BLOCKSIZE;
length -= BLOCKSIZE; length -= BLOCKSIZE;
@ -70,7 +72,7 @@ void I2C_eeprom::setBlock(unsigned int address, uint8_t data, int length)
while (length > 0) while (length > 0)
{ {
_WriteBlock(address, buffer, min(length, BLOCKSIZE)); _WriteBlock(address, buffer, min(length, BLOCKSIZE)); // // todo check return value..
address += BLOCKSIZE; address += BLOCKSIZE;
length -= BLOCKSIZE; length -= BLOCKSIZE;
} }
@ -80,7 +82,7 @@ void I2C_eeprom::setBlock(unsigned int address, uint8_t data, int length)
uint8_t I2C_eeprom::readByte(unsigned int address) uint8_t I2C_eeprom::readByte(unsigned int address)
{ {
uint8_t rdata; uint8_t rdata;
_ReadBlock(address, &rdata, 1); _ReadBlock(address, &rdata, 1); // todo check return value..
return rdata; return rdata;
} }
@ -89,7 +91,7 @@ void I2C_eeprom::readBlock(unsigned int address, uint8_t* buffer, int length)
{ {
while (length > 0) while (length > 0)
{ {
_ReadBlock(address, buffer, min(length, BLOCKSIZE)); _ReadBlock(address, buffer, min(length, BLOCKSIZE)); // todo check return value..
address += BLOCKSIZE; address += BLOCKSIZE;
buffer += BLOCKSIZE; buffer += BLOCKSIZE;
length -= BLOCKSIZE; length -= BLOCKSIZE;
@ -119,21 +121,27 @@ void I2C_eeprom::_WriteBlock(unsigned int address, uint8_t* buffer, uint8_t leng
Wire.send((int)(address >> 8)); Wire.send((int)(address >> 8));
Wire.send((int)(address & 0xFF)); Wire.send((int)(address & 0xFF));
for (uint8_t c = 0; c < length; c++) for (uint8_t c = 0; c < length; c++)
Wire.send(buffer[c]); Wire.send(buffer[c]);
Wire.endTransmission(); Wire.endTransmission();
delay(5); delay(5);
} }
// pre: buffer is large enough to hold length bytes // pre: buffer is large enough to hold length bytes
void I2C_eeprom::_ReadBlock(unsigned int address, uint8_t* buffer, uint8_t length) int I2C_eeprom::_ReadBlock(unsigned int address, uint8_t* buffer, uint8_t length)
{ {
Wire.beginTransmission(_Device); Wire.beginTransmission(_Device);
Wire.send((int)(address >> 8)); Wire.send((int)(address >> 8));
Wire.send((int)(address & 0xFF)); Wire.send((int)(address & 0xFF));
Wire.endTransmission(); Wire.endTransmission();
Wire.requestFrom(_Device, length); Wire.requestFrom(_Device, length);
for (int c = 0; c < length; c++ )
if (Wire.available()) buffer[c] = Wire.receive(); int c = 0;
unsigned long before = millis();
while ((c < length) && ((millis() - before) < 1000))
{
if (Wire.available()) buffer[c++] = Wire.receive();
}
return c;
} }
// //
// END OF FILE // END OF FILE

View File

@ -5,6 +5,7 @@
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// PURPOSE: Simple I2C_eeprom library for Arduino with EEPROM 24LC256 et al. // PURPOSE: Simple I2C_eeprom library for Arduino with EEPROM 24LC256 et al.
// HISTORY: See I2C_eeprom.cpp // HISTORY: See I2C_eeprom.cpp
// URL: http://arduino.cc/playground/Main/LibraryForI2CEEPROM
// //
// Released to the public domain // Released to the public domain
// //
@ -14,7 +15,7 @@
// BLOCKSIZE must be 16 // BLOCKSIZE must be 16
#define BLOCKSIZE 16 #define BLOCKSIZE 16
#define I2C_EEPROM_VERSION "0.2" #define I2C_EEPROM_VERSION "0.2.01"
// interface // interface
class I2C_eeprom class I2C_eeprom
@ -39,7 +40,7 @@ class I2C_eeprom
int endOfPage(unsigned int); int endOfPage(unsigned int);
// (mem_address, buffer, length) // (mem_address, buffer, length)
void _WriteBlock(unsigned int, uint8_t*, uint8_t ); void _WriteBlock(unsigned int, uint8_t*, uint8_t );
void _ReadBlock(unsigned int, uint8_t*, uint8_t ); int _ReadBlock(unsigned int, uint8_t*, uint8_t );
}; };
#endif #endif