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:
De acuerdo con la hoja de datos TLC59025 , el diagrama de tiempo para comunicarse con el controlador LED es el siguiente:
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:
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?).
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:
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!
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();
Rogelio Rowland
macdonaldtomw