Estoy tratando de leer/escribir EEPROM byte por byte, pero si no pongo un retraso suficiente (~ 1 ms) entre las tareas de lectura/escritura, obtengo o escribo un valor incorrecto en la EEPROM. Pero este retraso está tomando un tiempo significativo cuando hay muchos bytes para leer/escribir y 400 kHz pierden su significado. Me estoy perdiendo de algo ? o su naturaleza de proceso byte por byte es lenta. Gracias por tu tiempo y ayuda.
MCU = STM32F072C8Tx
EEPROM = 24LC64
Configuración I2C:
Speed = 400 kHz
Rise Time = 300 ns
Fall Time = 300 ns
Analog Filter = Disable
Digital Filter Coefficent = 0
Ejemplo básico de código L/E:
HAL_I2C_Mem_Write(&hi2c1, device_addr, mem_addr, I2C_MEMADD_SIZE_16BIT, data, 1, 500);
Hal_Delay(1);
HAL_I2C_Mem_Read(&hi2c1, device_addr, mem_addr, I2C_MEMADD_SIZE_16BIT, databuffr, 1, 500);
Sí, te estás perdiendo el tiempo que lleva escribir cualquier cosa, incluso si el bus es de 400 kHz.
La primera página de 24LC64 dice que la escritura de una página es de 5 ms como máximo. Puede escribir un byte o hasta 32 bytes (una página completa) a la vez, pero aún puede tardar hasta 5 ms.
Entonces, después de una operación de escritura, la EEPROM estará ocupada escribiendo los datos y no responderá a ninguna operación hasta que finalice con la escritura.
Los EEProm requieren una cantidad mínima de tiempo para escribir una página o un solo byte en la memoria. La mayoría del código de producción sondeará el dispositivo (bit WB) para ver cuándo ha terminado esta escritura. En su caso, el 1ms probablemente permita que termine este tiempo.
Va a ser más eficiente escribir por páginas que por bytes, solo tienes que esperar una vez, en lugar de por cada byte. Vigile que no envuelva las páginas. El tamaño de la página será una potencia de 2, consulte la hoja de datos para conocer el tamaño exacto.
Tirdad Sadri Nejad