4.24. FRAM
4.24.1. Module Files
4.24.1.1. Driver
src/app/driver/fram/fram.c
src/app/driver/fram/fram.h
4.24.1.2. Configuration
src/app/driver/config/fram_cfg.c
src/app/driver/config/fram_cfg.h
4.24.1.3. Unit Test
tests/unit/app/driver/fram/test_fram.c
4.24.2. Description
The FRAM (ferroelectric random access memory) used is the model CY15B102QN. It is a 2 Mbit logically organized as 256K x 8 bits. It is non-volatile, does not need to be supplied to retain its data and can be written a virtually unlimited number of times. The FRAM is driven by an SPI interface.
FRAM data variables and entries are defined in the fram_cfg.c
file.
These must also be declared as extern in the fram_cfg.h
file.
In fram_cfg.c
, the structure fram_base_header
contains a list of all
variables and entries, along with their size.
In fram_cfg.h, an enum called FRAM_BLOCK_ID_e
is declared. One element
in the enum must be defined as ID for each FRAM variable and entry.
Warning
The entries in the enum FRAM_BLOCK_ID_e
must have the same order as
their definition in the structure fram_base_header
. There must be the
same number of entries in the structure fram_base_header
as
in the enum FRAM_BLOCK_ID_e
.
Warning
The enum must always end with FRAM_BLOCK_MAX
.
The function FRAM_Initialize()
computes the address of each entry in
the FRAM. If the computed address is greater than the highest address
of the FRAM memory, an error is thrown.
Warning
The function FRAM_Initialize()
must be called before using the FRAM.
There are two main functions to interact with the FRAM:
FRAM_WriteData()
and FRAM_ReadData()
. They must simply be called with
one of the IDs defined in the enum called FRAM_BLOCK_ID_e
.
When FRAM_WriteData()
is called, the content of the corresponding variable
defined in the fram_cfg.c
file is written to the FRAM.
When FRAM_ReadData()
is called, the content of the FRAM is read and written
to the corresponding variable defined in the fram_cfg.c
file.
These functions use SPI and are blocking. The SPI used for the FRAM can be
configured in spi_cfg.c
.
Warning
The SPI used for the communication with the FRAM must be configured
with SPI_HARDWARE_CHIP_SELECT_DISABLE_ALL
as the Chip Select pin is
driven via software.
When writing a variable or entry, the FRAM module first computes a CRC of the data written and stores it in the FRAM before the data. When reading, the FRAM module reads the CRC and the data, computes the CRC of the read data and compares it with the read CRC. This mechanism is transparent when using the FRAM so it is not necessary to define a CRC field in the variables and entries.
When changing the FRAM layout, the alignment will not match anymore and this
will be detected with the CRC. The function FRAM_ReinitializeAllEntries()
is available. It will write all variables and entries with their current
state. The consequence is that the alignment will be restored. This function
is useful when making developments that involve changes in the FRAM data
layout.
The read and write functions return one of the following four values:
FRAM_ACCESS_OK
: the write or read access was successful and the CRC read matches with the CRC calculated on the read data.FRAM_ACCESS_SPI_BUSY
: the SPI is busy, the transaction could not take place.FRAM_ACCESS_CRC_BUSY
: the CRC hardware is busy, the transaction could not take place.FRAM_ACCESS_CRC_ERROR
: the data was read from the FRAM but the read CRC does not match with the CRC computed on the read data.