Electrotécnica
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
CBOX-Shout
julho 2024
SegTerQuaQuiSexSábDom
1234567
891011121314
15161718192021
22232425262728
293031    

Calendário Calendário

Procurar
 
 

Resultados por:
 


Rechercher Pesquisa avançada

Quem está conectado?
3 usuários online :: 0 registrados, 0 invisíveis e 3 visitantes

Nenhum

O recorde de usuários online foi de 34 em Dom Ago 13, 2023 1:30 pm
Estatísticas
Temos 318 usuários registrados
O último membro registrado é Buggsoulmitor

Os nossos membros postaram um total de 1475 mensagens em 209 assuntos

Arduino + 24LC1025

Ir para baixo

Arduino + 24LC1025 Empty Arduino + 24LC1025

Mensagem  HFernandes Ter Nov 15, 2011 10:57 pm

Este é um exemplo de um chip de EEPROM que testei com 1Mb e interface I2C da Microchip

Código:
/* Simple read & write to a 24LC256 256K EEPROM using the Wire library.
 * Addresses are ints - 0000-7FFF (32767) Data is bytes (8 bits x 32767 = 256K)
 * Functions for R/W of single byte or a page of bytes. Max page is 28 bytes.
 * SETUP:          _ _                               
 * Arduino GND- A0-|oU |-Vcc  to Arduino Vcc
 * Arduino GND- A1-|  |-WP  to GND for now. Set to Vcc for write protection.
 * Arduino GND- A2-|  |-SCL  to Arduino 5
 * Arduino GND-Vss-|  |-SDA  to Arduino 4
 *                  ---      (A2, A1, A0 to GND for 1010000 (0x50) address.)
 *                            If set to Vcc adds to address (1010,A2,A1,A0)
 */

#include <Wire.h>
#define EEPROM_ADDR 0x51          // I2C Buss address of 24LC256 256K EEPROM


void setup(){
  Wire.begin();                    // join I2C bus (address optional for master)
  Serial.begin(9600);
  Serial.println("\n----------------\n");

// TESTS FOR EACH FUNCTION BEGIN HERE
  Serial.println("Writing Test:");
  for (int i=0; i<32; i++){            // loop for first 20 slots
    i2c_eeprom_write_byte(EEPROM_ADDR,i,77-i);  // write address + 65 A or 97 a
    Serial.print(". ");
    delay(5);                        // NEED THIS DELAY! (tests suggest it can be as
                                      // small as delay(3) -- BBR
  }

  Serial.println("");
  delay(500);
  Serial.println("Reading Test:");
  for (int i=0; i<32; i++){            // loop for first 20 slots
    Serial.print(i2c_eeprom_read_byte(EEPROM_ADDR, i),BYTE);
    Serial.print(" ");
  }


  // setup for page tests . . .
  byte PageData[30];                  // array that will hold test data for a page
  byte PageRead[30];                  // array that will hold result of data for a page
  for (int i=0; i<30; i++){            // zero both arrays for next test
    PageData[i] = 0;   
    PageRead[i] = 0;
  }
  Serial.println("");
  for (int i=0; i<30; i++) PageData[i] = i+33;  // fill up array for next test char 33 = !

  Serial.println("Writing Page Test:");
  Serial.println(millis());
  i2c_eeprom_write_page(EEPROM_ADDR, 100, PageData, 28 ); // 28 bytes/page is max
  Serial.println(millis());

  Serial.println("Reading Page Test:");
  i2c_eeprom_read_buffer( EEPROM_ADDR, 100, PageRead, 28);
  for (int i=0; i<28; i++){
    Serial.print(PageRead[i],BYTE);    // display the array read
    Serial.print(" ");
  }
 
}

void loop(){
}

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
  int rdata = data;
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8));    // Address High Byte
  Wire.send((int)(eeaddress & 0xFF));  // Address Low Byte
  Wire.send(rdata);
  Wire.endTransmission();
}

// Address is a page address, 6-bit (63). More and end will wrap around
// But data can be maximum of 28 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.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddresspage >> 8)); // Address High Byte
  Wire.send((int)(eeaddresspage & 0xFF)); // Address Low Byte
  byte c;
  for ( c = 0; c < length; c++)
    Wire.send(data[c]);
  Wire.endTransmission();
  delay(10);                          // need some delay
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
  byte rdata = 0xFF;
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8));    // Address High Byte
  Wire.send((int)(eeaddress & 0xFF));  // Address Low Byte
  Wire.endTransmission();
  Wire.requestFrom(deviceaddress,1);
  if (Wire.available()) rdata = Wire.receive();
  return rdata;
}

// should not read more than 28 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8));    // Address High Byte
  Wire.send((int)(eeaddress & 0xFF));  // Address Low Byte
  Wire.endTransmission();
  Wire.requestFrom(deviceaddress,length);
  //int c = 0;
  for ( int c = 0; c < length; c++ )
    if (Wire.available()) buffer[c] = Wire.receive();
}

 


Datasheet
HFernandes
HFernandes
Moderador
Moderador

Mensagens : 306
Data de inscrição : 28/09/2011
Idade : 33
Localização : Coimbra/Mealhada

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos