Cercando su Google ho trovato questo post ed altri sul forum di arduino riguardanti gli EEPROM della Dallas (oggi Maxim), ma niente che si avvicinasse al caso mio.
Necessito di immagazzinare dei dati in alcuni iButton DS1971, ma non so come scrivere nella EEPROM dei dispositivi.
Modificando un esempio della libreria OneWire sono riuscito a leggere il contenuto degli iButton (Collegando la parte esterna del contenitore di acciaio sul GND e il centro al pin 2 e a 5V con una PULLUP da 4.2k):
#include <OneWire.h>
OneWire ds(2); // OneWire bus on digital pin 2
void setup() {
Serial.begin (115200);
}
void loop() {
byte i; // This is for the for loops
boolean present; // device present var
byte data[32]; // container for the data from device
present = ds.reset(); // OneWire bus reset, always needed to start operation on the bus, returns a 1/TRUE if there's a device present.
ds.skip(); // Skip ROM search
if (present == TRUE){ // We only try to read the data if there's a device present
//Serial.println("DS1971 device present");
ds.write(0xF0,1); // Read data command, leave ghost power on
ds.write(0x00,1); // LSB starting address, leave ghost power on
ds.write(0x00,1); // MSB starting address, leave ghost power on
Serial.print("Data: "); // For the printout of the data
for ( i = 0; i < 32; i++) { // Now it's time to read the EEPROM data itself, each page is 32 bytes so we need 32 read commands
data[i] = ds.read(); // we store each read byte to a different position in the data array
Serial.print(data[i], HEX); // printout in ASCII
Serial.print(" "); // blank space
}
Serial.println();
delay(1000); // Delay so we don't saturate the serial output
}
else { // Nothing is connected in the bus
//Serial.println("Non connesso");
delay(1000);
}
}
Non ho trovato niente che possa aiutarmi nella scrittura di questi 32 bytes, qualche idea?
Grazie nid69ita,
da quello che ho letto nel documento che hai allegato credo siano utili questi due paragrafi:
3.3.1 WRITE SCRATCHPAD [0Fh]
After issuing the Write Scratchpad command, the master must first provide a 1-byte address, followed by the data to be written to the scratchpad for the data memory. The DS1971A will automatically increment the address after every byte it received. After having received a data byte for address 1Fh, the address counter will wrap around to 00h for the next byte and writing continues until the master sends a Reset Pulse.
3.3.3 COPY SCRATCHPAD [55h]
After the data stored in the scratchpad has been verified the master may send the Copy Scratchpad
command followed by a validation key of A5h to transfer data from the scratchpad to the EEPROM
memory. This command will always copy the data of the entire scratchpad. Therefore, if one desires to
change only a few bytes of the EEPROM data, the scratchpad should contain a copy of the latest
EEPROM data before the Write Scratchpad and Copy Scratchpad commands are issued. After this
command is issued, the data line must be held at logic high level for at least 10ms.
Quindi il procedimento dovrà essere quello di scrivere i dati nello SCRATCHPAD e poi copiarli nella EEPROM.
#include <OneWire.h>
OneWire ds(2); // OneWire bus on digital pin 6
void setup() {
Serial.begin (115200);
}
void loop() {
byte i; // This is for the for loops
boolean present; // device present var
byte data[32]; // container for the data from device
present = ds.reset(); // OneWire bus reset, always needed to start operation on the bus, returns a 1/TRUE if there's a device present.
ds.skip(); // Skip ROM search
if (present == TRUE){ // We only try to read the data if there's a device present
Serial.println("DS1971 device present");
ds.write(0x0F,1); //comando scrittura scratchpad
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x0A);
ds.write(0x55,1); //comando copia nella EEPROM
delay(1000);
}
else { // Nothing is connected in the bus
//Serial.println("Non connesso");
delay(1000);
}
}
Grazie, avevo già visto quell' articolo e fa circa la stessa cosa del mio primo sketch per la lettura.
Proverò con la libreria che mi hai dato, però strano che la OneWire non abbia neanche un consiglio sulla scrittura (ci sono solo 3000 esempi su come leggere un termometro...)