11//
22// FILE: FRAM.cpp
33// AUTHOR: Rob Tillaart
4- // VERSION: 0.8.2
4+ // VERSION: 0.8.3
55// DATE: 2018-01-24
66// PURPOSE: Arduino library for I2C FRAM
77// URL: https://github.com/RobTillaart/FRAM_I2C
@@ -39,17 +39,26 @@ FRAM::FRAM(TwoWire *wire)
3939int FRAM::begin (const uint8_t address,
4040 const int8_t writeProtectPin)
4141{
42- if ((address < 0x50 ) || (address > 0x57 )) return FRAM_ERROR_ADDR;
42+ if ((address < 0x50 ) || (address > 0x57 ))
43+ {
44+ _error = FRAM_ERROR_ADDRESS;
45+ return _error;
46+ }
4347
4448 _address = address;
4549 if (writeProtectPin > -1 )
4650 {
4751 _writeProtectPin = writeProtectPin;
4852 pinMode (_writeProtectPin, OUTPUT);
4953 }
50- if (! isConnected ()) return FRAM_ERROR_CONNECT;
54+ if (! isConnected ())
55+ {
56+ _error = FRAM_ERROR_CONNECT;
57+ return _error;
58+ }
5159 getSize ();
52- return FRAM_OK;
60+ _error = FRAM_OK;
61+ return _error;
5362}
5463
5564
@@ -329,13 +338,22 @@ uint32_t FRAM::clear(uint8_t value)
329338// EXPERIMENTAL - to be confirmed
330339// page 12 datasheet
331340// command = S 0xF8 A address A S 86 A P (A = Ack from slave )
332- void FRAM::sleep ()
341+ bool FRAM::sleep ()
333342{
334343 _wire->beginTransmission (FRAM_SLAVE_ID_); // S 0xF8
335344 _wire->write (_address << 1 ); // address << 1
336- _wire->endTransmission (false ); // no stoP
345+ if (_wire->endTransmission (false ) != 0 ) // no stoP
346+ {
347+ _error = FRAM_ERROR_I2C;
348+ return false ;
349+ }
337350 _wire->beginTransmission (FRAM_SLEEP_CMD >> 1 ); // S 0x86
338- _wire->endTransmission (true ); // stoP
351+ if (_wire->endTransmission (true ) != 0 ) // stoP
352+ {
353+ _error = FRAM_ERROR_I2C;
354+ return false ;
355+ }
356+ return true ;
339357}
340358
341359
@@ -345,13 +363,25 @@ bool FRAM::wakeup(uint32_t timeRecover)
345363 // wakeup
346364 bool b = isConnected ();
347365 if (timeRecover == 0 ) return b;
348- // wait recovery time
366+ // blocking wait recovery time
349367 delayMicroseconds (timeRecover);
350368 // check recovery OK
351369 return isConnected ();
352370}
353371
354372
373+ // ///////////////////////////////////////////////////////////////////////////
374+ //
375+ // ERROR
376+ //
377+ int FRAM::lastError ()
378+ {
379+ int e = _error;
380+ _error = FRAM_OK;
381+ return e;
382+ }
383+
384+
355385// ///////////////////////////////////////////////////////////////////////////
356386//
357387// FRAM PROTECTED
@@ -366,9 +396,16 @@ uint32_t FRAM::_getMetaData()
366396{
367397 _wire->beginTransmission (FRAM_SLAVE_ID_);
368398 _wire->write (_address << 1 );
369- _wire->endTransmission (false );
370- int x = _wire->requestFrom (FRAM_SLAVE_ID_, (uint8_t )3 );
371- if (x != 3 ) return 0xFFFFFFFF ;
399+ if (_wire->endTransmission (false ) != 0 )
400+ {
401+ _error = FRAM_ERROR_I2C;
402+ return 0xFFFFFFFF ;
403+ }
404+ if (_wire->requestFrom (FRAM_SLAVE_ID_, (uint8_t )3 ) != 3 )
405+ {
406+ _error = FRAM_ERROR_REQUEST;
407+ return 0xFFFFFFFF ;
408+ }
372409
373410 uint32_t value = 0 ;
374411 value = _wire->read ();
@@ -377,6 +414,7 @@ uint32_t FRAM::_getMetaData()
377414 value = value << 8 ;
378415 value |= _wire->read ();
379416
417+ _error = FRAM_OK;
380418 return value;
381419}
382420
@@ -391,7 +429,10 @@ void FRAM::_writeBlock(uint16_t memAddr, uint8_t * obj, uint8_t size)
391429 {
392430 _wire->write (*p++);
393431 }
394- _wire->endTransmission ();
432+ if (_wire->endTransmission () != 0 )
433+ {
434+ _error = FRAM_ERROR_I2C;
435+ }
395436}
396437
397438
@@ -400,8 +441,16 @@ void FRAM::_readBlock(uint16_t memAddr, uint8_t * obj, uint8_t size)
400441 _wire->beginTransmission (_address);
401442 _wire->write ((uint8_t ) (memAddr >> 8 ));
402443 _wire->write ((uint8_t ) (memAddr & 0xFF ));
403- _wire->endTransmission ();
404- _wire->requestFrom (_address, size);
444+ if (_wire->endTransmission () != 0 )
445+ {
446+ _error = FRAM_ERROR_I2C;
447+ return ;
448+ }
449+ if (_wire->requestFrom (_address, size) != size)
450+ {
451+ _error = FRAM_ERROR_REQUEST;
452+ return ;
453+ }
405454 uint8_t * p = obj;
406455 for (uint8_t i = size; i > 0 ; i--)
407456 {
@@ -615,7 +664,12 @@ void FRAM32::_writeBlock(uint32_t memAddr, uint8_t * obj, uint8_t size)
615664 {
616665 _wire->write (*p++);
617666 }
618- _wire->endTransmission ();
667+ if (_wire->endTransmission () != 0 )
668+ {
669+ _error = FRAM_ERROR_I2C;
670+ return ;
671+ }
672+ _error = FRAM_OK;
619673}
620674
621675
@@ -628,13 +682,22 @@ void FRAM32::_readBlock(uint32_t memAddr, uint8_t * obj, uint8_t size)
628682 _wire->beginTransmission (_addr);
629683 _wire->write ((uint8_t ) (memAddr >> 8 ));
630684 _wire->write ((uint8_t ) (memAddr & 0xFF ));
631- _wire->endTransmission ();
632- _wire->requestFrom (_addr, size);
685+ if (_wire->endTransmission () != 0 )
686+ {
687+ _error = FRAM_ERROR_I2C;
688+ return ;
689+ }
690+ if (_wire->requestFrom (_addr, size) != size)
691+ {
692+ _error = FRAM_ERROR_REQUEST;
693+ return ;
694+ }
633695 uint8_t * p = obj;
634696 for (uint8_t i = size; i > 0 ; i--)
635697 {
636698 *p++ = _wire->read ();
637699 }
700+ _error = FRAM_OK;
638701}
639702
640703
@@ -678,7 +741,12 @@ void FRAM11::_writeBlock(uint16_t memAddr, uint8_t * obj, uint8_t size)
678741 {
679742 _wire->write (*p++);
680743 }
681- _wire->endTransmission ();
744+ if (_wire->endTransmission () != 0 )
745+ {
746+ _error = FRAM_ERROR_I2C;
747+ return ;
748+ }
749+ _error = FRAM_OK;
682750}
683751
684752
@@ -688,14 +756,22 @@ void FRAM11::_readBlock(uint16_t memAddr, uint8_t * obj, uint8_t size)
688756 uint8_t DeviceAddrWithPageBits = _address | ((memAddr & 0x0700 ) >> 8 );
689757 _wire->beginTransmission (DeviceAddrWithPageBits);
690758 _wire->write ((uint8_t ) (memAddr & 0xFF ));
691- _wire->endTransmission ();
692- _wire->requestFrom (DeviceAddrWithPageBits, size);
693-
759+ if (_wire->endTransmission () != 0 )
760+ {
761+ _error = FRAM_ERROR_I2C;
762+ return ;
763+ }
764+ if (_wire->requestFrom (DeviceAddrWithPageBits, size) != size)
765+ {
766+ _error = FRAM_ERROR_REQUEST;
767+ return ;
768+ }
694769 uint8_t * p = obj;
695770 for (uint8_t i = size; i > 0 ; i--)
696771 {
697772 *p++ = _wire->read ();
698773 }
774+ _error = FRAM_OK;
699775}
700776
701777
@@ -739,7 +815,12 @@ void FRAM9::_writeBlock(uint16_t memAddr, uint8_t * obj, uint8_t size)
739815 {
740816 _wire->write (*p++);
741817 }
742- _wire->endTransmission ();
818+ if (_wire->endTransmission () != 0 )
819+ {
820+ _error = FRAM_ERROR_I2C;
821+ return ;
822+ }
823+ _error = FRAM_OK;
743824}
744825
745826
@@ -749,14 +830,22 @@ void FRAM9::_readBlock(uint16_t memAddr, uint8_t * obj, uint8_t size)
749830 uint8_t DeviceAddrWithPageBits = _address | ((memAddr & 0x0100 ) >> 8 );
750831 _wire->beginTransmission (DeviceAddrWithPageBits);
751832 _wire->write ((uint8_t ) (memAddr & 0xFF ));
752- _wire->endTransmission ();
753- _wire->requestFrom (DeviceAddrWithPageBits, size);
754-
833+ if (_wire->endTransmission () != 0 )
834+ {
835+ _error = FRAM_ERROR_I2C;
836+ return ;
837+ }
838+ if (_wire->requestFrom (DeviceAddrWithPageBits, size) != size)
839+ {
840+ _error = FRAM_ERROR_REQUEST;
841+ return ;
842+ }
755843 uint8_t * p = obj;
756844 for (uint8_t i = size; i > 0 ; i--)
757845 {
758846 *p++ = _wire->read ();
759847 }
848+ _error = FRAM_OK;
760849}
761850
762851
0 commit comments