Ola. Estou a 3 dias tentando escrever e ler em uma eeprom 24LCxx usando protocolo I2C com a biblioteca Wire.h do Arduino ultima atualizacao.

Meu Amigo Ewerton me enviou o seguinte codigo:

Circuito eletrico da EEPROM

A0    |  GND          VCC  |  VCC 5V  
 A1    |  GND          WP    |  GND
 A2    |  GND          SCL   | PIN Analogico 5 do arduino
 VSS |  GND          SDA   | PIN Analogico 4 do arduino

============================ inicio sketch =============================

#include <Wire.h>

#define disk1 0x50 //Endereço do 24LC256 eeprom , com o A0,A1 e A2 no GND

void setup(void)
{
Serial.begin(9600);
Wire.begin();

unsigned int address = 0;

writeEEPROM(disk1, address, 123); // primeiro escreve 123 com a função writeEEPROM
Serial.print(readEEPROM(disk1, address), DEC); // depois mostra na serial
}

void loop(){}

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data )
{
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write(data);
Wire.endTransmission();

delay(5);
}

byte readEEPROM(int deviceaddress, unsigned int eeaddress )
{
byte rdata = 0xFF;

Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();

Wire.requestFrom(deviceaddress,1);

if (Wire.available()) rdata = Wire.read();

return rdata;
}

============================ fim sketch =============================

Claro que nas funcoes wire.send e wire.received, tive que renomear para wire.write e wire.read, para que o programa compilasse.

Analisando o codigo e ligacao fisica, tudo está em sintonia. Ocorre que o ao esecutar o programa, na serial escreve o valor DEC 255, como se estivesse lendo esse valor da eeprom. Mesmo com a eeprom desconectada da placa, ao invez de retornar erro, ou um valor invalido, nulo, ou sei lá. retorna sempre 255.

Estou desconfiado que há algum erro de escrita no codigo devido a biblioteca wire.h ter passado por uma atualizacao recente.

Alguém tem alguma dica?????

Exibições: 2342

Responder esta

Respostas a este tópico

nao rodou tbm =/

Obrigado pela colaboração. O codigo acima esta funcionando. Era só minha memoria queimada.

Abraco

aparentemente , Wire.write(data) esta enviando o valor como string(chararray acho que é o nome tecnico correto).

converta a variavel data forçadamente pra int (se é assim que o seu dispositivo que o comando esta preparado pra receber).

Eu trabalhei com i2c recentemente e todo o problema que tive foi com tipos de variaveis... um exemplo de trecho do meu código:
Wire.beginTransmission(4); // transmitir pro slave #4
             Wire.write("wtc=");
             
             char thecommand[wtc.length() + 1];
             wtc.toCharArray(thecommand, sizeof(thecommand));
             
             Wire.write(thecommand);// envia o comando
             Wire.write(" ");
             Wire.endTransmission();    // fim de transmissao

note que meu dispositivo que recebe o comando escrito esta esperando o tipo chararray, entao tive que converter a minha variavel thecommand antes de coloca-la no wire.write.

vou ver isso ;)

Obrigado pela colaboração. O codigo que citei acima esta funcionando. Era só minha memoria queimada.

Abraco

Por favor, sabe se é simples conseguir no Brasil esta memória ou outra memória i2c? Encontro em São Paulo?

Você acha com facilidade memória do tipo 24Cxx aqui no Brasil e não são caras. Por exemplo, no soldafria.com.br uma 24C256 custa menos de R$3. No site da Mult Comercial (que tem uma loja física na Sta Efigência) uma 24LC256 custa a mesma coisa. (A principal diferença entre a 24Cxx e 24LCxx parece ser que a LC funciona em uma faixa mais larga de tensão).

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço