Ciao a tutti,
Volevo cancellare nel tempo più breve possibile una EEPROM 24LC256 (32KBytes), per la comunicazione i2c ho utilizzato la libreria TinyWireM
http://playground.arduino.cc/Code/USIi2c a cui ho apportato alcune modifiche:
- Cancellato #define SYS_CLK nel file USI_TWI_Master.h che non viene utilizzato
- Cancellato #define F_CPU 1000000UL nel file USI_TWI_Master.cpp visto che ho la CPU ad 8MHz ed il define è aggiunto dall'IDE in automatico con la giusta frequenza
- Modificato #define USI_BUF_SIZE 16 nel file TinyWireM.h col valore 34 per avere un buffer in invio maggiore
La cancellazione avviene cancellando tutte le 512 pagine (di 64KBytes l'una) col seguente codice
void clearMemoryPage(unsigned int page)
{
for(int i=0; i<2; i++)
{
unsigned int addr = (page * 64) + (32 * i);
TinyWireM.beginTransmission(0x50);
TinyWireM.send((int)(addr >> 8)); // MSB
TinyWireM.send((int)(addr & 0xFF)); // LSB
for(int b=0; b<32; b++)
{
TinyWireM.send((byte)0);
}
TinyWireM.endTransmission();
delay(6);
}
}
Il problema è che effettivamente non vengono inviati tutti i byte, ho controllato con l'oscilloscopio e viene inviato solamente il pacchetto relativo all'indirizzo (quindi col comando beginTransmission) e sembra un problema di buffer in quanto nella libreria la funzione send è così scritta:
void USI_TWI::send(uint8_t data){ // buffers up data to send
if (USI_BufIdx >= USI_BUF_SIZE) return; // dont blow out the buffer
USI_BufIdx++; // inc for next byte in buffer
USI_Buf[USI_BufIdx] = data;
}
La cosa strana è che nonostante abbia lasciato 2 byte per l'indirizzo non è possibile inviare 32 byte col buffer di 64 byte.. qualcuno ha già incontrato questo problema? Inviando 16 byte per volta il problema non sussiste ma raddoppiano i tempi di cancellazione che richiedono in tutto sui 10 secondi, un pò troppo..