Skip to content

Commit 3898ab6

Browse files
committed
0.8.3 FRAM_I2C
1 parent 1ea4f6d commit 3898ab6

File tree

35 files changed

+226
-70
lines changed

35 files changed

+226
-70
lines changed

libraries/FRAM_I2C/.arduino-ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ compile:
2020
# - due
2121
# - zero
2222
# - leonardo
23-
- m4
23+
# - m4
2424
- esp32
25-
- esp8266
25+
# - esp8266
2626
# - mega2560
2727
- rpipico
2828
- nano_every

libraries/FRAM_I2C/CHANGELOG.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
55
and this project adheres to [Semantic Versioning](http://semver.org/).
66

77

8+
## [0.8.3] - 2025-06-17
9+
- improve error handling a bit.
10+
- add lastError()
11+
- add define FRAM_ERROR_ADDRESS
12+
- add define FRAM_ERROR_REQUEST (I2C requestFrom)
13+
- change return type of **bool sleep()**
14+
- minor edits examples
15+
816
## [0.8.2] - 2025-02-03
917
- support AVR_ATtiny85 / 84, kudos to GiorgosXou
1018
- add **FRAM_ATTINY85_COMPILE_TEST.ino** for testing
@@ -29,7 +37,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2937
- minor edits examples
3038

3139
## [0.7.0] - 2023-10-30
32-
- refactor / simplify begin() =>
40+
- refactor / simplify begin() =>
3341
- User has to call Wire.begin() explicitly.
3442
- improves support for RP2040 (setSDA/SetSCL).
3543
- add example for ESP32 => use Wire1 and set pins (SDA/SCL).
@@ -107,7 +115,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
107115
- updated documentation
108116

109117
## [0.4.0] - 2022-05-02
110-
- add **FRAM32** derived class to support the MB85RC1MT as it need 32 bits addressing.
118+
- add **FRAM32** derived class to support the MB85RC1MT as it need 32 bits addressing.
111119
This class uses 4 byte memory addresses internally.
112120
Note **FRAM32** can also address 16 bit FRAM devices.
113121
- updated documentation

libraries/FRAM_I2C/FRAM.cpp

Lines changed: 114 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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)
3939
int 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

libraries/FRAM_I2C/FRAM.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//
33
// FILE: FRAM.h
44
// AUTHOR: Rob Tillaart
5-
// VERSION: 0.8.2
5+
// VERSION: 0.8.3
66
// DATE: 2018-01-24
77
// PURPOSE: Arduino library for I2C FRAM
88
// URL: https://github.com/RobTillaart/FRAM_I2C
@@ -20,13 +20,16 @@
2020
#endif
2121

2222

23-
#define FRAM_LIB_VERSION (F("0.8.2"))
23+
#define FRAM_LIB_VERSION (F("0.8.3"))
2424

2525

2626
#define FRAM_OK 0
27-
#define FRAM_ERROR_ADDR -10
27+
#define FRAM_ERROR_ADDR -10 // obsolete in future
28+
#define FRAM_ERROR_ADDRESS -10
2829
#define FRAM_ERROR_I2C -11
2930
#define FRAM_ERROR_CONNECT -12
31+
#define FRAM_ERROR_REQUEST -13
32+
3033

3134
// Size known types (Fujitsu)
3235
#define FRAM_MB85RC04 512
@@ -123,17 +126,23 @@ class FRAM
123126

124127

125128
// SLEEP - 0.3.6
126-
void sleep();
129+
// returns true upon success
130+
bool sleep();
127131
// timeRecover <= 400us see trec P12
128132
bool wakeup(uint32_t timeRecover = 400);
129133

130134

135+
// ERROR
136+
int lastError();
137+
138+
131139
protected:
132140
uint8_t _address;
133141
uint32_t _sizeBytes;
134142
// default no pin = -1 ==> no write protect.
135143
int8_t _writeProtectPin = -1;
136144
TwoWire* _wire;
145+
int _error;
137146

138147
uint32_t _getMetaData();
139148
// virtual so derived classes FRAM9/11 use their implementation.

0 commit comments

Comments
 (0)