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

1

Estoy tratando de hacer que mis dispositivos de bus SPI funcionen en una placa de circuito personalizada que he soldado juntos. Desafortunadamente, olvidé agregar puntos de prueba de la 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 hundimiento actual de 20 pin LED en un paquete SSOP y el otro es un soporte de tarjeta microSD.

Parece que no consigo que ninguno de los dos 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 admitida por 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 mi controlador LED y mi tarjeta SD están conectados:

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

Mi método de prueba hasta ahora, aparte 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 estaba emitiendo el voltaje correcto
  • Se intentó iniciar comunicaciones en serie con la tarjeta SD usando la biblioteca SdFat (esto fue un no-go)
  • Voltaje medido en varios pines fuera del controlador LED, antes y después de enviar dos palabras de 8 bits al pin MOSI del controlador LED y pulsando LE alto

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

La velocidad del reloj de mi SPI maestro es de alrededor de 2 MHz . Sé que el TLC59025 dice que su punto de operación es 30 MHz . Pensé que mientras el Maestro esté usando un SCK que sea más bajo que el reloj del esclavo, las comunicaciones funcionarán. ¿Estoy equivocado?

Pensé que tal vez el comportamiento triestatal 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 cambios, incluso cuando no lo está. El esclavo pretendido se comunica con. Me parece que está diseñado para bloquear simplemente 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 resolución de problemas. Sé que el problema no se debe al bus MISO, ya que solo tengo un dispositivo (la tarjeta SD) conectado a ese bus.   ¿Podría ser el bus 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 un resistor pullup en la señal de selección de chip de la tarjeta sd, ayudaría a mantener la integridad de la señal en el bus MOSI (es decir, reducir la capacitancia de MOSI). bus hasta el punto de que al menos el controlador LED debería funcionar?).

    
pregunta macdonaldtomw

2 respuestas

2

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

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

El pin MOSI no estaba alto para el segundo byte cuando intenté escribir dos bytes consecutivos en el controlador. Podía configurar las salidas de los pines 8-15 en el controlador LED para que se activaran, sin embargo, no pude conseguir que el pin MOSI subiera 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 las escrituras de bytes) utilizando los métodos SPI.beginTransaction () y SPI.endTransaction () de la clase SPI.

Al ajustar cada transferencia de bytes en estos métodos transaccionales, pude hacer funcionar el controlador LED. Aquí está el tipo de estructura de código que terminó trabajando para mí:

SPI.beginTransaction(LEDDriverSettings);
SPI.transfer(firstByte);
SPI.endTransaction();
SPI.beginTransaction(LEDDriverSettings);
SPI.transfer(secondByte);
SPI.endTransaction();
    
respondido por el macdonaldtomw
3

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

Para responder algunas de sus preguntas:

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

Algunas cosas para verificar:

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

Debe asegurarse de haber configurado correctamente el reloj maestro y los pines de datos. No estoy familiarizado con las cosas de Arduino, así que no puedo ayudarlo con los detalles aquí, pero hay varios modos de funcionamiento de SPI y tendrá que 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 los datos muestreados en el medio (para el controlador de LED, ¡quizás sea diferente para el 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ás dos periféricos SPI? A menos que tal vez el controlador LED esté feliz de quedarse allí recibiendo datos, incluso si no es el destinatario deseado, y depende de usted controlar los pines LE y OE cuando es el destinatario deseado. Vale la pena solo mirar esto para aclarar todo.

No estoy seguro de qué se supone que saldrá del pin SDO del controlador LED. ¿Lo estás usando?

¿Cómo se supone que SDI se relaciona con las salidas de LED? Noté 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 de "ENCENDIDO". Tal vez esto se explica en otra parte de la hoja de datos, porque no parece tener ningún sentido obvio en el diagrama de tiempo ...

¡Buena suerte!

    
respondido por el Brian J Hoskins

Lea otras preguntas en las etiquetas