AVR Embedded Tutorial - I²C EEPROM
Deutsch · English
I²C EEPROM (24LC256)
This code is for an Atmega328 / Arduino with a 16MHz clock and an 24LC256 I2C compatible 2-wire Serial EEPROM. Other 24LCxx EEPROMs can also be controlled.
The following functions are described in other tutorials:
This tutorial shows you how to control an external EEPROM (24LC256) which is connected to the I²C bus.
PullUp resistors are necessary, the EEPROM does not contain any itself.
Functions for EEPROM (24LC256) control
Constants
const
TWI_Write = 0;
TWI_Read = 1;Functions
Note: For a ShortString, the length byte is stored at position [0] in the string.
Call parameters:
- addr device address on the I²C bus
- pos storage location in the EEPROM
- value byte to be written
Functions for writing and reading a byte
// Write a character
procedure I2C_EEPROM_Write(addr , pos : Int16; value : Byte);
begin
TWIStart((addr shl 1) or TWI_Write);
TWIWrite(pos shr 8);
TWIWrite(pos and $FF);
TWIWrite(value);
TWIStop;
delay_ms(10);
end;
// Read a character
function I2C_EEPROM_Read(addr, pos : Int16) : byte;
begin
TWIStart((addr shl 1) or TWI_Write);
TWIWrite(pos shr 8);
TWIWrite(pos and $FF);
TWIStop;
TWIStart((addr shl 1) or TWI_Read);
Result := TWIReadNACK;
TWIStop;
end;Functions for writing and reading a string
A ShortString, or other buffer, is written / read character by character.
// Write a string, including length byte
procedure I2C_EEPROM_WriteString(addr, pos : Int16; s : ShortString);
var
i : byte;
begin
for i := 0 to Length(s) do
begin
I2C_EEPROM_Write(addr, pos + i, byte(s[i]));
end;
end;
// Read a string, including length byte
function I2C_EEPROM_ReadString(addr, pos : Int16) : ShortString;
var
i, l : byte;
begin
l := I2C_EEPROM_Read(addr, pos); // read length of string stored at [0]
SetLength(Result, l);
for i := 1 to l do
begin
Result[i] := Char(I2C_EEPROM_Read(addr, pos + i));
end;
end;Example program
Constants and variables
const
I2Caddr = $54; // Address of the 24LC256 on the I²C bus
s1 = 'Hello World!';
s2 = 'AVR with Lazarus is so beautiful';
var
s : ShortString;Main program
Since a ShortString is 256 bytes long, the second string at address $100 (256) is saved in the EEPROM.
begin
UARTInit; // initialize UART
TWIInit; // initialize I²C
asm Sei END; // enable interrupts
// save the two strings
I2C_EEPROM_WriteString(I2Caddr, 0, s1); // first string
I2C_EEPROM_WriteString(I2Caddr, $100, s2); // second string
// eeload the strings for verification
repeat
s := I2C_EEPROM_ReadString(I2Caddr, 0);
UARTSendString('s1:');
UARTSendString(s);
UARTSendString(#13#10);
s := I2C_EEPROM_ReadString(I2Caddr, $100);
UARTSendString('s2:');
UARTSendString(s);
UARTSendString(#13#10);
until 1 = 2;
end.If you do not believe that the string is in the EEPROM, you can exclude the two lines with WriteString (... and test again.
See also
- Overview page - AVR Embedded Tutorials
From the Free Pascal wiki, page "AVR Embedded Tutorial - I²C EEPROM", as it stood on 2020-03-08 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
