ATTiny25 / 45/85 como maestro I2C Y esclavo

2

Todavía estoy tratando de envolver mi cabeza alrededor de I2C, así como el ATTiny. He encontrado muchos tutoriales sobre cómo usar el diminuto como esclavo I2C y maestro, pero ¿es posible usarlo al mismo tiempo?

Básicamente, quiero crear un dispositivo similar al LED inteligente BlinkM pero que también tenía una EEPROM conectada para un almacenamiento adicional. Tal vez haya otra forma de conectar la EEPROM, pero no creí que tuviera suficientes pines (solo hablando de la variedad ATTiny de 8 pines) ...

¿Alguna idea de cómo hacer esto?

Aclaración: tenga en cuenta que SOLO ATTiny necesita acceder a la EEPROM externa o debe acceder a ella. Definitivamente quiero que esté en un autobús separado. Entonces me doy cuenta de que necesitaré dos pines para ATMega - > ATTiny y 2 más para ATTiny a EEPROM (esperemos dejándome 2). Mi principal preocupación aquí es si solo se pueden usar 2 pines en ATTiny para i2c o si puede configurar CUALQUIER 2 pines para eso.

    
pregunta Adam Haile

4 respuestas

4

Toby dice que necesitarás dos autobuses I2C, pero eso no es necesariamente así. En esta respuesta señalo la información en la hoja de datos de LPC930 sobre cómo cambiar entre los dos modos en el mismo bus.

Supongo que por "al mismo tiempo" quieres decir en una misma aplicación, y eso no es tan difícil. Si desea escribir o leer en el bus como maestro, espere hasta que el bus esté libre, cambie al modo maestro y comience a marcar. Después de enviar / recibir el mensaje, vuelva al modo esclavo y escuche los mensajes de otros maestros.

Las colisiones eléctricamente no son un problema, ya que el bus es un OR cableado. En cuanto al protocolo, es posible que tenga un problema cuando dos maestros reclamarían el bus simultáneamente, pero luego el mensaje estará tan desordenado que no recibirá un acuse de recibo, por lo que sabe que tiene que enviarlo nuevamente. La mayoría de los protocolos se reintentarán después de un tiempo aleatorio, que debería ser diferente para cada maestro, para que las colisiones no se repitan.

Alternativamente, puedes hacer un protocolo de paso de token , donde el controlador que tiene el token es el maestro, y después de hacer su trabajo, puede pasar el token al otro maestro. Luego cambia al modo esclavo, y espera hasta que recibe el token de vuelta. Solo así podrá volver a cambiar al modo maestro.

    
respondido por el stevenvh
1

Esto debería ser posible. La configuración que desea se llama "multi-master"

enlace

La mayoría de las veces, tu dispositivo puede ser un esclavo, pero cuando quieres que hable con la EEPROM, puedes programarlo para que sea maestro. Siempre y cuando sigas las reglas de arbitraje de autobuses, esto debería estar bien. Un fragmento del enlace anterior sobre lo que ambos deben hacer sus maestros de I2C:

  

a) Ser capaz de seguir la lógica de arbitraje. Si dos dispositivos comienzan a   comunique al mismo tiempo el que escribe más ceros al bus (o   el dispositivo más lento) gana el arbitraje y el otro dispositivo   Interrumpe inmediatamente cualquier operación en el autobús.

     

b) Detección de bus ocupado. Cada dispositivo debe detectar un bus en curso   Comunicación y no debe interrumpirlo. Esto se logra por   reconocer el tráfico y esperar a que aparezca una condición de parada antes   Empezando a hablar en el autobús.

     

Si planea usar un dispositivo multimaster en un bus, es esencial que   Todos los maestros son multimasters. Un solo maestro es simplemente un dispositivo,   Que no entiende los mecanismos anteriores. Si un maestro de teatro y   un multimaster está conectado, el singlemaster puede interrumpir el   multimaster que causa resultados impredecibles.

Repasando la hoja de datos de ATtiny, parece que hay algo de soporte para esto. Eche un vistazo a USISR – USI Status Register en la hoja de datos y, a saber, estos dos bits:

  

• Bit 5 - USIPF: Indicador de condición de parada Cuando se selecciona el modo de dos cables,   El indicador USIPF se establece (uno) cuando se detecta una condición de parada.   La bandera se borra escribiendo un uno en este bit. Tenga en cuenta que esto es   No es una bandera de interrupción. Esta señal es útil cuando se implementa   arbitraje maestro de bus de dos hilos.

     

• Bit 4 - USIDC: Salida de datos   Colisión Este bit es lógico cuando el bit 7 en el registro de datos USI   se diferencia del valor físico del pin. La bandera solo es válida cuando   Se utiliza el modo de dos cables. Esta señal es útil cuando se implementa   Arbitraje maestro de bus de dos cables

Parece que hay suficiente soporte para hacerlo, solo tienes que manejarlo en el software, lo que desafortunadamente hará que tu software sea más complicado, pero supongo que esa es la compensación esperada aquí. Como se mencionó, debe asegurarse de que ambos sus maestros se adhieran a las reglas de arbitraje del bus, y me imagino que el otro chip que está usando tendrá un registro similar al que se encuentra en el ATtiny, pero asegúrese de que sí lo hace, de lo contrario, esto no será posible.

EDIT:

También dejé un comentario anterior sobre esto, pero aquí hay una sugerencia alternativa a todo esto:

Si no es necesario que ambos maestros utilicen la EEPROM, si solo el ATTiny necesita usarla, entonces tiene su propia EEPROM interna en el chip que puede utilizar en su lugar en tamaños de 128/256/512 bytes. ¿Es eso lo suficientemente grande?

    
respondido por el Jon L
1

Un bus I2C generalmente tiene un maestro y uno o más esclavos. El autobús se comparte entre todos los esclavos, cada uno con su propia dirección única. Cada mensaje en el bus se dirige a un dispositivo a la vez.

Para que su microcontrolador sea esclavo de un maestro externo y, al mismo tiempo, sea maestro para el eeprom, puede tener dos buses i2c. Un bus i2c tiene solo 2 cables (más una conexión a tierra común), por lo que puede tener suficientes pines.

    
respondido por el Toby Jaffey
0

I2C admite de forma nativa múltiples maestros con arbitraje. El problema con el que creo que se encontrará es que la biblioteca BlinkM (o más formalmente la biblioteca Arduino Wire) no creo que implemente el manejo de los estados de arbitraje en el vector de interrupción I2C, así que incluso si implementa los controladores I2C para hacerlo correctamente en el ATtiny, el maestro "real" de I2C no lo manejará a menos que modifique Wire o use una biblioteca alternativa de I2C que maneje el arbitraje de múltiples maestros. Además, tendrá que garantizar de alguna manera que tendrá que utilizar EEPROM I2C que tienen bits de dirección seleccionables por hardware para que no se puedan generar conflictos en el bus. Básicamente, creo que encontrará que esto es más complicado de lo que vale la pena trabajar de forma generalizada y útil.

En respuesta a la aclaración, siempre puedes "hacer bit" de I2C utilizando dos pines GPIO. Eso solo significa que implementas el comportamiento de I2C completamente en el software (en caso de que no esté claro). La velocidad no es realmente un problema cuando estás actuando como maestro (es decir, controlando la EEPROM) ya que controlas el reloj del bus que usa el esclavo. Sin embargo, debe usar los pines I2C de su hardware para la función de esclavo de su microcontrolador, ya que eso requerirá que sea lo más rápido posible en el servicio de eventos del maestro. Espero que ayude.

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas