velocidad en baudios de I2C y retardo calc (bang bit)

0

El microcontrolador que estoy usando no es compatible con hardware I2C. Por lo tanto, estoy tratando de implementar I2C en el módulo usando puertos GPIO. El microcontrolador se comunica con EEPROM, y la EEPROM tiene pines SDA y SCL. El chip EEPROM tiene una velocidad en baudios de 400Kbps como máximo (según su hoja de datos). Soy consciente de los protocolos I2C y sé cómo implementarlos (Iniciar, escribir, leer, detener), pero no puedo determinar la velocidad en baudios a la que el controlador necesita comunicarse con la EEPROM. Dado que el controlador no es compatible con el hardware I2C, ¿cómo y dónde puedo configurar la velocidad en baudios (fórmula sin generador de baudios)? También me resulta difícil calcular el tiempo de retardo de I2C, cuando configuro el pin de alto a bajo o de bajo a alto (puede llevar algún tiempo cuando los pines se hacen de alto a bajo o viceversa). ¿Podría alguien explicar, en general, cuál es la forma correcta de eliminar la velocidad de I2c y la demora? El chip EEPROM tiene una velocidad de transmisión máxima de hasta 400 Kbps. El control se ejecuta a una velocidad de reloj máxima de 40MHz.

Su ayuda es muy apreciada

Gracias

    
pregunta Akshara Prasad

2 respuestas

1

En realidad, hacer IIC en el firmware es muy fácil.

Para garantizar que no exceda la velocidad máxima en baudios del dispositivo esclavo, inserte un retraso mínimo entre cada borde. La velocidad máxima es de 400 kBit / s, lo que significa que el tiempo mínimo por bit es de 2.5 µs. Cada bit tiene al menos dos bordes, por lo que significa que está seguro si espera al menos 1,25 µs entre dos cosas que las rutinas de IIC hacen al bus. Dependiendo de la velocidad y la arquitectura de su procesador, eso podría ser simplemente insertar algunos NOP en los lugares correctos. Si el procesador está funcionando a 10 MIPS, por ejemplo, solo necesita 13 ciclos de instrucción entre dos cambios de estado de bus. Es posible que tenga que hacer otras cosas suficientes para que solo se necesite una pequeña cantidad de NOP.

Para retrasos breves como este, uso una macro que toma argumentos del tiempo total que quiero esperar, y el número de ciclos de instrucción ya incluidos en esa espera. Esta macro obtiene el tiempo de ciclo de instrucción de las constantes de tiempo de compilación y calcula el número de NOP en tiempo de compilación. Si el código se transfiere a un procesador diferente o se cambia el reloj, todo sigue funcionando.

Aquí está esta macro para las partes de 16 bits de Microchip:

////////////////////
//
//   Macro BUSYWAIT time [, cycles]
//
//   Causes a busy-wait for time TIME minus CYCLES instruction cycles.  TIME is
//   in units of seconds.  Explicit code will be written that wastes the
//   indicated time, so this macro should only be used for very short waits.
//
//   The total wait time is rounded to the nearest whole instruction cycles.
//
/macro busywait
  /if [exist -1 arg] then
    /show "Dumb place for a label, moron.  The " [qstr [ucase [arg -1] " macro does"
    /show "not support a label."
         .error  "Label"
    /stop
    /endif
  /var local time real = [arg 1] ;time to wait in seconds
  /var local mincy integer = 0
  /if [exist 2 arg] then
    /set mincy [arg 2]
    /endif
  /var local cy integer      ;final number of instructions to wait

  /set cy [rnd [* time freq_inst]] ;instructions to wait due to TIME
  /set cy [- cy mincy]       ;minus CYCLES
         waitcy  [v cy]      ;write the instructions to do the wait
  /endmac

Esto utiliza en gran medida mi preprocesador de ensamblador PIC (comandos que comienzan con "/" y funciones en línea [...]), pero debería poder deducir lo que está pasando. Las instrucciones de pérdida de tiempo son realmente emitidas por la macro WAITCY (segunda línea desde el final). Esto conoce algunas instrucciones que ocupan el mismo espacio que un NOP pero desperdician dos ciclos.

    
respondido por el Olin Lathrop
0

La velocidad de datos de 400kbps es equivalente a la frecuencia de reloj de 400kHz. Esto significa que un ciclo de reloj es 1 / 400kHz = 2.5µs de largo; tendrá que alternar su reloj al doble de la frecuencia, por lo tanto a intervalos de 1.25µs. Estos son números máximos y puede ejecutar el bus más lentamente, por ejemplo, alternando el reloj cada 5µs (ese es su tiempo de demora).

Dado que su microcontrolador funciona a 40kHz (un valor atípicamente lento), no tendrá que preocuparse por exceder la frecuencia máxima.

Puede haber una demora entre el código que establece un valor de pin, y este valor realmente se presenta en el pin. Sin embargo, esta latencia estará presente para todos los cambios de pin y, por lo tanto, no influirá en la velocidad de reloj que está generando. Si su microcontrolador funciona lo suficientemente rápido y la mayor parte del tiempo se invierte en delay() esperando, no debe preocuparse en absoluto por estas instrucciones y las latencias de cambio de pin.

    
respondido por el corecode

Lea otras preguntas en las etiquetas