Solución de problemas de SPI, Teensy, Arduino y tri-state

Estoy tratando de poner en funcionamiento mis dispositivos de bus SPI en una placa de circuito personalizada que he soldado. Desafortunadamente, olvidé agregar puntos de prueba de sonda en esta placa de circuito en particular, y no creo que pueda probar directamente las señales del bus SPI en los circuitos integrados. Uno es un controlador de sumidero de corriente LED de 20 pines en un paquete SSOP y el otro es un soporte para tarjeta microSD.

Parece que no puedo hacer que ninguno de los dispositivos funcione.

Mi MCU es un Teensy 3.1. (Compatible con Arduino) En términos de firmware, estoy usando Arduino v1.06 (la versión más alta compatible con Teensyduino) y Teensyduino V1.20. Estoy usando la biblioteca/objeto SPI para comunicaciones con el controlador LED y la biblioteca SdFat para comunicaciones con la tarjeta SD.

Aquí está el esquema de cómo se conectan mi controlador LED y la tarjeta SD:

Esquema del controlador LED

Esquema de la tarjeta SD

De acuerdo con la hoja de datos TLC59025 , el diagrama de tiempo para comunicarse con el controlador LED es el siguiente:

Diagrama de tiempo SPI para TLC59025

Mi método de prueba hasta ahora, además del software (es decir, intentar abrir un archivo en la tarjeta SD), ha sido el siguiente:

  • Se aseguró de que el LDO de 3,3 V que sirve a la tarjeta SD emitiera el voltaje correcto
  • Intenté iniciar las comunicaciones en serie con la tarjeta SD usando la biblioteca SdFat (esto no funcionó)
  • Voltaje medido en varios pines de salida del controlador LED , antes y después de enviar dos palabras de 8 bits al pin MOSI del controlador LED y pulsar LE alto

Si el pin de salida del LED en particular está bloqueado y la corriente se hunde, entonces el voltaje que mido en ese pin debería estar cerca de 0 V, ¿correcto?

La velocidad de mi reloj Master SPI es de alrededor de 2 MHz . Sé que el TLC59025 dice que su punto de operación es de 30 MHz . Pensé que mientras el Maestro use un SCK que sea más bajo que el reloj del esclavo, las comunicaciones funcionarían. ¿Me equivoco?

Pensé que tal vez el comportamiento de los tres estados era el culpable de mis problemas, sin embargo, parece que el controlador LED TLC59025 está diseñado para aceptar siempre datos en su registro de desplazamiento, incluso cuando no es el esclavo con el que se comunica. Me parece que está diseñado para simplemente bloquear los últimos 16 bits de datos enviados a través del bus SPI MOSI cada vez que el pin LE está pulsado alto.

Estoy perplejo en cuanto a cómo proceder con la solución de problemas. Sé que el problema no debería deberse al bus MISO, ya que solo tengo un dispositivo (la tarjeta SD) conectado a ese bus. ¿Podría ser el autobús MOSI? ¿Es posible que haya demasiada capacitancia en el bus MOSI cuando intento comunicarme, degradando así la señal de datos? Si agrego un búfer de tres estados a las señales MOSI/CS en la tarjeta SD y una resistencia pullup en la señal de selección de chip de la tarjeta SD, ¿eso ayudaría a mantener la integridad de la señal en el bus MOSI (es decir, reduciría la capacitancia de MOSI bus hasta el punto de que al menos el controlador LED debería funcionar?).

¿Realmente no hay forma de que puedas poner una sonda allí y mirarla en un visor? Incluso si sólo una línea a la vez. Haría la vida mucho más fácil.
Hoy me llega un osciloscopio por correo. Veré con qué tipo de prueba termino.

Respuestas (2)

El acceso a la tarjeta SD es un poco más complicado debido a la necesidad de considerar el sistema de archivos FAT, etc. Entonces, si yo fuera usted, me concentraría primero en hacer que el controlador LED funcione; al menos entonces sabrá que su bus SPI está funcionando.

Para responder a algunas de sus preguntas:

  1. El voltaje en la salida de cualquier pin de salida LED será el voltaje que se requiere para lograr la corriente constante programada. No debe ser 0V a menos que las salidas estén configuradas para corriente máxima. Y no debería ser el voltaje de suministro a menos que se suponga que el LED esté apagado.
  2. El hecho de que el controlador LED tenga un reloj interno de 30Mhz no debería preocuparte. Su dispositivo es el maestro, controla el reloj, y el esclavo debe registrar los datos en función del reloj que le proporciona su maestro. La información de 30Mhz solo es útil en términos de apreciar la velocidad máxima a la que puede enviar datos a través del dispositivo.

Algunas cosas para comprobar:

¿Menciona pulsar LE alto, pero no menciona mantener OE bajo para habilitar las salidas LED?

