Fuente de reloj mínima para el controlador I2C

1

Tengo curiosidad por saber qué figura en la hoja de datos de MCU (microcontrolador) revelaría la fuente de reloj mínima que podría usar para alimentar el controlador I2C para que pueda generar su línea de datos y CLK.

Buscando una respuesta para esta pregunta, me he topado con este párrafo aquí ,

  

Pregunta: Tengo un oscilador de 32.768kHz. Idealmente, me gustaría que la frecuencia de reloj del bus I2C se ejecute a 400 kHz o 100 kHz. Pero incluso con un valor de SSPADD = 0, el (reloj del modo maestro I2C) Fscl es de solo 8 kHz

     

Respuesta: El reloj I2C se genera al dividir el reloj   frecuencia / 4, por lo que no hay manera de que pueda ser más rápido que un cuarto de   su frecuencia de reloj.

Si se asume que es verdad, me gustaría saber la analogía detrás de esto.

En este caso, estoy usando Atmel SAMD21, sin embargo, honestamente no me importa si usa un MCU diferente como ejemplo.

En SAMD21, la velocidad estándar se ejecuta en una velocidad en baudios de 100 KHz y esta es la velocidad en baudios que me interesa conocer, a menos que desee ampliar su respuesta para obtener velocidades más rápidas.

SAMD21 utiliza los siguientes cálculos para eliminar una fuente de reloj incorrecta en su controlador I2C,

tmp_baud = (int32_t)(div_ceil(
        fgclk - fscl * (10 + (fgclk * 0.000000001)* trise), 2 * fscl));

/* For High speed mode, set the SCL ratio of high:low to 1:2. */
if (config->transfer_speed == I2C_MASTER_SPEED_HIGH_SPEED) {
    tmp_baudlow_hs = (int32_t)((fgclk * 2.0) / (3.0 * fscl_hs) - 1);
    if (tmp_baudlow_hs) {
        tmp_baud_hs = (int32_t)(fgclk / fscl_hs) - 2 - tmp_baudlow_hs;
    } else {
        tmp_baud_hs = (int32_t)(div_ceil(fgclk, 2 * fscl_hs)) - 1;
    }
}

/* Check that baudrate is supported at current speed. */
if (tmp_baud > 255 || tmp_baud < 0 || tmp_baud_hs > 255 || tmp_baud_hs < 0) {
    /* Baud rate not supported. */
    tmp_status_code = STATUS_ERR_BAUDRATE_UNAVAILABLE;
}

siendo fgclk la fuente del reloj (por ejemplo, 8MHz) y fscl la velocidad en baudios de i2c Creo (por ejemplo, 100k) y trise=215 , que resulta en tmp_baud=35 y tmp_baud_hs=0 .

    
pregunta Mehrad

1 respuesta

2

I²C define una velocidad máxima (en realidad, una diferente para cada modo), pero el propósito es asegurar que las señales eléctricas puedan ser manejadas por el circuito sin degradación.

La velocidad de la transmisión en sí no es fija, pero se puede definir por la señal de reloj enviada por el maestro (opcionalmente disminuido por el esclavo a través de alargamiento del reloj ), por lo que el maestro puede elegir usar una velocidad más lenta, e incluso puede usar diferentes longitudes para diferentes bits.

La especificación I²C no define una velocidad mínima, por lo que, en teoría, podría usar cualquier fuente de reloj, o incluso cerrar los bits manualmente con un botón (con rebote).
En la práctica, SMBus (que se deriva de, pero no es idéntico a I²C) define un tiempo de espera de 35 ms para una señal de reloj baja, y algunas implementaciones de I²C pueden tener un tiempo de espera similar para detectar fallos. dispositivos.
Entonces, para esos casos, una velocidad mínima de al menos 50 Hz (0.05 kHz) podría ser recomendable.

El código que has mostrado no pone un límite absoluto en el reloj I²C; simplemente comprueba que en realidad es posible derivar el reloj I²C elegido de la fuente de reloj elegida (con un divisor entre 1 y 256 si lo estoy leyendo correctamente). Por lo tanto, puede utilizar cualquier velocidad, siempre que tenga una fuente de reloj que coincida.

    
respondido por el CL.

Lea otras preguntas en las etiquetas