Bus SPI

ANTECEDENTES

En esta sección se supone que está familiarizado con los conceptos de E/S digitales.

Serial Peripheral Interface (SPI ) es una interfaz común que se utiliza para la comunicación entre circuitos integrados. Un solo bus SPI permite que un único dispositivo maestro se comunique con uno o más dispositivos esclavos a tasas típicas de velocidad de comunicación que alcanzan hasta decenas de Mbit / seg. SPI es una interfaz full-duplex, lo que significa que la transmisión y la recepción se están llevando a cabo al mismo tiempo. SPI requiere 3 hilos compartidos por el maestro y todos los esclavos y un cable adicional entre el maestro y cada esclavo.

La interfaz es muy simple. El maestro transmite impulsos en la línea CLK , a la que todos los esclavos escuchan. En cada pulso CLK, el maestro escribe un bit a la línea MOSI ( master- slave- out- in), y lee de la línea MISO ( master-in-slave-out). Sólo un único esclavo puede ser habilitado en un momento dado, la prevención de la posibilidad de escritura concurrente a la línea MISO . El esclavo permitido es seleccionado por un SS (slave - select) PIN, que controla el maestro. El maestro no permitirá más de un esclavo a la vez. Un esclavo que no está seleccionado a través de su pin SS nunca debe afectar a la línea MISO y también ignorará la línea MOSI. La línea MISO se accede siempre en modo de drenaje abierto, con un solo resistor pull-up asegurándose que se lee 0xFF cada vez que hay un esclavo escribiendo en esta línea.

En un nivel superior, los bits se agrupan generalmente en palabras de 8 bits (bytes), y los esclavos individuales especifican diferentes protocolos para el acceso a sus diversas características. Lo más común (pero no siempre), es que estos protocolos se compongan de transacciones de longitud fija, en la que el maestro envía una secuencia de bytes de una longitud conocida, y el esclavo responde con un mensaje de longitud conocida, a partir de un retardo conocido (en bytes) después del comienzo de la transmisión. Debido a que existe un reloj común para la transmisión y recepción, el número físico de bytes transmitidos y el número de bytes recibidos son siempre iguales . Sin embargo, si es muy común que el mensaje transmitido del maestro que se rellene con bytes finales "basura" ( 0xFF ) y para el mensaje transmitido del esclavo para ser rellenado con líderes bytes "basura" ( 0xFF ). De esta manera, los datos reales que nos importa , pueden tener longitudes arbitrarias para la solicitud y la respuesta y un lag arbitrario entre ellos. Es importante saber que no todos los protocolos basados ​​en SPI tienen esta estructura de longitud fija. Un ejemplo notable es el protocolo MMC, que se utiliza para tarjetas SD.

La siguiente ilustración muestra una típica transacción SPI, en el que el maestro envía 5 bytes ( 0x01 , 0x02 , 0x03 , 0x04 , 0x05 ) y recibe 4 bytes ( 0x0A , 0x0B , 0x0C , 0x0D ) con un retraso de 3. La longitud total de la transacción es de este modo 7 bytes. El tiempo pasa de izquierda a escribir :

Master 0x01 0x02 0x03 0x04 0x05 0xFF 0xFF
Slave 0xFF 0xFF 0xFF 0x0A 0x0B 0x0C 0x0D

MIOIO puede actuar como un maestro SPI en un máximo de 3 buses concurrentes, a velocidades de datos de hasta 8 MHz. Las líneas CLK y MOSI se pueden asignar a los pines de soporte de salida del periférico. La línea MISO se puede asignar a cualquier pin de soporte de entrada del periférico. Líneas de las SS(Select Slave) se pueden asignar a cualquier pin. Las salidas del periférico son los pins designados con "PPSi" en la tabla que hay aquí. Puede ver una lista completa de las funciones de los terminales de la tabla en la parte inferior de esta página. Tanto las entradas como las salidas pueden apoyar lógica de 5 V en la forma estándar, tal como se describe aquí. Cuando se utiliza la lógica 3.3V, la línea MISO puede ser convenientemente abierta en modo pull-up, ahorrando la necesidad de una resistencia de polarización externa.

