EEprom esterna 24LC04B

Ciao ,

Spero di non annoiare con un argomento vecchio , ma ho provato a collegare la mia arduino UNO R2 ad una eeprom 20LC04B con e senza pull-ups ma una voltra scritto un byte campione ritorna sempre 255.

  • libreria wire IDE V.165
  • I2C scan riporta otto indirizzi disponibili 0x50-0x57
  • Wp è collegato a massa
  • Ho provato con e senza pull-ups (3K6, non trovo i 4K7 :frowning: )su scl e sda ( mi sembra di aver capito che wire disabilita i pullups?)
  • A1-A2-A3 collegati a massa
  • SCL = pin A5 e SDA = pin A4
  • Alimentazione 2.5V-5.5 , utilizzo i 5V di Arduino
  • Sostituita eeprom con una nuova
  • Ultimo ma non ci credo , nel dubbio ho messo un delay sotto setup. Non conosco bene qui il codice di start-up o eventuali problemi di tempi di salita della tensione di alimentazione

ci sono altre possibilità ?

ciao
grazie

#include <Wire.h>
#define disk1 0x50   
 
void setup(void)
{
  Serial.begin(9600);
  
  
  delay(3000);
  
  Wire.begin();  
 
  unsigned int address = 0;
 
  writeEEPROM(disk1, address, 5);
  Serial.print(readEEPROM(disk1, address), DEC);
}
 
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;
}

ci sono altre possibilità ?

si, farci vedere lo sketch che usi per scriverci

Non ho capito , se ti riferisci al sorgente è nel posto che ho scritto ( aggiornato in un secondo momento)

Hai il datasheet della EEprom?

Ciao :) [/quote]

PaoloP: Hai il datasheet della EEprom?

Si ho controllato tempo di scrittura (5ms) e frequenza ( 400Khz), tensione di alimentazione,piedinatura Ho poi aggiornato il twi.h in questo modo non avendo definito TWI_FREQ

#ifndef TWI_FREQ
  #define TWI_FREQ 400000L
  #endif

Ho verificato la data di compilazione della libreria compilata [TWI.o] è corrisponde all'ultima compilazione quindi viene ricompilata sul momento :confused:

Ritornato a 100Khz , disabilitato i pull-up ,messo le resistenze, cambiato arduino... legge sempre 255 Se scollego i file del bus legge sempre 255 come se non ci fosse il chip

verificato il control address : 1010xxB0 (0x50 o 0x51)

WP collegato a massa. A1,A2,A3 a massa o floating

Alimentazione 4.8V

qui il datasheet http://ww1.microchip.com/downloads/en/DeviceDoc/21708K.pdf

Se non sbaglio, FF è il valore nelle celle nuove. Prova a cambiare valore dell'errore. Vediamo se non scrive o non legge.

Usa l'I2C scanner per controllare i collegamenti. --> http://playground.arduino.cc/Main/I2cScanner?action=sourceblock&num=1

Scusa se rispondo solo ora ma sono stato male oggi. :o

I2C Scanner
Scanning...
I2C device found at address 0x50  !
I2C device found at address 0x51  !
I2C device found at address 0x52  !
I2C device found at address 0x53  !
I2C device found at address 0x54  !
I2C device found at address 0x55  !
I2C device found at address 0x56  !
I2C device found at address 0x57  !
done

Ho provato con 170 anzichè 255 e ritorna sempre 170. L'I2Cscanner trova qualcosa e risponde il contrario quando scollegato un filo

A prescindere dallìI2Cscanner, ho controllato :

Direttamente sul pin 4-8 -> 4.8v Comunicazione impostata a 100Khz ( pull-up esterno 10K come da datasheet) Verificati tutti i collegamenti dall'atmega328 ( pin 27 e 28 ) fino all'eeprom ( 5 e 6 ) compreso pin WP

Cercherò una terza eeprom..

è dura.. :confused:

L'I2C scanner rileva correttamente la EEPROM, è normale che vengono visti tutti gli 8 address occupabili dalla 24C04. La EEPROM è organizzata in due pagine di 256 byte e dando un'occhiata veloce al codice direi che stai sbagliando il modo di indirizzamento.

The Microchip Technology Inc. 24AA04/24LC04B
(24XX04*) is a 4 Kbit Electrically Erasable PROM. The
device is organized as two blocks of 256 x 8-bit
memory

In effetti…
L’esempio di codice che ho utilizzato fa riferimento ad un eeprom da 256k quindi 32768 byte che devono essere inviati come indirizzo shiftati quindi divisi in 2… La mia eeprom e 4k . 512 byte ma in 2 blocchi.
Infatti nel [control byte ] è possibile settare B0
Il codice va quindi modificato sia per lettura che scrittura

Wire.beginTransmission(deviceaddress);

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

   Wire.write(eeaddress);   
   Wire.write(data);
   Wire.endTransmission();

Grazie mille , ora funziona