Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions libraries/JW_FRAM/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# Changelog

## [1.0.3] - 2026-07-15

### Corregido
- `writeBlock()` ahora habilita la escritura de forma independiente para el encabezado y el payload.
- Se evita que el payload quede sin escribir en memorias que limpian el latch WEL al finalizar cada comando `WRITE`.
- La lectura posterior mediante `readBlock()` vuelve a validar correctamente `magic`, versión, longitud y checksum.

### Notas
- `get()`, `put()` y `update()` no estaban afectados porque cada operación `put()` ya ejecutaba su propio ciclo `WREN -> WRITE -> WRDI`.
- La corrección mantiene la API pública y el formato almacenado sin cambios.

## [1.0.2] - 2026-04-24

### Added
Expand All @@ -14,7 +25,6 @@
### Notes
- This version improves compatibility with JWPLC hardware families using shared SPI peripherals such as TFT, FRAM, microSD and Ethernet.


## [1.0.1] - 2026-04-03
### Añadido
- Estructura completa de librería compatible con el ecosistema Arduino.
Expand All @@ -28,4 +38,4 @@

## [1.0.0] - 2026-04-03
### Inicial
- Primera propuesta funcional de JW_FRAM.
- Primera propuesta funcional de JW_FRAM.
5 changes: 3 additions & 2 deletions libraries/JW_FRAM/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,8 @@ Esto sirve para detectar:
- corrupción de datos
- tamaños de payload incorrectos

Desde `JW_FRAM 1.0.3`, `writeBlock()` ejecuta una habilitación de escritura independiente para el header y otra para el payload. Esto mantiene compatibilidad con memorias que limpian el latch WEL al finalizar cada comando `WRITE`.

### Ejemplo

```cpp
Expand Down Expand Up @@ -272,7 +274,6 @@ Eso permite trabajar con memorias FRAM compatibles aunque no estén todavía inc
## Estructura recomendada de la librería

La librería ya fue preparada con archivos compatibles con el ecosistema Arduino:

- `src/`
- `examples/`
- `library.properties`
Expand All @@ -292,4 +293,4 @@ Para versiones posteriores podrían añadirse:

## Nota de licencia

La base original de Adafruit usa licencia BSD. Si esta librería deriva de ese trabajo, se debe conservar la atribución correspondiente y mantener el texto de licencia apropiado. El repositorio de Adafruit FRAM SPI publica su licencia BSD con cláusula de atribución y limitación de responsabilidad. citeturn948721view0
La base original de Adafruit usa licencia BSD. Si esta librería deriva de ese trabajo, se debe conservar la atribución correspondiente y mantener el texto de licencia apropiado. El repositorio de Adafruit FRAM SPI publica su licencia BSD con cláusula de atribución y limitación de responsabilidad.
4 changes: 2 additions & 2 deletions libraries/JW_FRAM/library.properties
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
name=JW_FRAM
version=1.0.2
version=1.0.3
author=JW Control
maintainer=JW Control
sentence=Libreria SPI FRAM con API estilo EEPROM para ESP32.
paragraph=Incluye acceso de bajo nivel y alto nivel para FRAM SPI, con soporte para tipos numericos, String, C strings, structs y bloques validados.
category=Data Storage
url=https://github.com/JW-Control/JW_FRAM
architectures=esp32
depends=Adafruit BusIO
depends=Adafruit BusIO
21 changes: 7 additions & 14 deletions libraries/JW_FRAM/src/JW_FRAM.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,21 +213,14 @@ bool JW_FRAM::writeBlock(uint32_t addr, const T &value, uint8_t version)
header.length = static_cast<uint16_t>(sizeof(T));
header.checksum = computeChecksum(reinterpret_cast<const uint8_t *>(&value), sizeof(T));

if (!writeEnable(true))
{
debugPrint(F("JW_FRAM::writeBlock() fallo al habilitar escritura"));
return false;
}

bool ok = write(addr, reinterpret_cast<const uint8_t *>(&header), sizeof(header));
// Header y payload se envían como dos comandos WRITE independientes.
// Cada WRITE usa put() para ejecutar su propio ciclo WREN -> WRITE -> WRDI.
// Esto evita perder el payload en dispositivos que limpian WEL al terminar
// la primera transacción de escritura.
bool ok = put(addr, header);
if (ok)
{
ok = write(addr + sizeof(header), reinterpret_cast<const uint8_t *>(&value), sizeof(T));
}

if (!writeEnable(false))
{
debugPrint(F("JW_FRAM::writeBlock() fallo al deshabilitar escritura"));
ok = put(addr + sizeof(header), value);
}

if (!ok)
Expand Down Expand Up @@ -296,4 +289,4 @@ bool JW_FRAM::readBlock(uint32_t addr, T &value, uint8_t expectedVersion)
return true;
}

#endif
#endif
6 changes: 3 additions & 3 deletions platform-jwplc-sync.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
PLATFORM_REPO=JW-Control/platform-jwplc

# Rama base hacia donde irá el PR
PLATFORM_BASE_BRANCH=develop/alpha31-release-readiness
PLATFORM_BASE_BRANCH=main

# Rama generada/actualizada por el workflow
PLATFORM_SYNC_BRANCH=sync/jw-libraries-alpha31
PLATFORM_SYNC_BRANCH=sync/jw-libraries-2.1.0

# Carpeta destino dentro de platform-jwplc
PLATFORM_LIBRARIES_PATH=JWPLC/JWPLC-2.0.0/libraries
PLATFORM_LIBRARIES_PATH=JWPLC/2.1.0/libraries

# Librerías que se copiarán desde JW-Libraries/libraries/
LIBRARIES="JW_MatrixButtons JW_FRAM JW_RTC JW_SD"