Serial Peripheral Interface (SPI)
Transcripción
Serial Peripheral Interface (SPI)
Universidad Autónoma de Baja California Facultad de Ingeniería Mexicali Serial Peripheral Interface (SPI) Microprocesadores y Microcontroladores M.C. Jorge Eduardo Ibarra Esquer Semestre 2015-1 Serial Peripheral Interface (SPI) • Es un protocolo desarrollado por Motorola para permitir y facilitar la conexión entre procesadores y circuitos de soporte (como ADC, memoria, etc.). • Permite conectar casi cualquier dispositivo que acepte bits en serie controlado por una señal de reloj. • Se puede utilizar para comunicación entre dos microcontroladores. Serial Peripheral Interface (SPI) • Funciona como un protocolo síncrono maestro/esclavo basado en cuatro líneas: – SCLK – MISO – MOSI – SS Protocolo maestro/esclavo • Es un modelo para protocolos de comunicación. • Un dispositivo o proceso (maestro) controla a uno o más dispositivos o procesos (esclavos). Serial Clock (SCLK) • Pulsos de reloj. • Permiten sincronizar la transmisión de datos. • Son generados por el dispositivo maestro. Master In Slave Out (MISO) • Es la línea que utilizan los esclavos para enviarle datos al maestro. Master Out Slave In (MOSI) • Es la línea que utiliza el maestro para enviar datos a los esclavos. Slave Select (SS) • Se utiliza para habilitar al periférico esclavo con el que se realizará la comunicación. • El modelo requiere una línea por cada esclavo controlado por el maestro. • Para habilitar a un esclavo específico, debe colocarse un “0” lógico en el pin. Serial Peripheral Interface (SPI) Descripción del protocolo • El dispositivo maestro inicia la comunicación habilitando al esclavo. • Por cada pulso de reloj, se envía y recibe un bit. (Modo full duplex) • Después de 8 pulsos, la transmisión de 1 byte está terminada. SPI en Arduino • • • Modelo MOSI MISO SCK SS (slave) SS (master) Uno 11 / ICSP-4 12 / ICSP-1 13 / ICSP-3 10 - Leonardo ICSP-4 ICSP-1 ICSP-3 - - Due ICSP-4 ICSP-1 ICSP-3 - 4, 10, 52 Cualquier pin puede ser utilizado como selector de esclavo (SS). La librería de SPI para Arduino solamente incluye la funcionalidad como maestro. El pin 10 en el Arduino UNO, deberá configurarse como salida. Librería SPI para Arduino • Incluye los siguientes métodos para utilizar el protocolo SPI: – begin() – end() – setBitOrder() – setDataMode() – setClockDivider() – transfer() begin() • Inicializa el bus SPI: – SCK, MOSI y SS* se configuran como salidas. – SCK y MOSI se colocan en nivel bajo. – SS se coloca en nivel alto.* • La forma de llamar a este método es – SPI.begin() – SPI.begin(pinEsclavo) * * Solamente en Arduino Due end() • Deshabilita el bus SPI. • La forma de llamar a este método es – SPI.end() – SPI.end(pinEsclavo) setBitOrder() • Se utiliza para seleccionar el orden en que son transmitidos los bits a través del bus SPI. • La forma de llamar este método es: – SPI.setBitOrder(orden) • El parámetro orden puede tomar alguno de los valores: – LSBFIRST – MSBFIRST setClockDivider() • Elige el divisor del reloj relativo al reloj del sistema. • El valor por default es SPI_CLOCK_DIV4, que selecciona una frecuencia de ¼ del valor de la frecuencia del sistema (4MHz en el caso de los sistemas a 16MHz). setClockDivider() • La forma de llamar este método es: – SPI.setClockDivider(divisor) • El parámetro divisor puede tomar alguno de los valores 2, 4, 8, 16, 32, 64 o 128. • Están definidas constantes para estos valores, con la forma – SPI_CLOCK_DIVn setDataMode() • Se utiliza para elegir la polaridad y fase del reloj SPI. • La forma de llamar este método es: – SPI.setDataMode(modo) • El parámetro modo puede tomar alguno de los valores: – – – – SPI_MODE0 SPI_MODE1 SPI_MODE2 SPI_MODE3 setDataMode() • La polaridad indica si el reloj permanece en nivel alto o bajo cuando no esté en uso. • La fase indica el flanco de la señal de reloj que se utiliza para el envío o recepción de cada bit. Modo Polaridad Fase SPI_MODE0 0 0 SPI_MODE1 0 1 SPI_MODE2 1 0 SPI_MODE3 1 1 transfer() • Envía y recibe un byte a través del bus SPI. • La forma de llamar este método es: – SPI.transfer(valor) • Donde el parámetro valor corresponde al byte que se va a enviar. • La función regresa el valor del byte recibido. Notas • Antes de utilizar el método transfer(), es necesario colocar el valor correcto del pin SS. digitalWrite(pinEsclavo,LOW); SPI.transfer(valor); digitalWrite(pinEsclavo,HIGH); Método shiftOut() • Se utiliza para transmitir un byte de manera serie a través de un pin. • Proporciona una implementación por software para la interfaz SPI. • La sintaxis del método es: – shiftOut(pinDatos, pinReloj, orden, valor) • Puede utilizarse en cualquier pin. Método shiftIn() • Se utiliza para recibir un byte de manera serie a través de un pin. • Proporciona una implementación por software para la interfaz SPI. • La sintaxis del método es: – byte valor=shiftIn(pinDatos, pinReloj, orden) • Puede utilizarse en cualquier pin. Notas • De la misma manera que en el método transfer(), es necesario colocar el valor correcto del pin SS. • Es necesario asegurarnos que el pin del reloj esté inicialmente en su estado inactivo. digitalWrite(pinReloj,LOW); digitalWrite(pinEsclavo,LOW); shiftOut(pinDatos, pinReloj, LSBFIRST,valor); digitalWrite(pinEsclavo,HIGH); SPI en Intel Galileo • El bus SPI está configurado para funcionar a 4MHz por compatibilidad con Arduino. • Su velocidad se puede incrementar hasta 25MHz. • Solamente puede operar en modo maestro.