SINCRONIZACIÓN

Algunas opciones para los modos de reloj y temporización de la interfaz son importantes para que coincida entre el maestro y los esclavos. En primer lugar, la polaridad de reloj puede ser invertida. En segundo lugar, el MOSI y MISO pueden ser obligados a ser válidos, ya sea en el borde delantero del reloj o en el borde de reloj de salida. Esto resulta en un total de 4 combinaciones posibles. Si no estás seguro, lo mejor es la polaridad del reloj no invertida (es decir pulso de reloj es ALTO y el BAJO queda libre) y el flanco de muestreo.

COMO USARLO

Para usar los módulos MIOIO SPI se realiza a través de la interfaz SpiMaster. Una instancia de esta interfaz se corresponde con un único módulo de SPI en la tarjeta, así como a los pines que se utilizan para CLK, MOSI, MISO y SS (uno o más). Los eventos SpiMaster se obtienen llamando a una de las sobrecargas de IOIO.openSpiMaster(). La forma más simple es:

SpiMaster spi = ioio.openSpiMaster(misoPin, mosiPin, clkPin, ssPins, SpiMaster.Rate.RATE_1M);

Esto abre un módulo SPI en modo maestro, utilizando el número de pinmisoPin como MISO con pull-up interno, número de pin MOSI  mosiPin como en el modo normal, el pin clkPin como CLK en el modo normal, y los pines cuyos números están en el int array ssPins seleccionan el esclavo. El módulo SPI funciona a 1MHz. En el escenario  de un único esclavo, openSpiMaster() tiene una sobrecarga que acepta un int escalar como esclavo un pin seleccionado. La polaridad de reloj será no invertida y el muestreo se llevará a cabo en el flanco delantero del reloj. Se requiere que en el momento de la llamada, los pines que vayamos a usar no se utilicen para nada más, y de que haya al menos un módulo de SPI libre. Con el fin de abrir los pines en modo distinto de su incumplimiento (por ejemplo, para el uso de las entradas / salidas de 5 V), () se deben utilizar las otras versiones de IOIO.openSpi. Vea aquí más detalles sobre los modos de pin digitales.

Una vez que se obtiene una instancia deSpiMaster, las solicitudes se pueden enviar mediante el uso de:

byte[] request = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 };
byte[] response = new byte[4];
spi.writeRead(0, request, request.length, 7, response, response.length);

Este emitirá la transacción exacta que se utiliza en el ejemplo anterior. El primer argumento designa al número de esclavo número que se debe utilizar. Este número es el índice de la matriz ssPins que fue aprobada en la creación. Puede omitirse en el caso de un esclavo. El segundo y el tercer argumento son el búfer de solicitud y duración de ella. El cuarto argumento es la longitud total de la transacción, la quinta y la sexta argumentos son la memoria de respuesta y la longitud de la respuesta deseada.

El método writeRead() se bloqueará hasta que se reciba una respuesta, y entonces la respuesta se puede leer de la memoria de respuesta. Si no se desea el bloqueo, también hay una versión asíncrona:

SpiMaster.Result result = spi.writeReadAsync(0, request, request.length, 7, response, response.length);
// ...do some stuff while the transaction is taking place...
result.waitReady();  // blocks until response is available
doSomethingWithResponse(response);

Cuando hayas terminado de usar el módulo SPI, haz la siguiente llamada para liberarlo:

spi.close();

con el fin de devolver los pins a un estado "flotante" y, posiblemente, ser capaz de ellos volver a abrir en el mismo o en un modo diferente, así como liberar el módulo SPI. La instancia SpiMaster se vuelve inútil después de esta llamada - no se puede hacer nada con ella.

Deja un comentario

Tu dirección de correo electrónico no será publicada.