ventilador spi - sn74AHC244 - no funciona

Soy un completo principiante en esto, así que no pase por alto ningún error tonto que pueda haber cometido un completo principiante.

Tengo un proyecto de elaboración casera, en el que intento conectar varios sensores de termómetro MAX31865, conectados por SPI, a una Raspberry Pi. Las placas MAX31865 están prefabricadas (Jugando con Fusion) y tienen un par de chips cada una. También hay un par de DAC colgando del mismo bus SPI. Usé un multiplexor para configurar la línea CS en cada parte individualmente.

Todo se veía bien: obtengo temperaturas de los chips y los DAC pueden controlar las calderas a través de controladores de explosión. Pero, en algunos rangos de temperatura, los termómetros dieron lecturas extrañas. Mirando con un analizador lógico, parecía que a veces el primer bit de uno de los bytes se destrozaba. Al desconectar dos de las placas dual-MAX31865, las anomalías desaparecen. En este punto, pensé/busqué en Google que probablemente se debía a un problema de despliegue de SPI.

Construí una placa con un par de búferes SN74AHC244s (16 entradas/salidas en total). Até todas las habilitaciones de salida a tierra para que siempre estén habilitadas. Mi idea era que el SCLK y el MOSI de Pi se vincularan a 6 entradas cada uno, luego voy de punto a punto desde las salidas a las placas (2 x DAC, 4 x dual MAX31865). Las otras 4 entradas toman las 4 líneas MISO de las placas al Pi (los DAC no tienen salida, por lo que 1 para cada una de las 4 placas de termómetro). La energía se suministra desde los pines de 3.3v del Pi.

Lo conecté todo a una sola placa dual MAX31865 y las primeras indicaciones con el analizador lógico fueron buenas: puedo ver los datos que ingresan a la placa y regresan por el otro lado. Está la solicitud MOSI al chip, luego la respuesta MISO.

Pero al Pi no le gusta nada. Parece que recupero la mayoría de los 0 en todos los ámbitos, aunque puedo ver los datos correctos en el analizador lógico.

Así que volví a una simple prueba de bucle invertido: MOSI conectado a MISO en el "lado lejano" de los SN74AHC244. El analizador lógico decodifica los bytes de vuelta exactamente a lo que se envió. Pero el Pi devuelve 0s. Si conecto MOSI a MISO directamente, entonces una prueba de bucle invertido está bien y obtengo exactamente lo que se envió, por lo que creo que los pines de Pi están bien.

Conectar directamente el termómetro a la Pi también funciona correctamente.

En cuanto al software, he intentado usar la biblioteca bcm2835 directamente, y la prueba de bucle invertido es la que se menciona aquí: Enlace

Estoy bastante convencido de que esto no es un problema de software, lo que me deja pensando que hay un problema de hardware que me falta.

He probado lo siguiente:

  1. voltajes de entrada y salida del SN74AHC244s: 3.3v.

  2. SCLK/MOSI/MISO a través de los SN74AHC244: falla.

  3. Solo MISO a través del SN74AHC244: falla.

  4. Cambia las velocidades de SPI. A través de los SN74AHC244 es "mejor" pero aún pierde muchos bits. El bucle invertido con cable directo está bien más rápido de lo que necesito para los termómetros.

  5. Analizador lógico en el loopback del otro lado y la entrada MISO en el Pi: ambas señales son idénticas y correctas según el analizador. El Pi todavía devuelve 0s.

  6. Probé todos los pares de entrada/salida en los búferes con una fuente de 3,3 V (solo voltaje, no señal). Se ve bien.

¿Alguien puede ver algo que me estoy perdiendo aquí? ¿Podría la latencia de los SN74AHC244 estar causando problemas? Mi frecuencia de muestreo en el analizador lógico es de 20 MHz. ¿Quizás el Pi no puede leer el SPI lo suficientemente rápido?

Puedo publicar el seguimiento del analizador lógico si ayuda.

Gracias por leer.

Actualización: he estado analizando el ángulo de retardo de latencia/propagación: http://electronicdesign.com/microcontrollers/isolate-your-high-speed-spi-bus-despite-long-propagation-delays

Ese artículo dice: "Una forma de mantener la sincronicidad es la reducción drástica en la velocidad del reloj hasta que el ancho del pulso del reloj se extienda a aproximadamente el doble del retraso de propagación".

