arduino
Comunicación SPI
Buscar..
Observaciones
Señales de selección de chip
La mayoría de los esclavos tienen una entrada activa de selección de chip bajo. El código correcto para inicializar y usar un pin de selección de chip es este:
#define CSPIN 1 // or whatever else your CS pin is
// init:
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, 1); // deselect
// use:
digitalWrite(CSPIN, 0); // select
... perform data transfer ...
digitalWrite(CSPIN, 1); // deselect
Deseleccionar un esclavo es tan importante como seleccionarlo, porque un esclavo puede manejar la línea MISO mientras está seleccionado. Puede haber muchos esclavos, pero solo uno puede manejar MISO. Si un esclavo no se deselecciona correctamente, dos o más esclavos pueden estar manejando MISO, lo que puede provocar cortocircuitos entre sus salidas y dañar los dispositivos.
Actas
Las transacciones tienen dos propósitos:
- avise al SPI cuando queremos comenzar y terminar de usarlo dentro de un contexto particular
- configurar el SPI para un chip específico
La línea del reloj tiene diferentes estados de inactividad en los diferentes modos SPI. Cambiar el modo SPI mientras se selecciona un esclavo puede confundir al esclavo, así que siempre configure el modo SPI antes de seleccionar un esclavo. El modo SPI se puede configurar con un objeto SPISettings
pasado a SPI.beginTransaction
:
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
... perform data transfer ...
digitalWrite(CSPIN, 1);
SPI.endTransaction();
SPISettings
también puede ser almacenado en otro lugar:
SPISettings mySettings(1000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);
Si otra parte del código intenta usar el SPI entre un par de llamadas para beginTransaction()
y endTransaction()
, puede surgir un error: la forma en que se hace depende de la implementación.
También vea Arduino Reference: SPISettings
Usando el SPI en las rutinas de servicio de interrupción
Si se debe usar el SPI dentro de un ISR, no se puede realizar ninguna otra transacción al mismo tiempo. La biblioteca SPI proporciona usingInterrupt(interrupt_number)
para facilitar esto. Funciona al deshabilitar la interrupción dada cada vez que se llama a beginTransaction()
, por lo que la interrupción no se puede disparar entre ese par de llamadas a beginTransaction()
y endTransaction()
.
También vea Arduino Reference: SPI: usingInterrupt
Conceptos básicos: inicialice el SPI y un pin de selección de chip, y realice una transferencia de 1 byte
#include <SPI.h>
#define CSPIN 1
void setup() {
pinMode(CSPIN, OUTPUT); // init chip select pin as an output
digitalWrite(CSPIN, 1); // most slaves interpret a high level on CS as "deasserted"
SPI.begin();
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
unsigned char sent = 0x01;
unsigned char received = SPI.transfer(sent);
// more data could be transferred here
digitalWrite(CSPIN, 1);
SPI.endTransaction();
SPI.end();
}
void loop() {
// we don't need loop code in this example.
}
Este ejemplo:
- Inicializa correctamente y utiliza un pin de selección de chip (ver comentarios)
- utiliza correctamente una transacción SPI (ver comentarios)
- Solo usa el SPI para transferir un solo byte. También hay un método para transferir matrices, que no se utiliza aquí.