Ir al contenido

SPI

SPI es un bus rápido para hablar con un dispositivo a la vez. Usa cuatro líneas:

  • MOSI: datos del controlador (tu placa) hacia el dispositivo.
  • MISO: datos del dispositivo hacia el controlador.
  • SCK: el reloj (marca el ritmo).
  • CS (chip-select): elige a qué dispositivo le hablas.

Es full-duplex: en cada operación se envían y se reciben bytes al mismo tiempo. La plataforma soporta el canal 0. Como el código es autocontenido, inicia el bus al inicio.

board.spiBegin(0); // canal 0

2. Configurar un dispositivo: spiDeviceConfig(opciones)

Sección titulada «2. Configurar un dispositivo: spiDeviceConfig(opciones)»

Devuelve un identificador que usarás en cada transferencia. Cada opción:

  • deviceId (0–63): un id lógico que tú asignas al dispositivo.
  • channel (por defecto 0): el canal SPI.
  • bitOrder (por defecto 1): orden de los bits. 1 = MSB primero (lo habitual), 0 = LSB primero.
  • dataMode (0–3): el “modo SPI”. Combina la polaridad (CPOL) y la fase (CPHA) del reloj; en simple, define en qué momento del reloj se leen los bits. La mayoría de dispositivos usan 0; usa el que diga el datasheet (puedes componerlo con board.SPI_MODES.CPHA / CPOL).
  • maxSpeed (Hz, por defecto 4000000): velocidad del reloj.
  • csPin (por defecto -1): pin de chip-select. -1 = sin gestión de CS (lo manejas tú con un pin digital).
const dev = board.spiDeviceConfig({
deviceId: 0,
maxSpeed: 1000000, // 1 MHz
bitOrder: 1, // MSB primero
dataMode: 0,
csPin: 10,
});

spiTransfer envía y recibe la misma cantidad de bytes a la vez (full-duplex). El callback recibe los bytes leídos:

board.spiTransfer(dev, 0, [0x9F], (recibidos) => {
varG.spi = recibidos;
});
// spiTransfer(deviceId, requestId, data[], callback, channel = 0)
  • requestId (0–127): un número que tú eliges para casar la respuesta con la petición (útil si lanzas varias seguidas).

Variantes según lo que necesites:

MétodoPara qué
spiTransfer(dev, reqId, data[], cb, ch?)enviar y recibir a la vez
spiWrite(dev, reqId, data[], ch?)solo escribir (sin esperar lectura)
spiWriteAck(dev, reqId, data[], cb, ch?)escribir y recibir confirmación
spiRead(dev, reqId, n, cb, ch?)solo leer n bytes
spiEnd(ch?)cerrar el bus
  • Olvidar spiBegin antes de configurar o transferir.
  • dataMode equivocado: si lees basura, revisa el modo SPI del datasheet.
  • Pasar más de 127 bytes en una transferencia → error.
  • CS mal gestionado: si pusiste csPin: -1, controla tú el chip-select.