¿Cómo puedo esperar una respuesta de un esclavo SPI con un ATmega16?

3

Estoy tratando de conectarme a un esclavo en la red SPI, necesito enviar un comando y recibir una respuesta. He usado el siguiente código para la conexión:

  char SPI_sendchar(char chr) {
      char receivedchar = 0;
      SPDR = chr;
      while(!(SPSR & (1<<SPIF)));
      receivedchar = SPDR;
      return (receivedchar);
  }

Pero siempre "recibo una variable" igual a la variable "chr", intento usar este código sin ningún esclavo en la red, pero el resultado es el mismo.

    
pregunta dostajn

2 respuestas

5

Lo que dijo PeterJ en su comentario es correcto. Para cualquier dispositivo que funcione basado en comandos, debe enviar un comando como está, luego enviar un "comando ficticio" o simplemente un carácter de datos, digamos 0xFF.

Esto es lo que sucede con la mayoría de las comunicaciones SPI: el maestro envía un comando, una vez que se envía el comando, el esclavo lo lee y prepara su respuesta. Luego, el esclavo envía su respuesta al mismo tiempo que el maestro envía el siguiente byte.

Lo que esto significa para ti es que necesitas agregar un comando ficticio:

char SPI_sendchar(char chr) {
  char receivedchar = 0;
  SPDR = chr;
  while(!(SPSR & (1<<SPIF)));

  SPDR = 0xFF;
  while(!(SPSR & (1<<SPIF)));

  receivedchar = SPDR;
  return (receivedchar);
}

Espero que esto ayude.

    
respondido por el Jake
1

Simplemente vea un dispositivo SPI como un registro de desplazamiento inteligente. Cambie sus datos, luego agregue algunos ciclos de reloj para permitir que los datos se desplacen. Los datos que envía en la segunda fase generalmente son irrelevantes (solo envíe 0xff, que parece ser el predeterminado no oficial a menos que se indique lo contrario).

También cuida tu Modo SPI (CPOL, CPHA; Modos 1-4).

    
respondido por el Tom L.

Lea otras preguntas en las etiquetas