Se necesita retardo I2C y c18

1

Estoy utilizando I2C y anteriormente he publicado dudas sobre I2C aquí. Estoy usando controladores PIC y usando su compilador C18. Utilicé sus bibliotecas para construir una función para escribir datos en EEPROM a través de I2C, y cuando verifiqué las líneas SCL fluctuaban.

He creado una función para escribir en EEPROM, pero he perdido los retrasos porque la hoja de datos dice "se requiere un retraso mínimo de 5 ms para cada operación de escritura en I2C".

Confío en que está causando los problemas. El problema es que SCL no permanece a 100 kHz y fluctúa entre 54 kHz y 100 kHz, pero nunca más allá de eso. ¿Se debe a que el byte de control, la dirección y los datos se envían a lo largo de la función?

float ee_write_float(unsigned char ee_addr, float f)
{
     void i2c_init(); //initialize I2c
     unsigned char *p = (unsigned char *)&f;
     unsigned char  i;

   for (i = sizeof f; i != 0; --i)
   {
      EEByteWrite(EE_I2C_ADDR, ee_addr++, *p++);
   }

} 

¿Qué tan importante es el dela para las operaciones de escritura I2C?

¿Podría ser la causa del problema?

¿Debo poner un retraso después de la función EEByteWrite para compensar?

Observado: el SCL se vuelve algo estable después de que la velocidad de transmisión se reduce a 20 kHz luego fluctúa entre 17kHz y 19kHz. Me encantaría que descubriera alguna causa razonable para solucionar este problema ... o cualquier sugerencia valiosa será bienvenida de todo corazón.

    
pregunta Rookie91

1 respuesta

4

En I2C, el reloj solo alterna según sea necesario para transmitir o recibir datos. No hay necesidad de una señal de reloj continua, por lo que debe esperarse una variación en la frecuencia observada La especificación de 100 kHz es la velocidad de reloj máxima en lugar de la velocidad de reloj promedio o continua.

Las memorias no volátiles como Flash y EEPROM necesitan un período de tiempo relativamente largo para escribir datos en la memoria, y 5 ms suena bien. Usted no debe intentar ejecutar varias operaciones de escritura sin permitir este retraso entre ellas. Debido a esto, posiblemente no pueda ejecutar más de 200 operaciones de escritura por segundo y aún así permitir 5 ms por operación.

Una vez que tenga todo funcionando correctamente, debe esperar ver una ráfaga de pulsos de reloj de 100 kHz cada 5 ms aproximadamente.

    
respondido por el Joe Hass

Lea otras preguntas en las etiquetas