Arduino SPI no está transmitiendo

1

Estoy tratando de manejar un controlador MAX7219 LED y 8x8 LED Matrix a través de SPI desde mi Arduino MEGA 2560. Puedo controlar el MAX7219 a través de SPI usando mi Bus Pirate, pero por alguna razón, cuando intento controlarlo desde Arduino ( código de abajo) No obtengo respuesta. Además, conecté mi Bus Pirate a mis pines Arduino SPI y lo puse en modo de rastreo, y no muestra comunicación, ya sea que CS esté bajo o no. ¿Alguien tiene alguna idea de por qué esto no funciona?

Código:

#include "SPI.h"

void setup() {
  pinMode(10, OUTPUT);
  lcd.begin(20,4);
  SPI.begin();
  pinMode(13, INPUT);
}

void spiWrite(byte reg, byte data){
 digitalWrite(10, LOW);
  SPI.transfer(reg);
  SPI.transfer(data);
  digitalWrite(10, HIGH); 
}

void resetMAX(){
  spiWrite(0x0f, 1);
  spiWrite(0x0c, 1);
  spiWrite(0x02, 13);  
}


void loop() {  

  if(digitalRead(13)==HIGH){
    resetMAX();
  } else {
    spiWrite(0x0f, 0);
  }
}

Estoy utilizando los pines SPI en el encabezado de ICSP (Reloj = 3, MOSI = 4) y el Pin 10 (en el lado PWM del arduino) para la Selección de esclavos. En el Pin 13, tengo un interruptor para habilitar el envío de diferentes comandos al MAX7219, aunque actualmente no tiene ningún efecto, ya que parece que no envío ningún comando SPI. ¿Pensamientos?

    

3 respuestas

0

Seguí el consejo de @ mpflaga e intenté un programa diferente en una placa Arduino diferente (Pro Mini), y descubrí que el Bus Pirate tampoco lo estaba leyendo. Después de una pequeña investigación, descubrí que el modo de rastreo más rápido del Bus Pirate es 1MHz, mientras que el Arduino por defecto es 4MHz para SPI. Agregué SPI.setClockDivider(SPI_CLOCK_DIV128) a mi método setUp (haciendo que la velocidad de reloj SPI sea de 125 kHz), y encontré que el Bus Pirate podía ver los datos del Arduino muy bien.

A partir de ahí, trabajé hacia atrás hasta mi configuración original en el Arduino Mega a 4 MHz y descubrí que todo funcionaba. Creo que lo que estaba haciendo mal es que accidentalmente conecté el bus SPI a los encabezados ICMP2 cerca del pin 13 LED, en lugar de ICMP1 cerca del botón de reinicio. Gracias a todos, por su ayuda, y lamento haberle molestado con el problema '¿comprobó el diagrama de cableado'?

    
respondido por el therealmitchconnors
1

Encontré esto en la página SPI de Arduino enlace

  

Nota sobre el pin Slave Select (SS) en tableros basados en AVR

     

Todas las placas basadas en AVR tienen un pin SS que es útil cuando actúan como esclavos controlados por un maestro externo. Dado que esta biblioteca solo admite el modo maestro, este pin debe configurarse siempre como SALIDA. De lo contrario, la interfaz SPI podría ponerse automáticamente en modo esclavo por hardware, haciendo que la biblioteca no funcione.   Sin embargo, es posible utilizar cualquier pin como Slave Select (SS) para los dispositivos. Por ejemplo, el escudo Arduino Ethernet utiliza el pin 4 para controlar la conexión SPI a la tarjeta SD integrada, y el pin 10 para controlar la conexión al controlador Ethernet.

No estoy seguro de si solucionará el problema, hasta ahora la mayoría de mis tableros han usado el pin SS como salida, independientemente.

    
respondido por el geometrikal
0

D13 es el reloj spi. Necesita ser una salida. No es una entrada como la tienes. Con esto como entrada, tu spi es un esclavo y necesita un reloj incorporado. Por lo tanto no ves nada. Quieres que tu spi sea maestro y conduzca el reloj a los periféricos.

Mueva la entrada de su interruptor para el reinicio del led a un pin no utilizado.

    
respondido por el mpflaga

Lea otras preguntas en las etiquetas