SPI mixto e I2C usando ATtiny USI

3

He estado usando con éxito la USI en un Attiny84 para hablar SPI a un módulo de radio. Esto es bueno para piratear sensores y otras cosas como pequeños dispositivos de radio. Mi próximo proyecto de sensor involucra un sensor con una interfaz I2C. Sé que USI también puede hablar I2C, pero ya lo estoy usando para hablar SPI a la radio.

Sé que el propio USI tiene bits de modo para cambiarlo de modo de tres a dos hilos, por lo que podría hacer que hable SPI o I2C. Pero, ¿cómo podría esto interactuar con hardware externo? Cuando está en modo I2C para hablar con el otro dispositivo, se desactiva la línea SS del dispositivo SPI, por lo que la radio SPI simplemente la ignorará. Pero cuando está en modo SPI para hablar con el módulo de radio, seguramente los datos y las líneas del reloj serán tales que el dispositivo I2C piense que una transacción está en curso. ¿Algo que pueda hacer para evitar esto?

Algunas ideas que tengo:

  • Implementación de software de I2C en dos pines GPIO de repuesto.

  • Colocando una puerta de búfer entre la salida del reloj de la pequeña USI y la línea SCL del bus I2C, para que un pin GPIO en la pequeña pueda controlarlo.

  • Use otro pin GPIO como la línea SCL en el bus I2C, y use la temporización solo de software del USI.

Sin embargo, cada uno de estos utiliza al menos otro pin GPIO, y no tengo muchos de repuesto. ¿Puedo hacerlo de una manera más agradable? P.ej. ¿Alguna manera de trabajar las líneas garantizada por orden en modo SPI, para que I2C nunca vea una condición de "INICIO"?

¿Alguna vez alguien más ha mezclado con éxito estos?

    
pregunta LeoNerd

3 respuestas

2

Podría usar un puente SPI a IIC como este dispositivo .

    
respondido por el Andy aka
1

La solución que decidí fue usar una versión de una sola puerta del 4066, concretamente un 74VHC1G66 (que es una pequeña parte SOT-23-5) como puerta de transmisión para conectar la parte SDA del bus I²C al pin apropiado del módulo USI.

La entrada de control de la puerta de transmisión es activa-alta, lo que significa que puedo controlarla desde la línea de selección de esclavos del chip SPI. Cuando la línea SS es alta, la puerta está conduciendo e I²C trabajará a través de ella (bidireccionalmente) mientras que el chip SPI la ignora. Cuando la línea SS está baja, el chip SPI está prestando atención a la línea que ahora funciona en modo SPI, y los chips I²C no ven nada porque la puerta está en estado de alta Z, y la resistencia de pull-up en el SDA la línea la mantiene alta.

Esta es una disposición fácilmente extensible si se agrega más de un esclavo SPI, ya que se pueden conectar a un diodo junto con una resistencia pullup en la línea de control del 1G66.

    
respondido por el LeoNerd
1

Puede mezclar un SPI y un bus I2C en los mismos cuatro pines (sin hardware adicional) si solo tiene un dispositivo SPI.

Pin 1 es SPI chip select y reloj I2C.
Pin 2 es SPI MOSI y datos I2C.
Pin 3 es el reloj SPI.
Pin 4 es SPI MISO.

Para hablar sobre I2C ...

Mantenga los pines 3 y 4 estáticos, y luego hable sobre I2C con normalidad.
El dispositivo SPI verá una selección de chip, pero no habrá reloj, por lo que no pasará nada.

Para hablar sobre SPI, use el bus SPI normalmente.

Tenga en cuenta que, a menos que esté intentando crear una condición de inicio o detención de I2C, debe tener cuidado de no cambiar nunca el pin 2 mientras la selección de chip sea alta.

Mientras que la selección de chip es baja, el dispositivo I2C solo verá una extensión de reloj ya que la selección de chip se comparte con el reloj I2C. Ignorará todas las transiciones de datos en el pin de datos porque solo se supone que bloquea los datos en el flanco ascendente del reloj, e incluso entonces solo después de haber visto una condición de inicio válida.

    
respondido por el user4574

Lea otras preguntas en las etiquetas