¿Puedo usar un ATtiny84 como SPI slave y i2c master en la misma aplicación?

1

Estoy diseñando una placa con el ATtiny84A que usa una interfaz de serie universal (USI) y, como tal, no hay un periférico I2C y SPI dedicado.

He conseguido que I2C funcione y lo he probado comunicándome con una EEPROM 24AA02UID.

Logré que el SPI esclavo funcionara y lo probé devolviendo los datos solicitados a un maestro.

Mi pregunta es: si el ATtiny no tiene control sobre si / cuando el maestro decide iniciar una transacción SPI, ¿es posible usar estos mismos pines USI para consultar la EEPROM sobre i2c?

SupongoquepermitirqueelmaestroSPIexternouselospinesi2cqueestánconectadosalaEEPROMporvoluntadpropiaharáqueaparezcandatosextrañosenlaEEPROMsi/cuandoelmaestroenvíeunbytecorrespondientealadireccióni2cdelchipEEPROM,seguidadeotrosdatosaleatorios.

O,¿meestoypreocupandodemasiado?EsperabaquelaEEPROMnotuvieraencuentalasseñalesSPIdebidoalformatodeprotocoloi2cincorrecto.

Sinembargo,elproblemadequeelmaestroSPIexternotomeelcontroldelaslíneasduranteunasecuenciadecomunicacióni2cespreocupante.

¿EslamejorsoluciónusarunbúferdeestadodereposoquemiATtiny84apuedealternarparacortarelmaestroSPIexternodelaslíneasencuestióncuandoquieraleer/escribirenlaEEPROM?

EDIT:

Pareceríaquelasoluciónmásbarata,fácilysencillaesutilizarsimplementeunchipATtinydiferente.CreoqueiréconelATtiny88quetieneunpuertoTWIySPIdedicado(enpinesseparados):

    
pregunta macdonaldtomw

2 respuestas

1

Usted identificó correctamente el mayor problema: el host SPI podría intentar mejorar la alineación del reloj / datos mientras I2C maestro o esclavo lo arrastra hacia abajo.

El segundo problema es el tiempo, porque la solicitud de SPI puede venir en medio del paquete I2C. Lo que sucede a continuación depende de un esclavo I2C particular. Puede ignorar los datos, esperar el siguiente ciclo de reloj, esperar la condición de parada o simplemente hacer algo extraño / inesperado.

La solución más sencilla ya sería sugerir la separación de los canales y el I2C de bitbanging. Sin embargo, esto solo es posible si tiene 2 pines y tiempo de procesador disponible, y una velocidad de I2C más lenta es aceptable.

Si lo anterior no funciona para usted, es necesario algún hardware adicional. Específicamente, necesita dos puertas de 3 estados para desconectar las líneas SCK y MOSI provenientes del maestro SPI, y una puerta más para desconectar la entrada SCL del esclavo I2C (cuando las puertas SPI están abiertas). Esta es la solución que ya describió en su pregunta y funcionará, hasta cierto punto. El problema potencial aquí es que SPI master no sabe que no está escuchando aceptará cualquier estado que tenga en la línea MISO como respuesta válida.

Si la línea CS desde el maestro está disponible y desea ser más amigable con el maestro, puede intentar usar el estiramiento del reloj I2C como una forma de pausar la transacción I2C para manejar la solicitud de SPI. La idea es poner pestillos en el bus I2C para "congelar" las señales que vienen desde el momento en que se activa la línea CS. Varias cosas sucederán entonces:

  • el SCL y la SDA que vienen de un instante se detendrán donde estaban;
  • el ISR en marcha reprogramará USI a SPI;
  • al final abrirá las puertas SCK y MOSI y manejará la solicitud entrante.

Cuando se libera la línea CS, el attiny cerrará las puertas SPI, generará la condición de "parada" para el esclavo I2C y reprogramará el USI. Este es un escenario muy complicado y puede que a algunos dispositivos esclavos no les guste (el alargamiento del reloj maestro ha quedado obsoleto en las especificaciones recientes).

En pocas palabras: si puedes usar bit banging, úsalo. Si no, prepárate para algunos retoques extensivos.

    
respondido por el Maple
1
  

¿Es la mejor solución usar un búfer de estado de reposo que mi ATtiny84a puede alternar para cortar el maestro SPI externo de las líneas en cuestión cuando quiera leer / escribir en la EEPROM?

Puede haber una solución más simple.

  

... ATtiny84A, que utiliza una interfaz de serie universal (USI) y, como tal, no hay periféricos I2C y SPI dedicados.

Bueno, USI es un periférico I2C y SPI dedicado. Pero solo un tipo de autobús en un diseño dado.

  

¿Puedo usar un ATtiny84 como esclavo SPI y maestro I2C en la misma aplicación?

Sí, eso es posible.

  • Implemente el maestro de bus I2C utilizando el software bit-banging. Esto le permite utilizar cualquier pin GPIO para el bus I2C.
    Los buses I2C generalmente se ejecutan a un ritmo pausado, y golpear a un maestro I2C en firmware es una opción viable.
  • Utilice el hardware USI para el esclavo SPI.
    Implementar un esclavo SPI o I2C en el firmware no es práctico a una velocidad de datos razonable.
respondido por el Nick Alexeev

Lea otras preguntas en las etiquetas