Debe asegurarse de haber configurado correctamente el reloj maestro y los pines de datos. No estoy familiarizado con las cosas de Arduino, por lo que no puedo ayudarlo con los detalles aquí, pero hay varios modos de operación de SPI y deberá configurar su dispositivo para que coincida. Debe asegurarse de tener configurado el modo correcto para generar los datos en el flanco ascendente del reloj, con datos muestreados en el medio (para el controlador LED, ¡tal vez sea diferente para la SD!).

¿Dónde está el pin de selección de chip en este dispositivo? ¿Seguro que tiene uno? No se pudo ver en el diagrama suministrado. Si no hay selección de chip, ¿cómo cambiará entre los datos proporcionados a la tarjeta SD y los datos proporcionados al controlador LED? ¿Necesitará dos periféricos SPI? A menos que tal vez el controlador LED esté feliz de simplemente sentarse allí recibiendo datos, incluso si no es el destinatario previsto, y depende de usted controlar los pines LE y OE cuando es el destinatario previsto. Vale la pena mirar esto para aclarar todo.

No estoy seguro de lo que se supone que debe salir del pin SDO del controlador LED. ¿Lo estás usando?

¿Cómo se supone que SDI se relaciona con las salidas LED? Observo que en el diagrama de temporización SDI es alto para los bits 0, 2, 5, 10, 11, 12 y 15. Pero se muestra que las salidas 0, 3 y 15 responden con una condición 'ENCENDIDA'. Tal vez esto se explique en otra parte de la hoja de datos, porque no parece tener ningún sentido obvio desde el diagrama de tiempos...

¡Buena suerte!

Gracias por la respuesta. Para responder algunas de las preguntas que tenía: -El pin SDO en el controlador LED es para conectar en cadena los controladores LED. Por ejemplo, si añado otro del mismo controlador LED a la placa y el pin SDO del primer controlador alimenta al segundo controlador, efectivamente tendría un controlador LED de 32 bits: si lee los bits de datos hacia atrás en el diagrama de tiempo , corresponden al estado de salida de los distintos pines de salida... es decir, el bit 15 corresponde a la salida 1. -Solo puedo suponer que no hay un pin de selección de esclavo en este controlador, sino que tiene un pin de cierre
Está bien, eso tiene sentido. Definitivamente me concentraría en hacer que el controlador LED funcione primero. Divide y vencerás, empezando por lo más fácil primero.
Otra cosa: el voltaje en los pines de salida del controlador LED debe ser alto cuando el LED está apagado, ya que es un controlador de hundimiento de corriente . Cuando desea que el LED se encienda, el controlador cambia su resistencia en ese pin hasta que pasa una corriente definida por el usuario. Entonces, por lo tanto, asumiría que la resistencia de un pin habilitado sería cero cuando ese pin está habilitado sin un LED real conectado (es decir, sería lo mismo que un cortocircuito a tierra). ¿Alguien ve algún defecto en esa suposición?
Ah, está bien, en ese caso mi respuesta sigue en pie, excepto que la condición de 'apagado' es al revés. La condición de 'encendido' seguirá siendo el voltaje requerido para lograr el CC programado. Como usted dice, si no hay ningún LED conectado, la salida debería conducir hasta '0V' en un intento de lograr la corriente constante. Estoy de acuerdo con tu evaluación de esto. ¡Espero que esto funcione!
El camino de menor resistencia aquí, para la depuración, es 'alcanzar las líneas clk/data y asegurarse de que tanto los datos como el tiempo de los datos sean los esperados.

Entonces, recibí mi osciloscopio por correo, lo configuré y logré conectar cuidadosamente las sondas a los pines MCU Teensy 3.1 relacionados con SPI y mi controlador LED (es decir, pin SCK y pin MOSI).

Parece que el problema está en la biblioteca SPI que estaba usando.

El pin MOSI no estaba alto para el segundo byte cuando traté de escribir dos bytes consecutivos en el controlador. Podría configurar las salidas de los pines 8-15 en el controlador LED para que se activen, sin embargo, parece que no pude hacer que el pin MOSI aumentara durante la escritura del segundo byte.

Pude superar el problema agregando un retraso de aproximadamente 10 ms entre las escrituras de dos bytes.

Pude optimizar aún más la velocidad (para no tener que esperar 10 ms entre escrituras de bytes) usando los métodos SPI.beginTransaction() y SPI.endTransaction() de la clase SPI.

Al envolver cada transferencia de bytes en estos métodos transaccionales, pude poner en funcionamiento el controlador LED. Aquí está el tipo de estructura de código que terminó funcionando para mí:

SPI.beginTransaction(LEDDriverSettings);
SPI.transfer(firstByte);
SPI.endTransaction();
SPI.beginTransaction(LEDDriverSettings);
SPI.transfer(secondByte);
SPI.endTransaction();