05 Serial Sinkron SPI I2C
Serial Sinkron
SPI & I2C Interface
Teknik Antarmuka Komputer
(TKE 4145)
Eka Maulana
maulana.lecture.ub.ac.id
Antarmuka Serial Sinkron
I2C
SPI
Antarmuka Serial Asinkron
Comparison of Serial
Interfaces
Outline
• What is SPI?
• SPI Confiuration
• SPI Operation
• Master Slave Setup
• SPI Transactions
• SPI Peripheral Types
• SPI and Microcontrollers
• ESBUS
SPI
(Serial Peripheral
Interface)
• Developed by Motorola
•Also known as MicroWire (National
Semiconductor), QSPI (Queued), MicrowirePlus
•Synchronous Serial Communication
SPI Bus
SPI Configraaion
• Primarily used for serial
communication
between a host
processor and
peripherals.
• Can also connect 2
processors via SPI
• SPI works in a master
slave confiuration
with the master beini
the host
microcontroller for
example and the slave
beini the peripheral
SPI Operation
• For SPI, there are Serial Clocks (SCLK), Chip
Select lines (CS), Serial Data In (SDI) and Serial
Data Out( SDO)
• There is only one master, there number of
slaves depends on the number of chip select
lines of the master.
• Synchronous operation, latch on risini or fallini
edie of clock, SDI on risini edie, SDO on fallini
edie
• Operates in 1 to 2 MHz ranie
• Master sends out clocks and chip selects.
Activates the slaves it wants to communicate
with
Master Slave Setup
• Multiple Independent
• In this setup, there are 3 slave
devices.
The
Slave
Confiuration
SDO lines are tied toiether to the SDI line of the
master.
• The master determines which chip it is talkini
to by the CS lines. For the slaves that are not
beini talked to, the data output ioes to a Hi Z
state
Master Slave Setup
Multiple slave cascaded
• In this example, each slave is cascaded so
that the output of one slave is the input of
another. When cascadini, they are treated
as one slave and connectini to the same
chip select
SPI Timini Diairam
EEPROM Read
SPI Transaction
SPI Peripheral Types
• Converters (ADC, DAC)
• Memories (EEPROM, RAM’s,Flash)
• Sensors (Temperature, Humidity,
Pressure)
• Real Time Clocks
• Misc- Potentiometers, LCD controllers,
UART’s, USB controller, CAN
controller,amplifers
Peripherals
• Vendors that make these peripherals :
• Atmel –EEPROM, Dii. POT’s
• Infneon- Pressure Sensors, Humidity
Sensors
• Maxim- ADC, DAC, UART,
• TI- DSP’s, ADC, DAC
• National Semiconductor- Temperature
Sensors, LCD/USB controllers
SPI and Microcontrollers
• Motorola 68HC12 Has SPI built in
hardware. Easy to inteirate. See EE583
• Intel 8051 Dependini on Models, Most
Cyinal products have I2C and some have
SPI also built in hardware for easy
inteiration.
PIM_9C32
Block Diagram
SPI module
Pin
PM2
PM3
PM4
PM5
68HCS12 SPI0 Signals
SPI0 signal
Name
MISO
Master-In-Slave-Out
MOSI
Master-Out-Slave-In
SCK
Serial Clock
SS
Slave Select
SCK
SCK
MASTER
MOSI
7 6 5 4 3 2 1 0
SLAVE
MISO
MISO
SP0DR
7 6 5 4 3 2 1 0
SP0DR
SS
SS
MOSI
$DA
$D8
The SPI module
SPIxCON reiister
Initializini SPI2
Pin 12 of PORTD is connected to the memory chip select (CS):
#defne CSEE _RD12
// select line for Serial EEPROM
#defne TCSEE _TRISD12
// tris control for CSEE pin
Peripheral initialization:
// 1. init the SPI peripheral
TCSEE = 0;
// make SSEE pin output
CSEE = 1;
// de-select the Serial EEPROM
SPI2CON1 = SPI_MASTER; // select mode
SPI2STAT = SPI_ENABLE; // enable the peripheral
Where:
#defne SPI_MASTER 0x0120 // 8-bit master mode, CKE=1, CKP =0
#defne SPI_ENABLE 0x8000 // enable SPI port, clear status
A small function that will be used to transfer data to and from the serial EEPROM device:
// send one byte of data and receive one back at the same time
int WriteSPI2( int data)
{
SPI2BUF = data;
// write to bufer for TX
while( !SPI2STATbits.SPIRBF); // wait transfer completion
return SPI2BUF;
} // WriteSPI2
// read the received value
The 25LC256 Serial
EEPROM
// 25LC256 Serial EEPROM commands
#defne SEE_WRSR 1
// write status reiister
#defne SEE_WRITE 2
// write command
#defne SEE_READ 3
// read command
#defne SEE_WDI
4
// write disable
#defne SEE_STAT 5
// read status reiister
#defne SEE_WEN
6
// write enable
25LC256 Status Reiister
// 2. Check the Serial EEPROM status
CSEE = 0;
// select the Serial EEPROM
writeSPI2( SEE_STAT);
// send a READ STATUS COMMAND
i = writeSPI2( 0);
// send/receive
CSEE = 1;
// deselect, terminate command
// 2.1 send a Write Enable command
CSEE = 0;
// select the Serial EEPROM
WriteSPI2( SEE_WEN);
// write enable command
CSEE = 1;
// deselect, terminate command
Writini to the EEPROM
// send a Write command
CSEE = 0;
//
WriteSPI2( SEE_WRITE);
//
WriteSPI2( addr_MSB);
//
WriteSPI2( addr_LSB);
//
WriteSPI2( data);
//
// continue writing more data…
CSEE = 1;
select the Serial EEPROM
write command
address MSB first
address LSB (word aligned)
send 8-bit of data
// wait until any work in progress is completed
while ( ReadSR() & 0x1);
// check the WIP flag
Readini from the EEPROM
// perform a read sequence
CSEE = 0;
// select the Serial EEPROM
WriteSPI2( SEE_READ);
// read command
WriteSPI2( addr_MSB);
// address MSB first
WriteSPI2( addr_LSB);
// address LSB (word aligned)
data = WriteSPI2( 0);
// send dummy, read msb
// continue reading a second byte, a third…
CSEE = 1;
I2C
I2C Interface Examples
A few examples of devices usini the I2C interface :
1Mbit Serial EEPROMS: 24xx1025
18-bit delta siima ADCs: MCP3421
16-bit delta siima ADCs: MCP3425
12-bit SAR ADCs:MCP3221
12-bit D/A: MCP4725
Inteirated Temperature Sensor (+/-0.5C): MCP9803
I/O Expander 8/16-bit: MCP23016/MCP2308
Consider additionally:
Battery iauies
Audio codecs
GPS receivers
LCD displays controllers
Card readers
I2C Data Transfer Rules
Two simple rules dictate how to operate from here:
When the SCL line is low, and only at this time, the SDA line can change.
When the SCL line is high, the SDA line status indicates the value of a bit.
Two exceptions to rule 1 create special conditions that are used to delimit the
beginning and end of each transaction between two devices on the bus. When
SCL is high:
A START condition is indicated by the SDA line changing from high to low
A STOP condition is indicated by the SDA line changing from low to high
The 24LC00 Serial EEPROM
I2C has been for years the favorite choice for serial EEPROM users
and manufacturers for two reasons:
Only two pins (I/Os) are required to communicate with the
device, enablini the embedded control desiiner to use very low
pin count (inexpensive) microcontrollers.
Just four pads (areas of contacts on the chip) are required for a
Serial EEPROM device. Two provide the power supply and the
remainini two are the I2C lines. This reduces the silicon area
overhead due to the contacts on a typically very small device -hence the hiih impact/cost of the pads.
In practice most I2C serial EEPROMs have at least a ffth
contact/pin (WP) to protect the device contents by disablini
writini.
Talkini to the Serial
EEPROM
The SEE Grammar
Usini the followini simple notation:
S = START sequence
P = STOP sequence
A/N = Acknowledie bit
0xXX= data byte (hex notation)
0bXXXXXXXX =data byte (in binary notation)
and usini brackets () to indicate parts of the conversation produced by a slave we
can represent a typical I2C protocol messaie in a compact notation
Here is an example of a read command sequence for a 24LC00 (128 bit) SEE:
S 0b01010001 (A) (Data) NP
A Write Example
S 0b01010000 (A) ByteAddress (A) Data (A) P
I2CxCON reiister
Initializini the I2C module
void InitSEE( long fcy)
// fcy = processor operating frequency in Hz (system clock)
{
// Configure I2C for 7 bit address mode 100kHz
OpenI2C1( I2C_ON | I2C_IDLE_CON | I2C_7BIT_ADD | I2C_STR_EN
| I2C_GCALL_DIS | I2C_SM_DIS | I2C_IPMI_DIS,
(fcy /(2*BUS_FRQ))-1);
IdleI2C1();
T1CON=0x8030;
TMR1=0;
while( TMR1< 100);
} //InitSEE
Sendini the Address
int addressSEE( long add)
// send the address selection command
// repeat if SEE busy
{
int cmd;
// 1. Form SEE command + address msb (3)
cmd= 0xA0|((add>>7)&0xE);
// 2. WRITE(!) the Address msb
// try send command and repeat until ACK is received
while( 1)
{
StartI2C1();
IdleI2C1();
// send command and address msb(3)
MasterWriteI2C1( cmd+WRITE_CMD);
IdleI2C1();
if (I2C1STATbits.ACKSTAT==0)
break;
StopI2C1();
IdleI2C1();
Loiic Analyzer Capture
Writini a 16-bit value
S 0b01010000 (A) ByteAddress (A) DataLSB (A) DataMSB (A) P
void iWriteSEE( long add, int v)
// SEE write command sequence
{
int cmd;
// 1. select address
cmd = AddressSEE( add);
// 2. stream data out
MasterWriteI2C1( v&0xFF);
IdleI2C1();
MasterWriteI2C1( v>>8);
IdleI2C1();
// 3. terminate the command sequence
StopI2C1();
IdleI2C1();
} // iWriteSEE
Readini a 16-bit value
S 0b01010000 (A) ByteAddress(A) P
S 0b01010001 (A) (DataLSB) [A] (Data MSB) NP
int iReadSEE( long add)
// random access read command sequence
{
int cmd, r;
// 1. select address
cmd = AddressSEE( add);
StopI2C1();
IdleI2C1();
// 2. read command
StartI2C1(); IdleI2C1();
MasterWriteI2C1( cmd+READ_CMD);
IdleI2C1();
// 3. stream data in (will continue until NACK is sent)
r= MasterReadI2C1( );
AckI2C1(); IdleI2C1();
Address Selection
Data Read
Notes for the PIC MCU
Experts
In addition to the SPI options available on most PIC microcontroller
(ofered by the SSP and MSSP modules), such as:
Selectable clock polarity
Selectable clock edie
Master or Slave mode operation
The PIC24 SPI interface module adds several new capabilities, includini:
A 16-bit transfer mode
Data input samplini phase selection
Framed transmission mode
Frame synch pulse control (polarity and edie selectable)
Enhanced Mode (8 deep transmit and receive FIFOs)
Usini the new Enhanced Mode, with 8 levels deep FIFOs , up to 8 words
of data (16 bytes) can be written or retrieved from the SPI bufers in
short bursts, leavini more time to the CPU to process the data in
between.
Tips
and
Tricks
Safety measures suiiested to reduce the risk of SEE data
corruption:
Ensure adequate power supply decouplini (a capacitor) is
provided close to the memory device.
A pull up resistor (10k Ohm) is provided on the Chip Select
line, to avoid foatini durini the microcontroller power up
and reset.
An additional pull down resistor (10k Ohm) can be provided
on the SCK clock line to avoid clockini of the peripheral
durini boundary scan and other board testini procedures.
Verify clean and fast power-up and down slope are provided
to the microcontroller to iuarantee reliable Power On Reset
operation. If necessary add an external voltaie supervisor
(see MCP809 devices for example).
Tips and Tricks
A number of software methods can be employed to prevent a proiram bui
miiht triiier the write routine:
Avoid readini and especially updatini the NVM content riiht after power up.
Allow a few milliseconds for the power supply to stabilize (application
dependent).
Add a software write-enable fai, and demand that the callini application set
the fai before callini the write routine, possibly after verifyini some
essential application specifc entry condition.
Add a stack level counter; each function in the stack of calls implemented by
the library should increments the counter upon entry and decrement it on
exit. The write routine should refuse to perform if the counter is not at the
expected level.
Some refuse to use the NVM memory locations correspondini to the frst
address (0x0000) and/or the last address (0xff) believini they could be
more likely to be the subject to corruption.
Store two copies of each essential piece of data, performini two separate
calls to the write routine. If each copy contains even a simple checksum, it
will be easy, when readini it back, to discard the corrupted one and recover.
Suiiested Excercises
Several functions in the library are performini lockini loops that
could reduce the overall application performance. By utilizini
the SPI port interrupts implement a non blockini version of the
library.
Enable the new SPI 16-bit mode to accelerate basic read and
write operation.
Develop (circular) bufered versions of the read and write
functions.
SPI & I2C Interface
Teknik Antarmuka Komputer
(TKE 4145)
Eka Maulana
maulana.lecture.ub.ac.id
Antarmuka Serial Sinkron
I2C
SPI
Antarmuka Serial Asinkron
Comparison of Serial
Interfaces
Outline
• What is SPI?
• SPI Confiuration
• SPI Operation
• Master Slave Setup
• SPI Transactions
• SPI Peripheral Types
• SPI and Microcontrollers
• ESBUS
SPI
(Serial Peripheral
Interface)
• Developed by Motorola
•Also known as MicroWire (National
Semiconductor), QSPI (Queued), MicrowirePlus
•Synchronous Serial Communication
SPI Bus
SPI Configraaion
• Primarily used for serial
communication
between a host
processor and
peripherals.
• Can also connect 2
processors via SPI
• SPI works in a master
slave confiuration
with the master beini
the host
microcontroller for
example and the slave
beini the peripheral
SPI Operation
• For SPI, there are Serial Clocks (SCLK), Chip
Select lines (CS), Serial Data In (SDI) and Serial
Data Out( SDO)
• There is only one master, there number of
slaves depends on the number of chip select
lines of the master.
• Synchronous operation, latch on risini or fallini
edie of clock, SDI on risini edie, SDO on fallini
edie
• Operates in 1 to 2 MHz ranie
• Master sends out clocks and chip selects.
Activates the slaves it wants to communicate
with
Master Slave Setup
• Multiple Independent
• In this setup, there are 3 slave
devices.
The
Slave
Confiuration
SDO lines are tied toiether to the SDI line of the
master.
• The master determines which chip it is talkini
to by the CS lines. For the slaves that are not
beini talked to, the data output ioes to a Hi Z
state
Master Slave Setup
Multiple slave cascaded
• In this example, each slave is cascaded so
that the output of one slave is the input of
another. When cascadini, they are treated
as one slave and connectini to the same
chip select
SPI Timini Diairam
EEPROM Read
SPI Transaction
SPI Peripheral Types
• Converters (ADC, DAC)
• Memories (EEPROM, RAM’s,Flash)
• Sensors (Temperature, Humidity,
Pressure)
• Real Time Clocks
• Misc- Potentiometers, LCD controllers,
UART’s, USB controller, CAN
controller,amplifers
Peripherals
• Vendors that make these peripherals :
• Atmel –EEPROM, Dii. POT’s
• Infneon- Pressure Sensors, Humidity
Sensors
• Maxim- ADC, DAC, UART,
• TI- DSP’s, ADC, DAC
• National Semiconductor- Temperature
Sensors, LCD/USB controllers
SPI and Microcontrollers
• Motorola 68HC12 Has SPI built in
hardware. Easy to inteirate. See EE583
• Intel 8051 Dependini on Models, Most
Cyinal products have I2C and some have
SPI also built in hardware for easy
inteiration.
PIM_9C32
Block Diagram
SPI module
Pin
PM2
PM3
PM4
PM5
68HCS12 SPI0 Signals
SPI0 signal
Name
MISO
Master-In-Slave-Out
MOSI
Master-Out-Slave-In
SCK
Serial Clock
SS
Slave Select
SCK
SCK
MASTER
MOSI
7 6 5 4 3 2 1 0
SLAVE
MISO
MISO
SP0DR
7 6 5 4 3 2 1 0
SP0DR
SS
SS
MOSI
$DA
$D8
The SPI module
SPIxCON reiister
Initializini SPI2
Pin 12 of PORTD is connected to the memory chip select (CS):
#defne CSEE _RD12
// select line for Serial EEPROM
#defne TCSEE _TRISD12
// tris control for CSEE pin
Peripheral initialization:
// 1. init the SPI peripheral
TCSEE = 0;
// make SSEE pin output
CSEE = 1;
// de-select the Serial EEPROM
SPI2CON1 = SPI_MASTER; // select mode
SPI2STAT = SPI_ENABLE; // enable the peripheral
Where:
#defne SPI_MASTER 0x0120 // 8-bit master mode, CKE=1, CKP =0
#defne SPI_ENABLE 0x8000 // enable SPI port, clear status
A small function that will be used to transfer data to and from the serial EEPROM device:
// send one byte of data and receive one back at the same time
int WriteSPI2( int data)
{
SPI2BUF = data;
// write to bufer for TX
while( !SPI2STATbits.SPIRBF); // wait transfer completion
return SPI2BUF;
} // WriteSPI2
// read the received value
The 25LC256 Serial
EEPROM
// 25LC256 Serial EEPROM commands
#defne SEE_WRSR 1
// write status reiister
#defne SEE_WRITE 2
// write command
#defne SEE_READ 3
// read command
#defne SEE_WDI
4
// write disable
#defne SEE_STAT 5
// read status reiister
#defne SEE_WEN
6
// write enable
25LC256 Status Reiister
// 2. Check the Serial EEPROM status
CSEE = 0;
// select the Serial EEPROM
writeSPI2( SEE_STAT);
// send a READ STATUS COMMAND
i = writeSPI2( 0);
// send/receive
CSEE = 1;
// deselect, terminate command
// 2.1 send a Write Enable command
CSEE = 0;
// select the Serial EEPROM
WriteSPI2( SEE_WEN);
// write enable command
CSEE = 1;
// deselect, terminate command
Writini to the EEPROM
// send a Write command
CSEE = 0;
//
WriteSPI2( SEE_WRITE);
//
WriteSPI2( addr_MSB);
//
WriteSPI2( addr_LSB);
//
WriteSPI2( data);
//
// continue writing more data…
CSEE = 1;
select the Serial EEPROM
write command
address MSB first
address LSB (word aligned)
send 8-bit of data
// wait until any work in progress is completed
while ( ReadSR() & 0x1);
// check the WIP flag
Readini from the EEPROM
// perform a read sequence
CSEE = 0;
// select the Serial EEPROM
WriteSPI2( SEE_READ);
// read command
WriteSPI2( addr_MSB);
// address MSB first
WriteSPI2( addr_LSB);
// address LSB (word aligned)
data = WriteSPI2( 0);
// send dummy, read msb
// continue reading a second byte, a third…
CSEE = 1;
I2C
I2C Interface Examples
A few examples of devices usini the I2C interface :
1Mbit Serial EEPROMS: 24xx1025
18-bit delta siima ADCs: MCP3421
16-bit delta siima ADCs: MCP3425
12-bit SAR ADCs:MCP3221
12-bit D/A: MCP4725
Inteirated Temperature Sensor (+/-0.5C): MCP9803
I/O Expander 8/16-bit: MCP23016/MCP2308
Consider additionally:
Battery iauies
Audio codecs
GPS receivers
LCD displays controllers
Card readers
I2C Data Transfer Rules
Two simple rules dictate how to operate from here:
When the SCL line is low, and only at this time, the SDA line can change.
When the SCL line is high, the SDA line status indicates the value of a bit.
Two exceptions to rule 1 create special conditions that are used to delimit the
beginning and end of each transaction between two devices on the bus. When
SCL is high:
A START condition is indicated by the SDA line changing from high to low
A STOP condition is indicated by the SDA line changing from low to high
The 24LC00 Serial EEPROM
I2C has been for years the favorite choice for serial EEPROM users
and manufacturers for two reasons:
Only two pins (I/Os) are required to communicate with the
device, enablini the embedded control desiiner to use very low
pin count (inexpensive) microcontrollers.
Just four pads (areas of contacts on the chip) are required for a
Serial EEPROM device. Two provide the power supply and the
remainini two are the I2C lines. This reduces the silicon area
overhead due to the contacts on a typically very small device -hence the hiih impact/cost of the pads.
In practice most I2C serial EEPROMs have at least a ffth
contact/pin (WP) to protect the device contents by disablini
writini.
Talkini to the Serial
EEPROM
The SEE Grammar
Usini the followini simple notation:
S = START sequence
P = STOP sequence
A/N = Acknowledie bit
0xXX= data byte (hex notation)
0bXXXXXXXX =data byte (in binary notation)
and usini brackets () to indicate parts of the conversation produced by a slave we
can represent a typical I2C protocol messaie in a compact notation
Here is an example of a read command sequence for a 24LC00 (128 bit) SEE:
S 0b01010001 (A) (Data) NP
A Write Example
S 0b01010000 (A) ByteAddress (A) Data (A) P
I2CxCON reiister
Initializini the I2C module
void InitSEE( long fcy)
// fcy = processor operating frequency in Hz (system clock)
{
// Configure I2C for 7 bit address mode 100kHz
OpenI2C1( I2C_ON | I2C_IDLE_CON | I2C_7BIT_ADD | I2C_STR_EN
| I2C_GCALL_DIS | I2C_SM_DIS | I2C_IPMI_DIS,
(fcy /(2*BUS_FRQ))-1);
IdleI2C1();
T1CON=0x8030;
TMR1=0;
while( TMR1< 100);
} //InitSEE
Sendini the Address
int addressSEE( long add)
// send the address selection command
// repeat if SEE busy
{
int cmd;
// 1. Form SEE command + address msb (3)
cmd= 0xA0|((add>>7)&0xE);
// 2. WRITE(!) the Address msb
// try send command and repeat until ACK is received
while( 1)
{
StartI2C1();
IdleI2C1();
// send command and address msb(3)
MasterWriteI2C1( cmd+WRITE_CMD);
IdleI2C1();
if (I2C1STATbits.ACKSTAT==0)
break;
StopI2C1();
IdleI2C1();
Loiic Analyzer Capture
Writini a 16-bit value
S 0b01010000 (A) ByteAddress (A) DataLSB (A) DataMSB (A) P
void iWriteSEE( long add, int v)
// SEE write command sequence
{
int cmd;
// 1. select address
cmd = AddressSEE( add);
// 2. stream data out
MasterWriteI2C1( v&0xFF);
IdleI2C1();
MasterWriteI2C1( v>>8);
IdleI2C1();
// 3. terminate the command sequence
StopI2C1();
IdleI2C1();
} // iWriteSEE
Readini a 16-bit value
S 0b01010000 (A) ByteAddress(A) P
S 0b01010001 (A) (DataLSB) [A] (Data MSB) NP
int iReadSEE( long add)
// random access read command sequence
{
int cmd, r;
// 1. select address
cmd = AddressSEE( add);
StopI2C1();
IdleI2C1();
// 2. read command
StartI2C1(); IdleI2C1();
MasterWriteI2C1( cmd+READ_CMD);
IdleI2C1();
// 3. stream data in (will continue until NACK is sent)
r= MasterReadI2C1( );
AckI2C1(); IdleI2C1();
Address Selection
Data Read
Notes for the PIC MCU
Experts
In addition to the SPI options available on most PIC microcontroller
(ofered by the SSP and MSSP modules), such as:
Selectable clock polarity
Selectable clock edie
Master or Slave mode operation
The PIC24 SPI interface module adds several new capabilities, includini:
A 16-bit transfer mode
Data input samplini phase selection
Framed transmission mode
Frame synch pulse control (polarity and edie selectable)
Enhanced Mode (8 deep transmit and receive FIFOs)
Usini the new Enhanced Mode, with 8 levels deep FIFOs , up to 8 words
of data (16 bytes) can be written or retrieved from the SPI bufers in
short bursts, leavini more time to the CPU to process the data in
between.
Tips
and
Tricks
Safety measures suiiested to reduce the risk of SEE data
corruption:
Ensure adequate power supply decouplini (a capacitor) is
provided close to the memory device.
A pull up resistor (10k Ohm) is provided on the Chip Select
line, to avoid foatini durini the microcontroller power up
and reset.
An additional pull down resistor (10k Ohm) can be provided
on the SCK clock line to avoid clockini of the peripheral
durini boundary scan and other board testini procedures.
Verify clean and fast power-up and down slope are provided
to the microcontroller to iuarantee reliable Power On Reset
operation. If necessary add an external voltaie supervisor
(see MCP809 devices for example).
Tips and Tricks
A number of software methods can be employed to prevent a proiram bui
miiht triiier the write routine:
Avoid readini and especially updatini the NVM content riiht after power up.
Allow a few milliseconds for the power supply to stabilize (application
dependent).
Add a software write-enable fai, and demand that the callini application set
the fai before callini the write routine, possibly after verifyini some
essential application specifc entry condition.
Add a stack level counter; each function in the stack of calls implemented by
the library should increments the counter upon entry and decrement it on
exit. The write routine should refuse to perform if the counter is not at the
expected level.
Some refuse to use the NVM memory locations correspondini to the frst
address (0x0000) and/or the last address (0xff) believini they could be
more likely to be the subject to corruption.
Store two copies of each essential piece of data, performini two separate
calls to the write routine. If each copy contains even a simple checksum, it
will be easy, when readini it back, to discard the corrupted one and recover.
Suiiested Excercises
Several functions in the library are performini lockini loops that
could reduce the overall application performance. By utilizini
the SPI port interrupts implement a non blockini version of the
library.
Enable the new SPI 16-bit mode to accelerate basic read and
write operation.
Develop (circular) bufered versions of the read and write
functions.