Para el SN74AHC244: "tpd @ voltaje nominal (máx.) (ns)" = 11.

De la biblioteca SPI: BCM2835_SPI_CLOCK_DIVIDER_128 = 128, /*!< 128 = 512ns = = 1.953125MHz */

Basado en eso, no creo que el retraso de la propagación sea el problema después de todo (también explica por qué ralentizar el reloj SPI por debajo de eso todavía no funciona).

Desafortunadamente, ahora no tengo idea de dónde buscar a continuación (aparte de intentar devolver un reloj esclavo al Pi en un segundo SPI "falso"... pero eso va en una dirección que quiero evitar). Ideas muy apreciadas.

Actualización 2:

Disculpe los diagramas de MSPaint, probé Eagle y Visio, pero no llegué muy lejos antes de que el cuadro de juramentos se llenara; ¡Esa es una pelea para otro día!

Este bucle invertido simple no funciona (donde pongo "prueba" es donde pongo las sondas del analizador lógico):bucle invertido simple

Esto tampoco funciona:enlace MAX31865

Actualización 3: se me ocurrió una teoría sobre lo que hice mal y me siento bastante tonto. También es algo que no puse explícitamente en el diagrama, así que muchas disculpas a las personas amables que han comentado (los dos me han hecho ver mejor las cosas, he aprendido más y eso es muy apreciado).

Creo que el problema es con "las otras 4 entradas toman las 4 líneas MISO de las placas al Pi". Lo que hice fue unir las salidas del 1Yn x 4 y vinculé su única salida habilitada a tierra. Si bien atarlos funciona desde las placas del termómetro directamente al Pi como en cualquier momento tres flotan ... porque los puse todos juntos en el 74AHC244, supongo que eso elimina el aspecto de tres estados "flotante" y me da:

(una línea de señal sólida de 3,3 V + (3 x flotantes en su mayoría 0 V))/4

como tensión de señal. Supongo que la señal sigue siendo suficiente para ser un 1 para el analizador lógico, pero el Pi en realidad espera un 1 "adecuado".

Creo que estaba probando ciertas cosas en las líneas Pi-out considerando que era lo mismo que MISO volviendo; por supuesto que no lo es. Por un lado tengo, digamos el reloj, yendo a todas las entradas a la vez, y salidas independientes, y por otro lado el MISO tiene 4 líneas de alimentación independientes que luego se unen por el lado de salida.

Entonces, para solucionarlo, para el conjunto MISO, tengo la intención de cambiar los 74AHC244 por algo con una habilitación de salida por salida, luego vincular cada habilitación de salida a las líneas DRDY en las placas duales MAX31865.

Bruce: Responderé a tus preguntas en caso de que me falte algo más, y porque aprecié la pregunta (tu comentario sobre que mi texto no coincide y el "MISO alto" es lo que me llevó a pensar "oh, espera, sí importa ¿no?").

"¿Cuáles son sus configuraciones de CKPOL y CKPHA?" Estoy usando Modo 3 SPI: POL y PHA son ambos 1.

"¿Cuánto mide el cable entre la Pi y 74AHC24?" 10 cm (4 pulgadas).

"¿Tiene un condensador de derivación entre Vcc y GND?" No. Supuse que la alimentación de Raspberry Pi ya estaba "limpia" (ya que tiene una fuente de 5v). Si aún debo agregar un bypass, házmelo saber.

"¿Qué devuelve el Pi si mantienes MISO alto?" Como probablemente adivinaste desde arriba, en su mayoría 0 ... pero alto no es alto debido a mi error.

"no coincide con su diagrama. ¿Quiere decir 1A2 y 1Y2?" No pensé que importara... ahora sigo pensando que no importa para ese ejemplo, pero mi omisión de los cables de unión definitivamente importó.

