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í.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow