arduino - maestro - serial peripheral interface
Raspberry PI SPI leyĆ³ del esclavo Arduino con el cableado IP2? (1)
Tengo wiringpi2 y el wrapper de python de pythonpi2 instalado en la distribución de NOOBS Raspbian PI. El convertidor de nivel lógico de 4 canales de Adafruit mantuvo el PI a salvo de 5v y el envío de datos al Arduino fue tan simple como esto en el lado de PI:
import wiringpi2
wiringpi2.wiringPiSPISetup(1,5000)
wiringpi2.wiringPiSPIDataRW(1,''HELLO WORLD/n'')
y el código Arduino correspondiente [3].
EDITAR: Disculpas: a partir de ahora, no puedo publicar más enlaces que añadí cuidadosamente para mostrar mi código de trabajo, fuentes y ejemplo. Tendrás que buscarlo en Google y agradecer la regla de 2 enlaces.
Entonces, sé que el cableado funciona. Pero ese no es el camino que realmente quiero, quiero leer un pin del Arduino al PI.
Los estados de referencia de Arduino SPI:
Esta biblioteca le permite comunicarse con dispositivos SPI, con el Arduino como dispositivo maestro.
El PI debe ser el dispositivo maestro. Pensé que estaba condenado hasta que leí la excelente página de Nick Gammon sobre SPI, que demuestra que 2 Arduinii hablan entre sí.
Además, el comando SPI transfer()
sugiere que PUEDE escribir desde Arduino.
Ahora estoy en la etapa en que todos los enlaces de las primeras 4 páginas de resultados de Google se muestran como "seguidos", ¡así que no es por falta de Google!
En teoría, ¿no debería funcionar esto si utilizo el método READ en el PI fin? (Nota: este es solo uno de muchos, muchos intentos, ¡no el único!)
En el Arduino:
#include <SPI.h>
void setup (void)
{
SPI.begin();
pinMode(MISO, OUTPUT);
// turn on SPI in slave mode
SPCR |= _BV(SPE);
}
void loop (void) {
byte data[] = {0x00, 0x00, 0x00, 0x00}; // this is 24 bits (8bits/byte * 4 bytes)
// Transfer 24 bits of data
for (int i=0; i<4; i++) {
SPI.transfer(data[i]); // Send 8 bits
}
}
Y en el lado PI de las cosas:
import wiringpi2
wiringpi2.wiringPiSPISetup(1,5000)
stuff = wiringpi2.wiringPiSPIDataRW(1,''/n'')
print stuff
WiringPI dice que los datos entrantes sobreescribirán mis datos, y SPIDataRW toma exactamente 2 entradas, entonces ¿no debería volver a obtener "prueba"?
¿Que me estoy perdiendo aqui? Cualquier puntero muy apreciado.
La biblioteca SPI supone que desea que el Arduino actúe como maestro. No puedes usarlo para hacer que un arduino actúe como esclavo. A veces hay que sumergirse más allá de las bibliotecas en la hoja de datos del chip y ver cómo funcionan las cosas. (y luego, idealmente, crea una biblioteca de todos tus problemas)
Un dispositivo esclavo SPI tiene que reaccionar al maestro que inicia la comunicación.
Entonces, el Pi, como maestro de SPI, tendrá que enviar bytes ficticios sobre la línea MOSI y leer lo que Arduino responde en la línea MISO. es decir, el maestro inicia la comunicación.
En el lado arduino, puede activar la interrupción SPI con:
SPCR |= _BV(SPIE);
Está integrado en el chip atmega328. Así que incluya este próximo bit en el lado arduino para ver los mensajes entrantes y establecer la respuesta para el próximo mensaje. Los datos con los que responde el esclavo SPI arduino son los que están en el registro de datos cuando el maestro envía el mensaje.
int gCurrentSpiByte; //or set up your a buffer or whatever
ISR (SPI_STC_vect)
{
gCurrentSpiByte = SPDR; // grab byte from SPI Data Register
SPDR = buf[messageCount++]; //Set the data to be sent out on the NEXT message.
}
Y recuerde, usted GOTTAGOFAST. Si el arduino no sale de esa rutina de servicio de interrupción antes de que llegue el siguiente mensaje SPI, todo se va al infierno.
También, verifique para asegurarse de que la polaridad y la fase del reloj sean las mismas entre Pi y Arduino (también conocidos como modos 0-3).
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |
SPIE - Enables the SPI interrupt when 1
SPE - Enables the SPI when 1
DORD - Sends data least Significant Bit First when 1, most Significant Bit first when 0
MSTR - Sets the Arduino in master mode when 1, slave mode when 0
CPOL - Sets the data clock to be idle when high if set to 1, idle when low if set to 0
CPHA - Samples data on the falling edge of the data clock when 1, rising edge when 0
SPR1 and SPR0 - Sets the SPI speed, 00 is fastest (4MHz) 11 is slowest (250KHz)
Entonces, para activar SPI, el SPI interrumpe, y para establecer la polaridad a ... lo que sea que eso sea ...
SPCR |= _BV(SPIE) | _BV(SPE) | _BV(CPOL) ;
De todos modos, pasé un par de días dando vueltas con el Arduino SPI y eso es lo que aprendí.