¿A qué velocidad está ejecutando su reloj SPI?
Configuré el divisor en 128, lo que equivale a 1.953125MHz.
¿Estás seguro de que tienes tu MOSI y MISO en el sentido correcto? En su punto 5 anterior, se refiere a "entrada MOSI en el Pi", lo cual es incorrecto. ¿Puedes dibujar un diagrama de circuito de cómo tienes todo conectado?
Lo siento, sí, ¡MISO en el punto 5! Lo cambiaré en la pregunta e intentaré hacer un diagrama más tarde. Sin embargo, esencialmente, tengo MOSI en el Pi yendo a 1A1 en el búfer, 1Y1 yendo al MOSI en el termómetro. Lo mismo para SCLK (Pi's CLK->1A2->1Y2->dispositivo). MISO en el termómetro yendo a 1A3 en el búfer. 1Y3 luego va a MISO en el Pi. Quitar el dispositivo y conectar 1Y2 a 1A3 no funciona (pero nuevamente, se ve perfecto en el analizador lógico).
¿Cuáles son sus configuraciones de CKPOL y CKPHA? ¿Cuánto mide el cable entre Pi y 74AHC24? ¿Tiene un condensador de derivación entre Vcc y GND? "5... ambas señales son idénticas y correctas según el analizador. El Pi sigue devolviendo 0". - ¿Qué devuelve el Pi si mantienes MISO alto? "Tengo MOSI en el Pi yendo a 1A1 en el búfer, 1Y1 yendo al MOSI en el termómetro". - no coincide con su diagrama. ¿Te refieres a 1A2 y 1Y2?
Por favor, vea la actualización que agregué al final. Sus comentarios fueron y son muy apreciados.
es un ensayo enorme

Respuestas (2)

El almacenamiento en búfer puede no ser necesariamente el problema. Verificaría dos veces que las selecciones de chip no se afirmen para múltiples sensores al mismo tiempo. Si se afirma más de uno, esto describiría el problema exacto que tiene donde los datos que regresan son malos, y la eliminación de un dispositivo lo soluciona. Esto se debe a la contención del bus (cada sensor intenta impulsar MISO, mientras que solo uno debería hacerlo).

Usted mencionó usar un multiplexor para seleccionar las selecciones de chip, creo que quiso decir decodificador. (como un decodificador 74HC138 3 a 8). Eso es lo que necesitas para un circuito como este.

Si está seguro de que necesita almacenar en búfer las salidas MISO, entonces puede usar una parte de búfer múltiple como el 74HC125 y hacer que la salida MISO de cada sensor se ejecute en un búfer independiente en el '125. El decodificador que produce las selecciones de chip habilitaría la salida del búfer de modo que solo un dispositivo tenga un búfer habilitado en cualquier momento.

También intente ejecutar las cosas a baja velocidad primero. Siempre puede aumentar la velocidad del reloj SPI después de haber verificado el funcionamiento en el rango de KHz.

Entiendo que han pasado más de 3 años, pero tal vez alguien encuentre esto útil. Además, sería bueno si OP pudiera explicar qué sucedió allí y cómo se resolvió.

Sin entrar demasiado en detalles, información general de depuración de SPI:

  1. Los pines MISO/MOSI/SCK deben desplegarse directamente desde Pi a los dispositivos, multiplexar solo pines CS. El almacenamiento en búfer puede ser necesario solo si tiene diferencias de nivel (por ejemplo, 3V3 MCU y dispositivo de 5V)
  2. Debido a la gran cantidad de dispositivos, es posible que Pi no pueda garantizar los niveles de señal correctos (básicamente, la suma de las corrientes de fuga es demasiado grande para que las E/S de Pi la manejen). Solo para estar seguro, agregue pull-ups, digamos, 10k a VDD
  3. El analizador lógico podría decodificar perfectamente aquellas señales que se encuentran en el área gris (entre V_low y V_high indicados), los circuitos integrados son más exigentes al respecto. De ahí el punto 2. Mejor use el osciloscopio para verificar los niveles y formas de la señal
  4. Reduzca la frecuencia al mínimo necesario para la prueba, 100 khz, 1 MHz. Una vez que tenga comunicaciones estables, puede intentar aumentarla gradualmente. Dudo que la cantidad de datos justifique tales velocidades.
OP aquí. Tuve que abandonar este proyecto en particular debido a muchos otros acontecimientos de la vida, y fue en una caja que actualmente no puedo ubicar. Por lo que recuerdo, resolví este problema en particular. IIRC fue porque el voltaje se estaba dividiendo en alguna parte y fue suficiente para un 1 en mi analizador lógico pero no en el PI. Creo que fue porque yo habilité todas las salidas todo el tiempo en el búfer, en lugar de solo la salida que se requería, y lo arreglé asegurándome de que solo la salida requerida estuviera activada (agregando otro búfer octal en frente ).