vendredi 6 juillet 2012

Talking to an external EEPROM via I2C protocol

Hello,
you may want sometimes to save data that are too much to handle by your poor little pic, well you may thought of using an external eeprom to save all your data their,
In this tutoriel, I'm going to tell how to interface the 24LC256 eeprom with a 16F887 pic microcontroller.

I2C is a protocol that can allow multiple slaves and multiple masters to be connected in the same network, and that's pretty awsom ^^, most of the time there is only one master and many slaves, but in our case there will be one master (our PIC 16F887) and one slave our (24LC256 eeprom).
The master can communicate with only one slave at a time so how can he make a difference between his slaves?
well that's easy every slave has its unique address in the network for example our 24LC256 address has a 7 bit address that's equal to in binary 0B1010A1A2A3,
A master in a I2C network can read xor write it can't do both of them at the same time, so you may wonder how the slave would know if the master need to right or read from it,
well that's simple if the master want to write in the eeprom it sends 0XA0 and if it want to read it sends 0XA1, in other terms the LSB is the bit responsible for reading or writing.

wiring The 24LC256 EEPROM

A1 A2 and A3 are wired to the ground so our eeprom address is 0B1010000
Wp it's a bit for writing protection or read only, I'm not sur just wired to the ground.
SDA is the pin responsible for sending and receiving data,
SCK is the serial clock
We must use 2 pull up resistor for SDA and SCL (in proteus isis use the pull up resistor model)

Writing and reading from the EEPROM

we will store a data in a specific address then we are going to read data from that address.
unsigned char i = 0;
char txt[4];
void rc(){
     uart1_write(10);
     uarT1_write(13);
}
void main(){
  uart1_init(9600);
  I2C1_Init(100000);
  uart1_write_text("initialize I2C communication");rc();
  I2C1_Start();
  uart1_write_text("Start I2C communication");rc();
  I2C1_Wr(0xA0);
  delay_ms(10);
  uart1_write_text("write eeprom address");rc();
  I2C1_Wr(0x00);
  delay_ms(10);
  uart1_write_text("write low address");rc();
  I2C1_Wr(0x00);
   delay_ms(10);
   uart1_write_text("write high address");rc();
  I2C1_Wr(26); //donnée à écrire
  delay_ms(10);
  uart1_write_text("send to be stored");rc();
  I2C1_Stop();
  uart1_write_text("Stop I2C communication");rc();
  Delay_100ms();
  I2C1_Start();
  uart1_write_text("Start I2C communication");rc();
  I2C1_Wr(0xA0);
    delay_ms(10);
    uart1_write_text("write eeprom address");rc();
  I2C1_Wr(0x00);
     delay_ms(10);
     uart1_write_text("Start I2C communication");rc();
  I2C1_Wr(0X00);
  delay_ms(10);
  uart1_write_text("write low address");rc();
  I2C1_Repeated_Start();
  uart1_write_text("write high address");rc();
  I2C1_Wr(0xA1);
  delay_ms(10);
  uart1_write_text("read eeprom address");rc();
  i=I2C1_Rd(0);
  uart1_write_text("read stored data");rc();
  I2C1_Stop();
  uart1_write_text("Stop I2C communication");rc();
  bytetostr(i,txt);
  uart1_write_text(txt);rc();
}

I hope that was clear, don't stop sharing!!



Aucun commentaire:

Enregistrer un commentaire