¡Hola!
He estado trabajando en un proyecto que necesita escribir en una EEPROM externa y luego continuar haciendo "cosas" muy rápidamente. El problema para mí no era el tiempo entre escritura y escritura (generalmente 5 ms). Ya que mi programa escribe cada 20 ms.
Mi problema era esperar 5 ms después de que los datos I2C se enviaran a la EEPROM.
El punto clave es que una vez que envía los datos, la EEPROM "se escribe sola", puedes quedarte ahí o puede estar haciendo otras cosas ... yo prefiero hacer otras cosas en lugar de esperar

Con esto en mente, mejoré las bibliotecas para 256K y 1024K (las que más uso). También implemente la lectura y escritura por página, y agregue una función para mostrar por puerto serie lo que hay dentro de la EEPROM.
Qué hice para mejorar la velocidad? En lugar de esperar DESPUÉS de escribir, mi biblioteca espera ANTES de escribir ... Espera, COMO!!!?
Por lo general, las bibliotecas EEPROM escriben y luego "preguntan" constantemente a la EEPROM si ha acabado. Hasta que la EEPROM no responde que SI, el programa se queda esperando.
Pero mi libreria solo escribe, y luego sale, sin preguntar.
Para eso las funciones de lectura y escritura comprueban si la EEPROM está lista ANTES de enviar un nuevo comando de lectura / escritura. Si la EEPROM todavía está escribiendo por una operación anterior, espera hasta que termine y luego continúa.
De esta manera, el tiempo para una sola operación de escritura es muy rápido:
Entrar en la función -> Verificar si la EEPROM está ocupada -> Escribir -> Salir
No hay que esperar!
Esto nos ahorra 3-5ms de espera.
Para escrituras consecutivas si se deberá esperar a que finalice la operación anterior.
Investigué un poco, y esta técnica no se comenta en ninguna parte. Aunque Microchip tiene una "application note" sobre cómo usar la EEPROM y cómo mejorar las velocidades:
http://ww1.microchip.com/downloads/en/Appnotes/01028B.pdfPara ser honesto, como nadie ha usado este enfoque, y además Microchip no habla de esto en ningún lado, pensé que no funcionaría. Pero después de muchas pruebas, parece funcionar de manera consistente, y lo estoy usando en un producto en producción.
Estas son algunas pruebas realizadas a una velocidad de bus de 400Khz con hardware PIC I2C y oscilador interno de 32Mhz, utilizando una memoria 24AA1025:
- Start -
- 16 BYTES OLD WRITE -
Byte 0: 4205 uS
Byte 1: 4206 uS
Byte 2: 4206 uS
Byte 3: 4205 uS
Byte 4: 4205 uS
Byte 5: 4206 uS
Byte 6: 4206 uS
Byte 7: 4205 uS
Byte 8: 4205 uS
Byte 9: 4206 uS
Byte 10: 4206 uS
Byte 11: 4205 uS
Byte 12: 4205 uS
Byte 13: 4206 uS
Byte 14: 4206 uS
Byte 15: 4204 uS
TOTAL: 0 Sec 68 mS 478 uS
- 16 BYTES NEW WRITE -
Byte 0: 190 uS
Byte 1: 4022 uS
Byte 2: 4022 uS
Byte 3: 4022 uS
Byte 4: 4022 uS
Byte 5: 4021 uS
Byte 6: 4021 uS
Byte 7: 4022 uS
Byte 8: 4022 uS
Byte 9: 4022 uS
Byte 10: 4022 uS
Byte 11: 4022 uS
Byte 12: 4022 uS
Byte 13: 4021 uS
Byte 14: 4021 uS
Byte 15: 4022 uS
TOTAL: 0 Sec 61 mS 707 uS
- 16 PAGES WRITE (128 bytes/page) -
Page 0: 4119 uS
Page 1: 7951 uS
Page 2: 7951 uS
Page 3: 7951 uS
Page 4: 7951 uS
Page 5: 7951 uS
Page 6: 7951 uS
Page 7: 7951 uS
Page 8: 7958 uS
Page 9: 7953 uS
Page 10: 7953 uS
Page 11: 7952 uS
Page 12: 7953 uS
Page 13: 7953 uS
Page 14: 7953 uS
Page 15: 7952 uS
TOTAL: 0 Sec 124 mS 616 uS
- FULL EEPROM WRITE -
TOTAL: 4 Sec 149 mS 403 uS
Para la escritura "tradicional", una sola escritura emplea 4205 uS por cada byte escrito.
Mientras que con este nuevo procedimiento, el primer byte solo emplea 190 us! Y los siguientes 4022 us.
Esto significa que si se escribe un byte cada 4-5 ms o más, entonces
el uC gastará solo 190 us en realizar la escritura.
IMPORTANTE: esta librería no mejorará el tiempo que tarda la memoria en realizar la escritura, pero liberará al uC para hacer otras cosas mientras ocurre la escritura.Pueden encontrar mi librería y también el programa de ejemplo de la medición del tiempo en github:
https://github.com/ideaalab/eeprom_libraryEscritas en CCS, y con ejemplo en MPLAB.
También tengo algunas otras librerías, no son perfectas, pero funcionan para mí

Espero que sea útil!