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.

Documentos relacionados