Clone Wars: Serial Peripheral Interface (SPI) aplicado a In System Programing (ISP)
Utilidad
La principal utilidad de este texto radica en el uso de este protocolo que viene por defecto en las placas Arduino (puerto ICSP o In-Circuit Serial Programming) y otras placas para programar chips AVR, bien sea como ISP (sin boooader) o bien sea para instalar el bootloader, que es lo mismo ya que el bootloader es un programa que permite programar el chip vía los pines RX y TX.
SPI
Para programar los ATTiny, el bootloader de los chips de Atmel, y los chips de Atmel sin usar el bootloader se utiliza un protocolo de comunicacón llamado Serial Peripheral Interface o SPI.
Esta es una conexión en serie y se realiza mediante un bus de 4 hilos y permite la conexión de uno o mas chips (esclavos) a uno llamado amo o maestro que controla a los demás.
Por tanto se disponen de 4 conexiones, mas luego las conexiones de energía (por lo general 5V y GND si no se suministran de otro modo). Un ejemplo es el puerto ICSP del Arduino UNO con 6 pines en 3 columnas, y que identifica los 4 pines de SPI y 2 de energía.
Este tipo de comunicación se basa en la existencia de un amo y uno o varios esclavos. En el caso se haber varios esclavos, lo normal es que solo haya un esclavo activo (escuchando) en cada momento y que el amo se encargue de decidir con qué chip está hablando. Se pueden conexiones en las que todos funcionan a la vez y el amo se comunica con el primero, comunicándose este con el siguiente, etc. En programación de chips es poco útil usar varios esclavos.
Las conexiones (o pines) son:
- SCK (Serial ClocK, reloj serie): indica el tren de pulsos que marca la frecuencia a la que funciona la comunicación. Esta señal la emite el amo y los esclavos la usan para sincronización.
- En un Arduino (para utilizarlo como un programador ISP) el pin D13 es el SCK.
- En un Arduino Mega 2560 corresponde con el pin D52.
- En un ATTiny25/85/45 corresponde con el pin 7
- En un ATmega8/8L/48/88/168/368 el pin 19.
- En un ATmega644/1284 (Sanguino) el pin 8.
- En un ATmega2560/640/1280 es el pin 20.
- MOSI (Master Output, Slave Input): en este canal el amo habla y los esclavos escuchan. Sirve para que el amo se comunique con los esclavos.
- En un Arduino el pin D12.
- En un Arduino Mega el pin D51.
- En un ATTiny25/45/85 corresponde con el pin 6.
- En un ATmega8/8L/48/88/168/368 en el pin 18.
- En un ATmega644/1284 en el pin 7.
- En un ATmega2560/640/1280 es el pin 21.
- MISO (Master Input, Slave Output): en este canal el amo escuha al esclavo activo en el momento. Sirve para que los esclavos respondan al amo. La comunicación solo la realiza el esclavo activo en ese momento (o al menos sólo debería, por lo general cuando un chip está activo no debería escuchar).
- En el Arduino el D11.
- En un Arduino Mega el pin D50
- En un ATTiny25/45/85 corresponde con el pin 5.
- En un ATmega8/8L/48/88/168/368 el pin 17.
- En un ATmega644/1284 el pin 6.
- En un ATmega2560/640/1280 es el pin 22
- SS (Slave Select): este en realidad es un pin presente en los esclavos ya que el del amo no se usa (el amo debe tenerlo pero no tiene sentido desactivar al amo). El amo tendra cada SS de esclavo conectado a un pin (que se llamara SS mas el número del esclavo) y que permitirá seleccionar el destinatario del mensaje. Esta funcionalodad del pin está esta negada, lo que implica que una señal baja (GND) lo activa.
- En un Arduino corresponde con el pin D10.
- En un Arduino Mega corresponde con el pin D53.
- En un ATTiny25/45/85 no existe este pin (no permite la comunicación pura SPI) sin embargo se puede realizar la programación del chip con el pin RESET usando este protocolo.
- En un ATmega8/8L/48/88/128/368 es el pin 16.
- En un ATmega744/1284 es el pin5.
- En un ATmega2560/640/1280 es el pin 19.
- RESET: en la programación de los chips vía ISP en vez de usarse el pin SS se usa el pin RESET:
- En el Arduino o Arduino Mega es el pin RESET de la placa.
- En un ATTiny25/45/85 coincide con el pin 1.
- En un ATmega8/8L/48/88/128/368 coincide con el pin 1.
- En un ATmega644/1284 coincide con el pin 9.
- En un ATmega2560/640/1280 coincide con el pin 30.
ArduinoISP
Para utilizar un Arduino o Arduino Mega como ISP necesitamos el código de ejemplo ArduinoISP (disponible en los ejemplos del entorno Arduino), al cual le tendremos que modificar una línea.
Nota: independientemente de que utilicemos un Arduino Mega o un Arduino Uno, los pines se configuran automáticamente (solo tenemos que saber cuales son los pines a conectar en la placa), ya que se carga el archivo pins_arduino.h correspondiente a la placa a programar.
En la función heartbeat, la última línea debería ser delay(20). Si pone delay(40) hemos de cambiarlo.
Las conexiones se realizan tal que los pines MISO, MOSI y SCK del amo (ArduinoISP, o chip programador) y esclavo (o chip a programar) y el pin SS del amo al RESET del esclavo. Dado que el pin SS se configura como pin de salida (output) no tiene el efecto contrario al deseado. Se puede cambiar el pin que se usa en una de las primeras líneas del código donde se define la macro RESET:
#define RESET SS
La macro RESET se define como SS (que es definido en pins_arduino.h), que contiene el valor de un pin (por ejemplo 10 en el Arduino UNO). Si cambiamos SS por el pin que deseemos podemos hacer que este pin realice la función.
Comunicación vía SPI
Conexiones SPI
Este protocolo permite realizar comunicación entre chips con 3 hilos comunes (SCK, MISO y MOSI) y un cable independiente para cada chip (el SS). Esta es la conexión general en el que el maestro controla directmente a cada chip. No es el protocolo más eficiente en cuanto a número de cables pero es más fácil de implementar que otros donde necesitas establecer direcciones para indicar el destinatario de la comunicación.
Existe otro formato algo más complejo, llamado cadena Daisy usado cuando varios chips deben realizar un procesado en cadena (la solución de la operación de uno es los datos que necesita el siguiente), o cuando se desea pasar la misma instrucción a varios esclavos consumiendo menos recursos en el amo. En este modelo todos los chips deben estar activos (el SS ha de estar anclado a 0, o bien de forma directa o bien x el procesador (podrían existir varias cadenas posibles). La condición es que todos los miembros de una cadena han de estar activos para que funcione.
La conexión es la siguiente:
- El amo es el primer elemento y lleva su pin MOSI conectado al pin MOSI del primer esclavo de la cadena.
- El primer esclavo de lacadena lleva el pin MISO conectado al pin MOSI del siguiente esclavo y así sucesivamente.
- El último esclavo lleva el pin MISO al pin MISO del amo.
Evidentemente los pines SCK han de estar conectados entre si para que la comunicación funcione.
Librería SPI (Arduino)
Para la comunicación SPI entre Arduinos (o entre un Arduino y otro chip) se puede usar la librería SPI que viene incluida en el entorno de Arduino. Esta sólo permite usar el chip Arduino como amo. Se deben tener en cuenta 3 parámetros necesarios para la comunicación SPI.
- Orden de los datos: esto es si se envían los bits empezando por el bit de más a la izquierda (el menos significativo) o por el de más a la derecha (el más significativo).
- Polarización del reloj: indica si se considera activo el reloj cuando está a 5V o cuando está a 0V.
- Fase del reloj: indica cuando se emiten los datos, si cuando el reloj pasa de inactivo a activo o cuando el reloj pasa de activo a inactivo. A los dos últimos parámetros se los conoce por el modo de funcionamiento del reloj.
- Velocidad de transmisión: indica la frecuencia del reloj. La frecuencia del reloj tiene que coincidir con la frecuencia a la que el dispositivo esclavo puede recibir y transmitir, y tiene como máximo la frecuencia del oscilador del Arduino (o del chip que hemos programado) y como resto de valores posibles la división de dicha frecuencia por un múltiplo de dos.