Skip to main content

Xadow - Storage

Most AVRs have a small EEPROM which can be used to save variables, configuration setting etc. Like Chip Atmega32u4 Xadow Main Board used has 1K Bytes Internal EEPROM. If you want more storage for your Xadow project, this module is designed for you! This module supplies two extra 32K byte for your project. The Xadow Storage can be powered by 3.3V. And it is compatible with Xadow system.


  • Work Voltage: 3.3V

  • Control Mode: I2C

  • EEPROM: AT24C256C

  • I2C Address are convertible

  • Dimensions: 25.43mm x 20.35mm

I2C Address Setting

Two AT24C256 of Xadow Storage are sharing a common two-wire bus. Each AT24C256 has a eight-bit hardware address which is referred to as a slave address. The slave address is configured by the A2,A1 and A0 address selection inputs. The A2, A1, and A0 pins are device address inputs that are hardwired directly to GND or to VCC. If these pins are left floating, the A2, A1, and A0 pins will be internally pulled down to GND.

Slave Address[A6 - A0] A2,A1 and A0 inputs state
A2 A1 A0
1010001(0x51) GND/Floating GND/Floating VCC
1010010(0x52) GND/Floating VCC GND/Floating
1010011(0x53) GND/Floating VCC VCC
1010100(0x54) VCC GND/Floating GND/Floating
1010101(default 0x55) VCC GND/Floating VCC
1010110(0x56) VCC VCC GND/Floating
1010111(0x57) VCC VCC VCC

In default mode, one AT24C256(U1) I2C Address is 0x50 and another AT24C256(U2) I2C Address is 0x51(see the Xadow Storage).


Using the Xadow Storage, we can permanently store data even if the power is turned off. Now we show a demo: write data to storage and read it.

Hardware Installation:

Note: when connect Xadow Storage to Xadow Main Board, you should concern about the connection direction. The connection method is that the unfilled corner of one Xadow module need to connect to the right angle of another module(see four corners of each Xadow module).

The demo code:

#include <Wire.h> //I2C library
void setup()
char somedata[] = "this is data from the eeprom"; // data to write
Wire.begin(); // initialise the connection
i2c_eeprom_write_page(0x51, 0, (byte *)somedata, sizeof(somedata)); // write to EEPROM

delay(10); //add a small delay

Serial.println("Memory written");
void loop()
int addr=0; //first address
byte b = i2c_eeprom_read_byte(0x51, 0); // access the first address from the memory

while (b!=0)
Serial.print((char)b); //print content to serial port
addr++; //increase address
b = i2c_eeprom_read_byte(0x51, addr); //access an address from the memory
Serial.println(" ");
void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
int rdata = data;
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB

// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
Wire.write((int)(eeaddresspage >> 8)); // MSB
Wire.write((int)(eeaddresspage & 0xFF)); // LSB
byte c;
for ( c = 0; c < length; c++)
byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
if (Wire.available()) rdata =;
return rdata;
// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
int c = 0;
for ( c = 0; c < length; c++ )
if (Wire.available()) buffer[c] =;

Schematic Online Viewer


Tech Support & Product Discussion

Thank you for choosing our products! We are here to provide you with different support to ensure that your experience with our products is as smooth as possible. We offer several communication channels to cater to different preferences and needs.

Loading Comments...