11//
22// FILE: I2C_eeprom.cpp
33// AUTHOR: Rob Tillaart
4- // VERSION: 1.8.2
4+ // VERSION: 1.8.3
55// PURPOSE: Arduino Library for external I2C EEPROM 24LC256 et al.
66// URL: https://github.com/RobTillaart/I2C_EEPROM.git
77
@@ -147,6 +147,27 @@ uint16_t I2C_eeprom::readBlock(const uint16_t memoryAddress, uint8_t * buffer, c
147147}
148148
149149
150+ // returns true or false.
151+ bool I2C_eeprom::verifyBlock (const uint16_t memoryAddress, const uint8_t * buffer, const uint16_t length)
152+ {
153+ uint16_t addr = memoryAddress;
154+ uint16_t len = length;
155+ while (len > 0 )
156+ {
157+ uint8_t cnt = I2C_BUFFERSIZE;
158+ if (cnt > len) cnt = len;
159+ if (_verifyBlock (addr, buffer, cnt) == false )
160+ {
161+ return false ;
162+ }
163+ addr += cnt;
164+ buffer += cnt;
165+ len -= cnt;
166+ }
167+ return true ;
168+ }
169+
170+
150171// ///////////////////////////////////////////////////////////
151172//
152173// UPDATE SECTION
@@ -203,22 +224,26 @@ bool I2C_eeprom::writeByteVerify(const uint16_t memoryAddress, const uint8_t val
203224bool I2C_eeprom::writeBlockVerify (const uint16_t memoryAddress, const uint8_t * buffer, const uint16_t length)
204225{
205226 if (writeBlock (memoryAddress, buffer, length) != 0 ) return false ;
206- uint8_t data[length];
207- if (readBlock (memoryAddress, data, length) != length) return false ;
208- return memcmp (data, buffer, length) == 0 ;
227+ return verifyBlock (memoryAddress, buffer, length);
209228}
210229
211230
212231// return false if write or verify failed.
213232bool I2C_eeprom::setBlockVerify (const uint16_t memoryAddress, const uint8_t value, const uint16_t length)
214233{
215234 if (setBlock (memoryAddress, value, length) != 0 ) return false ;
216- uint8_t data[length];
235+ uint8_t * data = (uint8_t *) malloc (length);
236+ if (data == NULL ) return false ;
217237 if (readBlock (memoryAddress, data, length) != length) return false ;
218238 for (uint16_t i = 0 ; i < length; i++)
219239 {
220- if (data[i] != value) return false ;
240+ if (data[i] != value)
241+ {
242+ free (data);
243+ return false ;
244+ }
221245 }
246+ free (data);
222247 return true ;
223248}
224249
@@ -236,9 +261,7 @@ bool I2C_eeprom::updateByteVerify(const uint16_t memoryAddress, const uint8_t va
236261bool I2C_eeprom::updateBlockVerify (const uint16_t memoryAddress, const uint8_t * buffer, const uint16_t length)
237262{
238263 if (updateBlock (memoryAddress, buffer, length) != length) return false ;
239- uint8_t data[length];
240- if (readBlock (memoryAddress, data, length) != length) return false ;
241- return memcmp (data, buffer, length) == 0 ;
264+ return verifyBlock (memoryAddress, buffer, length);
242265}
243266
244267
@@ -380,7 +403,7 @@ uint32_t I2C_eeprom::determineSizeNoWrite()
380403 // Read is perfomed just over size (size + BUFSIZE), this will only work for devices with mem > size; therefore return size * 2
381404 _isAddressSizeTwoWords = addressSize;
382405 return size * 2 ;
383- }
406+ }
384407 }
385408 _isAddressSizeTwoWords = addressSize;
386409 return 0 ;
@@ -640,6 +663,50 @@ uint8_t I2C_eeprom::_ReadBlock(const uint16_t memoryAddress, uint8_t * buffer, c
640663}
641664
642665
666+ // compares content of EEPROM with buffer.
667+ // returns true if equal.
668+ bool I2C_eeprom::_verifyBlock (const uint16_t memoryAddress, const uint8_t * buffer, const uint8_t length)
669+ {
670+ _waitEEReady ();
671+
672+ this ->_beginTransmission (memoryAddress);
673+ int rv = _wire->endTransmission ();
674+ if (rv != 0 )
675+ {
676+ // if (_debug)
677+ // {
678+ // SPRN("mem addr r: ");
679+ // SPRNH(memoryAddress, HEX);
680+ // SPRN("\t");
681+ // SPRNL(rv);
682+ // }
683+ return false ; // error
684+ }
685+
686+ // readBytes will always be equal or smaller to length
687+ uint8_t readBytes = 0 ;
688+ if (this ->_isAddressSizeTwoWords )
689+ {
690+ readBytes = _wire->requestFrom (_deviceAddress, length);
691+ }
692+ else
693+ {
694+ uint8_t addr = _deviceAddress | ((memoryAddress >> 8 ) & 0x07 );
695+ readBytes = _wire->requestFrom (addr, length);
696+ }
697+ yield (); // For OS scheduling
698+ uint8_t cnt = 0 ;
699+ while (cnt < readBytes)
700+ {
701+ if (buffer[cnt++] != _wire->read ())
702+ {
703+ return false ;
704+ }
705+ }
706+ return true ;
707+ }
708+
709+
643710void I2C_eeprom::_waitEEReady ()
644711{
645712 // Wait until EEPROM gives ACK again.
0 commit comments