Tema 5

Comunicaciones Cableadas en Sistemas Embebidos

© Germán Ramos (gramosp@eln.upv.es)
Parte de este material ha sido elaborado por Vicente Torres (vtorres@eln.upv.es) y Javier Valls (jvalls@eln.upv.es)
UPV - Universitat Politècnica de València
DIE - Departamento de Ingeniería Electrónica

Contenidos

  • Comunicaciones Cableadas: Necesidad y Tipos.

  • UART: Universal Asynchronous Receiver-Transmitter.

  • I2C: Inter-Integrated Communication.

  • SPI: Serial Peripheral Interface.

  • Comparación y usos.

Comunicaciones Cableadas: Necesidades

  • Cualquier Sistema Embebido puede estar compuesto por múltiples componentes:

    • Microcontrolador o Microprocesador.

    • Memoria externa.

    • Sensores: luz, temperatura, presencia, presión, humedad, acelerómetro, ultrasonidos, etc.

    • Pantallas.

    • Interfaz de usuario: botones, pulsadores, encoders, superficies táctiles, etc.

    • Convertidores: Analógico-Digital y Digital-Analógico.

    • Subsistemas de comunicación: Bluetooth, WiFi, Ethernet, CAN, etc.

Comunicaciones Cableadas: Necesidades

  • Cualquier Sistema Embebido puede estar compuesto por múltiples componentes:

    • Periféricos externos: relojes de tiempo real, matrices de leds, seguridad, NFCs, etc.

    • Otros.

  • Es necesario poder conectar y comunicar entre sí el "cerebro" del sistema (el microcontrolador) con el resto de subsistemas, tanto para poder configurarlos en el modo de trabajo necesario, como para interactuar con ellos.

  • Para ello se han desarrollado y estandarizado diversos sistemas de comunicación (principalmente comunicaciones serie) que son empleados por la gran mayoría de fabricantes de componentes electrónicos.

Comunicaciones Cableadas: Tipos - Medio de comunicación

  • Medio de comunicación:

    • Cableados: conexiones entre los circuitos mediantes pistas en la placa de circuito impreso (PCB) o mediante cables tal y como realizamos en las prácticas.

      Estas son las comunicaciones que estudiaremos en este tema: UART, I2C, SPI.

UART I2C SPI LOGOS

Comunicaciones Cableadas: Tipos - Medio de comunicación

  • Medio de comunicación:

    • Inalámbricos: conexiones por radiocomunicaciones en distintas bandas de frecuencias y protocolos.

      Normalmente empleadas para conectar el sistema embebido con dispositivos externos.

      Estas comunicaciones se introducirán en el tema siguiente: WiFi, Bluetooth.

WiFi BT logos

Comunicaciones Cableadas: Tipos - Serie/Paralelo

  • Bus Serie / Paralelo:

    • Serie: La información entre los dispositivos se envía bit a bit uno tras otro, requiriendo varios envíos secuenciales para enviar bytes (8x) o palabras mayores de 16, 32 o 64 bits.

      Son hoy en día las comunicaciones más empleadas al requerir muy pocos pines de los circuitos integrados.

      Ejemplo de envío del byte 1011001 con el LSB (Least Significant Bit) primero:

serie example

Comunicaciones Cableadas: Tipos - Serie/Paralelo

  • Serie / Paralelo:

    • Paralelo: La información entre los dispositivos se envía en bloques de bits (8, 16, 32 bits) unos tras otros.

      Envían más información que la comunicación serie, pero requiere de más pines y líneas (pistas en la PCB).

      Empleadas principalmente en las memorias donde sí es necesario un gran flujo de datos.

parallel example

Comunicaciones Cableadas: Tipos - Síncrono/Asíncrono

  • Síncronas / Asíncronas:

    • Síncronas: Además de las líneas (pines) con los bits de datos, se añade una línea de reloj CLOCK que sincroniza el avance de los bits de datos y la lectura de los mismos.

      CLOCK es gobernada por el Master (luego lo veremos).

      Los datos se muestrean por el receptor en un flanco de reloj (normalmente subida) y avanzan hacia el siguiente bit en el otro flanco (normalmente bajada).

      Los protocolos I2C y SPI son serie-síncronos.

synch example

Comunicaciones Cableadas: Tipos - Síncrono/Asíncrono

  • Síncronas / Asíncronas:

    • Asíncronas: En este caso los datos se envían de transmisor a receptor sin señal de reloj, sin información de sincronía entre ellos.

      Es necesario conocer previamente la tasa de bits por segundo y alguna referencia inicial temporal para poder saber en el receptor cuando muestrear el valor del bit.

      El protocolo UART es serie-asíncrono.

asynch example

Comunicaciones Cableadas: Tipos - Topología

  • Topología: 1:1 / 1:N:

    • 1:1: Comunicación desde 1 transmisor a 1 único receptor. No se permite compartir las líneas ni de datos ni de reloj si es una conexión síncrona.

      El protocolo UART es de topología 1:1.

1 to 1

Comunicaciones Cableadas: Tipos - Topología

  • Topología: 1:1 / 1:N:

    • 1:N: Comunicación desde 1 transmisor a N posibles receptores. Sí se permite compartir las líneas de datos y de reloj.

      Solo puede haber 1 transmisor a la vez para evitar cortocircuitos en las líneas de datos y/o reloj.

      Debe haber un arbitraje para saber quién hace una petición de datos Master y quién responde (Slave) de todos los demás.

      Los protocolos I2C y SPI son de topología 1:N.

      1 to N

Comunicaciones Cableadas: Tipos - Full-Duplex/Half-Duplex

  • Full-Duplex / Half-Duplex:

    • Full-Duplex: Existen líneas de comunicación independientes para transmisión TX y recepción RX.

      Es posible transmistir y recibir de forma simultánea.

      Los protocolos UART y SPI son Full-Duplex.

1 to 1

Comunicaciones Cableadas: Tipos - Full-Duplex/Half-Duplex

  • Full-Duplex / Half-Duplex:

    • Half-Duplex: Existe una única línea de comunicación de datos empleada de forma alterna en el tiempo para la transmisión y recepción.

      No es posible transmistir y recibir de forma simultánea.

      Es necesario establecer un sistema de arbitraje para el uso de la línea de datos.

      El protocolo I2C es Half-Duplex.

1 to N

Comunicaciones Cableadas: Ejemplo

example

Comunicaciones Cableadas: UART

UART - Contenidos

  • Definición y Señales.

  • UART en Arduino Mega2560.

  • Librería Serial de Arduino.

  • UART en el ordenador: Terminal, Adaptadores, Python.

  • Ejemplo.

  • Referencias.

UART - Definición y Señales

  • UART es acrónimo de Universal Asynchronous Receiver/Transmitter

  • Como hemos visto en la clasificación, se trata de una comunicación serie, cableada, asíncrona al no incorporar señal de reloj, punto a punto 1:1 y Full-Duplex.

  • Definida en el estándar RS232.

  • Las comunicaciones serie empleando una UART son una forma simple de comunicar dos dispositivos entre sí, empleando pocos recursos y líneas de comunicación.

  • Orientada en principio a la transmisión de carácteres ASCII. No obstante, con gestión de datos por parte de transmisor y receptor, permiten enviar cualquier tipo de dato y tamaño (Ints de 8, 16, o 32 bits, Floats de 32 bits).

  • Empleada en subsistemas externos como módulos Bluetooth, GPS, o GSM, control remoto de sistemas, etc., cuyos comandos de comunicación deben ser conocidos.

UART - Definición y Señales

  • En su implementación más sencilla solo necesita dos líneas de datos (cables/pistas) y la referencia:

    • TX - Línea con los bits transmitidos. Del transmisor al receptor.

    • RX - línea con los bits recibidos. Provenientes del transmisor.

    • GND - Línea de masa con la referencia del voltaje, necesaria si transmisor y receptor no están dentro del mismo sistema.

uart rx tx

UART - Definición y Señales - Trama UART

  • Al tratarse de una comunicación asíncrona es necesario que el dispositivo transmisor TX y el receptor RX trabajen a la misma velocidad de transmisión/recepción, los mismos baudios (símbolos por segundo).

  • En estado inactivo, las líneas de datos están a nivel alto "1".

  • Para coordinarse TX con RX, la tranmisión de la trama de datos empieza con un bit de START, seguido de los bits de datos enviados en serie, un bit opcional de paridad, y se termina con uno o varios bits de STOP.

uart frame

UART - Definición y Señales - Trama UART

uart frame
  • Sin transmitir la línea permanece a 1 lógico (3.3/5 voltios).

  • El flanco descendente del bit de START, es el momento de sincronización en el receptor y saber cuando debe muestrear el bit recibido, en Tbit/2. El receptor emplea un TIMER interno (contador) para saber cuando muestrear.

  • Se envían de 5 a 8 bits de datos, con el LSB primero.

UART - Definición y Señales - Trama UART

uart frame
  • Opcionalmente puede haber un bit de paridad P configurable como even/odd.

  • Se termina la trama con 1 o varios bits de STOP.

  • Se repite todo el proceso para cada caracter de información enviado desde el TX al RX.

UART - Definición y Señales - Baudios y bits por segundo

uart frame
  • La velocidad de trasmisión en baudios es de 1/Tbit.

  • La tasa de bits de información por segundo BPS (throughput) es:

    uart bps

UART - Definición y Señales - Baudios y bits por segundo

uart frame
  • Las tasas de baudios habituales empleadas son: 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200.

    Existen UARTS capaces de trabajar hasta el Megabaudio.

  • Puede emplearse cualquier tasa de baudios siempre que TX y RX se pongan de acuerdo. No recomendado salvo para valores empleados en estándares específicos como el MIDI que son 31250 baudios.

UART - Definición y Señales - Shift Registers

  • Envío/recepción de bytes: palabras de 8 bits que deben ser enviados/recibidos uno tras otro.

  • Uso de registros de desplazamiento Shift Registers SR en los microcontroladores que trabajan junto a FIFO: First In First Out de datos.

uart SR

UART - Definición y Señales - Control de Flujo

  • SIN control de flujo por Hardware:

    • Si la FIFO de TX está todavía llena, no puedo transmitir nuevos datos.

    • Si la FIFO de RX no está llena, no debo de leer el dato recibido.

    • El microcontrolador notifica si es posible transmitir TX_READY y si es posible leer RX_READY mediante bits específicos en los registros de control que pueden generar interrupciones.

    • Es posible implementar un control de flujo por software sin ampliar el número de líneas, intercambiando comandos entre RX y TX: Xon (ASCII 17) y Xoff (ASCII 19). Muy poco usado.

UART - Definición y Señales - Control de Flujo

  • CON control de flujo por Hardware:

    • Se añaden dos nuevas líneas para notificarse entre TX y RX si están preparados.

    • RTS: Request To Send solicitud de envío. De TX a RX.

    • CTS: Clear To Send libre para envío. De RX a TX.

    • Este control requiere de líneas adicionales y ya casi no es empleado.

uart rts cts

UART - Definición y Señales - Estándar RS232

  • El estándar RS232 es uno de los empleados para las comunicaciones serie entre dispositivos.

    Los niveles de señales son bipolares en el rango de +-3V a +-25V.

  • CUIDADO con los niveles TTL normalmente aceptados por los pines RX y TX de los microcontroladores, que suelen ser entre 0V y 3.3V o 5V.

  • Hace falta emplear circuitos integrados niveladores que compatibilicen los niveles RS232 con los TTL.

  • El conector estándar para el RS232 es el obsoleto DB9.

UART - Definición y Señales - Estándar RS232

  • Los ordenadores ya no disponen de puertos RS232. Se emplean convertidores USB-Serial tanto en formato cable como PCB. Fabricante FTDI https://ftdichip.com.

RS232

UART - Definición y Señales - Estándar RS232

  • Estos conversores USB-Serial se instalan en el ordenador como un dispositivo Virtual COM, siendo para el Sistema Operativo una UART convencional, sin necesidad de apdaptar el código.

  • El mismo protocolo UART puede ser empleado con distinta capa física.

  • Además del RS232, en la industria se emplea el RS422 o el RS485 que emplean señal diferencial y son capaces de trabajar con grandes distancias (hasta 1 Km).

UART - Definición y Señales - Trama UART TTL

  • Captura con osciloscopio de una trama UART:

uart frame scope
Descifra el mensaje!!!

UART - Arduino Mega2560

  • El microcontrolador AVR ATMega2560 dispone de 4 USART.

usart mega2560

UART - Arduino Mega2560

  • La S añadida corresponde a Synchronous ya que permite trabajar de forma asíncrona y síncrona, añadiendo una señal de reloj que marca el avance de los bits.

  • Características de la USART:

    • Comunicaciones síncronas o asíncronas (estándar).

    • Soporte de Full-Duplex en todas ellas.

    • Tramas serie de envío y recepción de 5/6/7/8/9 bits de datos.

    • 1/2 bits de STOP.

    • Paridad odd/even generada y añadida automáticamente por hardware.

    • Generador Baud-Rate propio de alta resolución.

UART - Arduino Mega2560

  • Características de la USART:

    • Configuración por registros de control.

    • Señalización hardware de TX finalizada, registro de TX vacío, RX finalizada con generación de interrupción independiente.

    • Detección de errores (paridad, sobreescritura de TX, etc.) con flags en registros de control.

    • No soportan control de flujo por hardware.

UART en Arduino Mega2560

Diagrama de bloques USART

usart mega2560 diagram

UART en Arduino Mega2560

Pines USARTs Mega2560

usart mega2560 pins
  • La USART (pines 0-RX y 1-TX) es la que a través de un Serial-USB se conecta la placa Mega2560 al ordenador.

UART en Arduino Mega2560

  • Las placas Arduino vienen ya programadas con un Bootloader que les permite recibir desde el Arduino IDE un nuevo sketch .ino compilado y es la UART empleada en la Consola (Monitor Serie).

  • Este Bootloader sabe identificar cuando llega un nuevo sketch *.ino, lo procesa y graba su contenido en la zona de la memoria FLASH dedicada para programas de usuario y realiza un reset.

  • Si se pierde el Bootloader, la placa no recibirá nuevos programas desde Arduino IDE.

    En este caso hay que programar el Bootloader desde la opción Herramientas / Quemar Bootloader. Es necesario disponer de un progamador ISP o usar otro Arduino para ello.

  • El resto de UART1, USART2 y USART3 están disponibles completamente para el usuario.

UART en Arduino - Librería Serial

  • Arduino incorpora por defecto la librería Serial para trabajar de forma sencilla con las UARTs sin tener que configurar uno a uno los registros de control y declarar funciones de interrupción.

  • La librería Serial ofrece diversos métodos para su configuración, lectura, escritura, chequeo, etc. Podrá encontrar ejemplos funcionales desde Arduino IDE en:

    IDE Communications Examples

UART en Arduino - Métodos de Serial

  • Serial - Objeto que selecciona la UART.

    Serial para la conectada al USB para la programación de sketches y comunicación con el IDE.

    Serial1, Serial2 o Serial3 para el resto.

UART en Arduino - Métodos de Serial

  • begin() - Inicializa y configura la UART.

    Serial.begin(speed);
    Serial.begin(speed, config);
    • speed de tipo long fija la velocidad del puerto en baudios.

      Seleccionar alguna de las velocidades permitidas por transmisor y receptor.

    • config configura el formato de la trama.

      Formato SERIAL_XPS siendo X el número de bits de datos (5-6-7-8), P la paridad (N none, E even, O odd) y S el número de bits de STOP (1-2).

      Por defecto se emplea SERIAL_8N1.

UART en Arduino - Métodos de Serial

  • end() - Libera la UART dejando sus pines disponibles para otros usos.

  • find() y findUntil().

    Serial.find(target);
    Serial.find(target, length);
    Serial.findUntil(target, terminal);
    • Leen el buffer de datos recibidos hasta encontrar target char de longitud length size_t o caracter de terminación terminal char.

    • Devuelve un bool indicando si se ha encontrado target o no.

UART en Arduino - Métodos de Serial

  • print() y println() - Escribe datos "legibles" en ASCII por la UART.

    println() añade al final un retorno de carro (ASCII 13 o '\r') y un salto de línea (ASCII 10 o '\n').

    Serial.print(val);
    Serial.println(val);
    Serial.print(val, format);
    Serial.println(val, format);
    • val puede ser casi de cualquier tipo. Si es un número entero se pasan a ASCII en BCD, floats también se pasan a BCD con dos valores decimales, bytes como char, cadenas de caracteres tal cual…​

UART en Arduino - Métodos de Serial

  • print() y println() - Escribe datos "legibles" en ASCII por la UART.

    • format permite cambiar la base de representación numérica empleada.

      Para números enteros por defecto es DEC (decimal, base 10) pero pueden emplearse BIN (binario, base 2), OCT (octal, base 8) y HEX (hexadecimal, base 16).

      Para números float indica el número de decimales a imprimir. Por defecto son 2.

      Para escribir cadenas de texto largas, o en el caso de disponer de muchas posibles cadenas de texto, es recomendable que éstas estén almacenadas en la FLASH del microcontrolador y no en la RAM que es muy escasa. Esto puede hacerse empleando la macro F(). Ejemplo:

      Serial.print(F("Hello World"))

UART en Arduino - Métodos de Serial

  • write() - Envía datos binarios por la UART sin cambio de formato alguno.

    Devuelve el número de bytes escritos, de tipo size_t. Lectura opcional.

    Serial.write(val);
    Serial.write(str);
    Serial.write(buf, len);
    • val valor a enviar como un byte simple.

    • str cadena de texto a enviar como serie de bytes.

    • buf array a enviar como serie de bytes.

    • len longitud del array en bytes.

UART en Arduino - Métodos de Serial

  • available() - Lee el número de bytes disponibles para leer de la UART y almacenadas temporalmente en el buffer de recepción de 64 bytes.

    Serial.available();
  • serialEvent() - Función que es llamada cuando hay datos disponibles.

    Incluir esta función en el código que necesitemos al recibir datos que deben ser leídos usando Serial.read().

    Ejemplo de uso aquí.

UART en Arduino - Métodos de Serial

  • read() - Devuelve como int el primer dato de entrada disponible del buffer de recepción de la UART. Si no hay más datos, devuelve un -1.

  • readBytes() , readBytesUntil(), readString() y readStringUntil()

    Leen los bytes/caracteres provenientes de la UART y los almacena en buffer.

    Terminan al haber recibido length bytes o por exceso de tiempo de espera definido en Serial.setTimeout().

    Devuelven como size_t el número de bytes escritos en buffer.

    Serial.readBytes(buffer, length);
    Serial.readBytesUntil(character, buffer, length);

    readBytesUntil() añade la posibilidad de parar la lectura al llegar un caracter de terminación character definido, que no es includo en el buffer.

UART en Arduino - Métodos de Serial

  • parseInt() y parseFloat().

    Espera hasta la recepción de un int o float válido por la UART.

    La función termina tras la recepción o por exceso de tiempo de espera definido en Serial.setTimeout().

    Si los datos recibidos no son válidos, devuele un 0.

    Serial.parseInt();
    Serial.parseFloat();

UART en Arduino - Métodos de Serial

  • parseInt() y parseFloat().

    Serial.parseInt(lookahead);
    Serial.parseFloat(lookahead);
    Serial.parseInt(lookahead, ignore);
    Serial.parseFloat(lookahead, ignore);
    • lookahead configura el modo de búsqueda en el flujo de datos de entrada. Puede ser:

      • SKIP_ALL: ignora todo caracter distinto de dígitos, signos + y - (modo por defecto).

      • SKIP_NONE: no se ignora nada.

      • SKIP_WHITESPACE: se ignoran espacios, tabuladores, saltos de línea y retornos de carro.

    • ignore permite ignorar este caracter en la búsqueda. Por ejemplo el "." o "," en millares.

UART en Arduino - Métodos de Serial

  • setTimeout().

    Fija el máximo tiempo time en milisegundos en la espera de datos por la UART.

    Por defecto es 1000 milisegundos.

    Serial.setTimeout(time);
  • Para el resto de métodos y opciones consultar la ayuda online.

UART en el Ordenador - Dispositivos

  • En un ordenador actual, las UART se implementan a través de conversores USB-Serial, tal y como hacen las propias placas de Arduino.

  • Para configurarlo podemos acceder a sus propiedades. En caso de Windows, el dispositivo aparecerá dentro del Administrador de Dispositivos como un Puerto COM. Aquí podemos ver el número de COM asignado y acceder a sus propiedades.

    Estas propiedades pueden ser luego reconfiguradas desde la aplicación que use el COM como el propio Arduino IDE.

UART en el Ordenador - Dispositivos

Ejemplo propiedades Arduino Mega 2560

uart windows

UART en el Ordenador - Terminales - IDE

  • Arduino IDE incorpora un terminal de comunicación muy sencillo (Herramientas / Monitor Serie) que muestra la información recibida desde la placa, y permite enviar información a la misma.

    Permite únicamente seleccionar la velocidad en baudios y la posibilidad de incorporar saltos de línea y/o retornos de carro.

  • Además incorpora un monitor gráfico (Herramientas / Serial Plotter) que muestra una gráfica de valores recibidos respecto al tiempo.

    Pueden enviarse varios valores separados por "," para mostrar distintas gráficas.

uart consola IDE

UART en el Ordenador - Terminales - Otros

  • Existen multitud de programas de Terminal para la comunicación serie desde/hacia el ordenador y los sistemas embebidos.

  • Todos ellos permiten seleccionar el puerto COM y su configuración, así como mostrar los datos recibidos en diversos formatos (bytes, ASCII), grabación a disco, envío de ficheros, etc.

  • Algunos de ellos son RealTerm, Tera Term o PuTTY.

uart putty

UART en el Ordenador - Programación Python

  • La USART es la que emplea Arduino IDE para el envío de programas sketch a la placa y para la comunicación a través del terminal serie. También pueden emplearse las USART1/2/3 tomando las señales de TX y RX correspondientes.

  • Podemos conectar nuestro Arduino con sus sensores y actuadores a través de una UART al ordenador para cualquier aplicación que necesitemos: toma de datos, interacción con el usuario, usar el Arduino como sistema de adquisición de datos y actuación, etc.

UART en el Ordenador - Programación Python

  • Es posible manejar desde el ordenador una UART (mediante un conversor Serial-USB) a través de múltiples aplicaciones existentes o programarlos a medida empleando cualquier lenguaje de programación: Python, C, C++, C#, MATLAB, JAVA, JavaScript, etc.

Código ARDUINO

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println("Hola mundo");
delay(1000);
}

UART en el Ordenador - Programación Python

  • En Python es necesario importar el paquete serial. Ejemplo:

Código PYTHON

import serial, time
arduino = serial.Serial('COM4', 9600)
time.sleep(2)
rawString = arduino.readline()
print(rawString)
arduino.close()

UART - EJEMPLO PERIFÉRICO - Módulo Bluetooth

UART - REFERENCIAS

Comunicaciones Cableadas: I2C

I2C - Contenidos

  • Definición y Señales.

  • I2C en Arduino Mega2560.

  • Librería Wire de Arduino.

  • Ejemplo.

  • Referencias.

I2C - Definición y Señales

  • I2C es acrónimo de Inter-Integrated Communication.

  • Es una comunicación serie, cableada, síncrona al sí incorporar señal de reloj, topología 1:N, y Half-Duplex.

  • I2C fue desarrollado y patentado en 1982 por PHILIPS (hoy en día NXP) para comunicar internamente circuitos integrados dentro de sus televisores, de forma sencilla, y empleando pocas líneas.

  • Orientado a comunicaciones que requieren muy poco ancho de banda.

  • A partir de 1990, el I2C fue siendo adoptado por diversos fabricantes, existiendo hoy en día más de mil circuitos integrados de más de 50 fabricantes disponibles.

I2C - Definición y Señales

  • Para no pagar regalías, ATMEL (hoy en día Microchip) desarrollo el TWI Two Wire Interface, prácticamente idéntico. Otros fabricantes como Analog Devices emplearon también el TWI. I2C = TWI

  • La patente del I2C caducó en 2006 por lo que ya no hay derechos sobre el interfaz, quedando la protección actual únicamente sobre el logotipo.

I2c logo.svg

I2C - Definición y Señales

  • Solo necesita 2 señales para funcionar:

    • SDA: Serial DAta. Línea de datos TX y RX alternada en el tiempo.

    • SCL: Serial CLock. Línea de reloj para el avance de los datos.

i2c lines

I2C - Definición y Señales

  • Tanto SDA como SCL necesitan resistencias de Pull-Up (entre 1K y 10K, normalmente 2K2) para llevar la línea a estado lógico alto. Son líneas de colector abierto open-collector.

  • SDA y SCL son compartidas por el maestro Master (quien origina la petición y genera SCL) y todos los esclavos Slaves.

  • Cada esclavo tiene una dirección ID que debe ser única en el bus. Estas IDs pueden ser de 7 o 10 bits.

  • Cuando un esclavo es direccionado (ahora veremos como), contestará con un ACK Ackowledgement poniendo la línea SDA a 0 durante un ciclo de reloj. De esta forma el maestro sabe que el esclavo está presente.

  • Es posible que pueda haber múltiples maestros, pero solo uno activo a la vez.

  • Para conexión I2C con un sistema externo (cables cortos), añadiremos la línea de GND para unificar la referencia de voltajes.

I2C - Definición y Señales - Usos del I2C

  • Existen varias versiones del I2C con distintas velocidades de transmisión:

    • Standar Mode: 100 Kbit/s.

    • Fast Mode: 400 Kbit/s.

    • Fast Mode Plus: 1 Mbit/s.

    • High Speed Mode: 3.4 Mbit/s - No soportado por muchos microcontroladores.

I2C - Definición y Señales - Usos del I2C

  • I2C es empleado como protocolo de comunicación en múltiples circuitos integrados, tanto para la configuración de su funcionamiento, como para su propio uso:

    • Memorias FLASH.

    • Convertidores AD y DA.

    • Relojes de tiempo real RTC.

    • Expansores de puertos.

    • Sensores: Presión, Acelerómetros, Temperatura, etc..

    • Displays.

    • Atenuadores programables.

    • Controladores RFID y NFC.

I2C - Definición y Señales - Condiciones START y STOP

  • Los datos en SDA deben estar estables en el semiciclo con SCL=1.

  • Los datos en SDA deben cambiarse en el semiciclo SCL=0.

  • La comunicación es en múltiplos de bytes, con el MSB primero.

  • La comunicación empieza con la condición de START: transición 1 a 0 de SDA con SCL=1.

  • La comunicación termina con la condición de STOP: transición 0 a 1 de SDA con SCL=1.

  • Cada byte es seguido por un bit de reconocimiento ACK Acknowledgement poniendo a 0 SDA el receptor.

i2c data start stop

I2C - Definición y Señales - Trama completa

  • Una transferencia completa consta de:

    • El master inicia la comunicación generando la condición de START S.

    • Continúa enviando por SDA la dirección address del esclavo (7 bits, MSB primero) al ritmo de SCL y añade al final el bit R/_W que indica si se quiere leer en el esclavo (Read 1) o escribir en él (Write 0).

    • El esclavo contesta con el primer ACK.

    • El master emite el resto de bits, salvo los ACK, que los escribe el receptor. El contenido de estos bits o bytes dependen de cada dispositivo esclavo.

    • El master termina con la condición de parada STOP P.

I2C - Definición y Señales - Trama completa

Transferencia completa

i2c frame

I2C - Definición y Señales - Tramas R/_W

Tramas de lectura y escritura

i2c frames

I2C - Definición y Señales - Direcc. 10 bits

  • Para dispositivos I2C con direcciones de 10 bits:

    • Se envía 1111 seguido de los dos primeros bits de la dirección y el bit de R/_W.

    • Se envían los 8 bits restantes de la dirección en el siguiente byte.

i2c 10bit

I2C - Definición y Señales - Ejemplo Memoria Flash

  • Veamos cómo es el protocolo a emplear con una memoria FLASH 24FC256 de 32KBytes.

    • La dirección de la memoria es 1-0-1-0-A2-A1-A0, siendo A2-A1-A0 el estado lógico de los pines correspondientes del circuito integrado.

    • Seguido al direccionamiento junto al bit R/_W, se envían los 15 bits de la dirección de la memoria.

    • Si es escritura, se envía luego el byte de datos a escribir.

    • Si es lectura, la memoria envía ahora el byte de datos que hay en esa dirección.

I2C - Definición y Señales - Ejemplo Memoria Flash

  • Permite realizar lecturas contiguas sin tener que volver a direccionar. El Master genera un ACK para pedir el siguiente byte.

  • Permite realizar escrituras contiguas (hasta una página de 64 bytes) sin tener que volver a direccionar. Se termina con STOP.

i2c 24fc256

I2C - Definición y Señales - Ejemplo Trama LCD

#define LCD_I2C_ADDR 0x3E

i2c scope

I2C - Arduino Mega2560

  • El microcontrolador AVR ATMega2560 dispone de 1 TWI (I2C).

    • Soporta operación Master y Slave y como transmisores y receptores.

    • Direccionamiento 7 bits.

    • Hasta 400 kbits/s, Fast Mode.

    • Capacidad multimaster.

    • Generación autónoma de señales SDA y SCL con generador de reloj propia.

    • Filtrado hardware de direcciones. Generación de interrupciones.

    • Configuración completa por registros.

I2C - Arduino Mega2560

i2c atmega256

I2C - Librería Wire de Arduino

  • Arduino ofrece la librería Wire para trabajar de forma sencilla con el puerto TWI/I2C, sin tener que configurar uno a uno los registros de control y declarar funciones de interrupción.

  • Las líneas SDA y SCL se encuentran en los pines 20 y 21 respectivamente en la placa Mega2560. Cuidado: Mega2560 trabaja a +5V, no a 3.3V. Verificar compatibilidad.

  • Wire usa direcciones de 7 bits.

  • Emplea un buffer de 32 bytes, por lo que no podremos enviar/recibir más datos de forma seguida.

  • Para usar la librería: #include <Wire.h>

I2C - Librería Wire de Arduino - Funciones

  • begin() - Inicializa el puerto I2C como Master.

    Wire.begin();
    Wire.begin(address);
    • address especifica la dirección de 7 bits para trabajar como Slave.

I2C - Librería Wire de Arduino - Funciones

  • requestFrom() - Pide datos a un slave.

    Los datos serán leídos empleando available() y read().

    Wire.requestFrom(address, quantity);
    Wire.requestFrom(address, quantity, stop);
    • address especifica la dirección.

    • quantity especifica el número de bytes.

    • stop booleano para terminar la conexión con STOP.

I2C - Librería Wire de Arduino - Funciones

  • beginTransmission(), write() y endTransmission().

    Transmisión completa.

    • Wire.beginTransmission(address) inicializa la transmisión I2C con el slave address.

    • Continuar enviando datos con Wire.write(value), Wire.write(string) o Wire.write(data, length), para enviar un byte, una serie de bytes, o un array de datos de length bytes, respectivamente.

    • Terminar la transmisión con Wire.endTransmission(stop), que devuelve un byte con el estado de la transmisión. Ver códigos aquí.

I2C - Librería Wire de Arduino - Funciones (II)

  • available() y read() - Chequeo de datos didponibles para leer y lectura.

    • Wire.available() devuelve el número de bytes disponibles para ser leidos por Wire.read() uno a uno.

  • onReceive() y onRequest() - Permiten registrar una función callback.

    • Wire.onReceive() define la función llamada cuando un slave recibe una transmisión de un master.

    • Wire.onRequest() define la función llamada cuando un master pide datos a un slave.

I2C - Ejemplo RTC DS3231 - Librerías

  • Veamos ahora el DS3231 de MAXIM Integrated que es un reloj de tiempo real RTC (Real Time Clock).

  • Dispone de un mapa de memoria que especifica todas las direcciones y sus contenidos DS3231.

  • Para facilitar todavía más su uso, dispondremos de librerías específicas para este componente #include <DS3231.h> que necesitará de #include <Wire.h>.

I2C - Ejemplo RTC DS3231 - Librerías

i2c libs

I2C - Ejemplo (Prácticas)

I2C - Referencias

Comunicaciones Cableadas: SPI

SPI - Contenidos

  • Definición y Señales.

  • Modos.

  • Variantes.

  • SPI en Arduino Mega2560.

  • Librería SPI de Arduino.

  • Ejemplo.

  • Referencias.

SPI - Definición y Señales

  • SPI es acrónimo de Serial Peripheral Interface.

  • Es una comunicación serie, cableada, síncrona al sí incorporar señal de reloj, topología 1:N, y Full-Duplex.

  • SPI fue desarrollado por Motorola (actualmente parte de NXP) en 1980, convirtiéndose rápidamente en un estándar de facto.

  • También es conocido como four-wire al emplear en su implementación mínima 4 líneas.

  • Enfocado para distancias cortas (dentro de un sistema embebido) y tasas de transferencia considerables >10MHz.

  • Formatos configurables: flancos activos de CLK, polaridad líneas de selección CS, MSB o LSB primero, tamaños palabras, etc.

  • Evoluciones: MicroWire, three-wire, dual SPI, quad SPI QSPI (4 líneas de datos en paralelo de hasta 80MHz cada una) empleada en tarjetas SD.

SPI - Definición y Señales

  • El bus mínimo consta de 4 líneas:

    • SCK: Serial CLock. Señal de reloj que gobierna el Master.

    • MOSI: Master Output Slave Input. Datos de Master a Slave. Se debe conectar a la entrada SDI (Serial Data Input) de los slaves.

    • MISO: Master Input Slave Output. Datos de Slave a Master. Se debe conectar a la salida SDO (Serial Data Output) de los slaves.

    • CS: Chip Select. Señal de selección de cada slave normalmente activa a nivel bajo. También llamada SS (Slave Select).

spi lines

SPI - Definición y Señales

  • Es necesaria una línea dedicada de CS para cada slave, por lo que en total hacen falta 3+N líneas, siendo N el número de slaves.

  • A diferencia de I2C en la que todos los dispositos comparten SDA, en SPI hay líneas independientes de datos para TX MOSI y RX MISO permitiendo comunicaciones Full-Duplex y un mayor ancho de banda.

  • Cuando un slave no está direccionado (/CS=1), sus pines SPI permanecen en alta impedancia high-impedance, dejando el bus libre para la comunicación entre el master y el slave direccionado (/CS=0).

  • Tras recibir el comando (depende del circuito integrado), el slave toma el bus y transmite por su línea MISO.

SPI - Definición y Señales

spi rw

SPI - Modos

  • SPI define 4 modos de trabajo en función de:

    • Polaridad de SCL. CPOL.

    • Flanco de reloj activo, 1º o 2º. CPHA.

    • Configurar master y slave en el mismo modo.

    • Los modos 1 y 3 son los más empleados.

spi modes

SPI - Modos

Comparación señales en modos 0 a 3

spi modes all

SPI - Variantes

  • Existen variaciones del SPI original.

    • 3-wire. Emplea solo 3 hilos. La línea de datos es bidireccional, alternando en el tiempo su comportamiento como MOSI y MISO.

    • Dual SPI - DSPI. Las líneas de datos MOSI y MISO son empleadas a la vez para escritura y lectura, pasando a comportamiento Half-Duplex pero multiplicando x2 la velocidad.

    • Quad SPI - QSPI. Las líneas de datos MOSI y MISO son empleadas a la vez para escritura y lectura, añadiendo 2 líneas más de idéntico comportamiento.

      Tenemos también comportamiento Half-Duplex pero multiplicando x4 la velocidad a costa de aumentar el número de señales.

      Permite llegar a cientos de Mbits/s. Empleado en tarjetas SD.

SPI - Variantes

spi qspi

SPI - Arduino Mega2560

  • El microcontrolador AVR ATMega2560 dispone 1 SPI. También es posible configurar las USART como SPI al tener la posibilidad de ser síncronas.

    • Soporta operación Master y Slave.

    • Configuración de MSB o LSB como primer bit de envío.

    • Soporta todos los modos 0 a 3.

    • 7 posibles frecuencias para SCL. Hasta CLK/2 (8 MHz).

    • Generación de interrupción al finalizar transmisión.

    • Detección de colisión en el bus.

    • Configuración completa por registros.

SPI - Arduino Mega2560

spi atmega2560

SPI - Librería SPI de Arduino

  • Arduino ofrece la librería SPI para trabajar de forma sencilla con el puerto SPI, sin tener que configurar uno a uno los registros de control y declarar funciones de interrupción.

  • Las líneas empleadas en la placa Mega2560 son: MOSI=51, MISO=50, SCK=52, SS(/CS)=53.

  • También están disponibles en el conector ICSP de programación.

  • Cuidado: Mega2560 trabaja a +5V, no a 3.3V. Verificar compatibilidad.

  • Para usar la librería: #include <SPI.h>

SPI - Librería SPI de Arduino - Funciones

  • SPISettings()

    Crea un objeto para configurar el puerto SPI. Este objeto es el que se emplerará para realizar luego cualquier comunicación con SPI.beginTransaction(), SPISettings mySettting(speedMaximum, dataOrder, dataMode)

    • speedMaximum frecuencia de SCL en Hz.

    • dataOrder fija si es MSBFIRST o LSBFIRST.

    • dataMode selecciona el modo SPI_MODE0, SPI_MODE1, SPI_MODE2, o SPI_MODE3.

SPI - Librería SPI de Arduino - Funciones

  • begin() - Inicializa el puerto SPI.

  • end() - Deshabilita el bus SPI, dejando las líneas libres para otro uso.

  • beginTransaction() y endTransaction().

    Inicializa el uso del bus SPI con SPI.beginTransaction(mySettting) y libera el bus con SPI.endTransaction().

  • transfer() y transfer16().

    Transferencia SPI simultánea en TX y RX. Los datos RX se almacenan en val (o val16).

    Para enviar un array buffer, indicad el número de bytes en size.

    receivedVal = SPI.transfer(val);
    receivedVal16 = SPI.transfer16(val16);
    SPI.transfer(buffer, size);

SPI - Librería SPI de Arduino - Funciones

  • usingInterrupt().

    En caso de que se realicen transacciones SPI desde interrupciones, emplear esta función para registrar qué número de interrupción se emplea de forma que puedan preverse conflictos de uso.

SPI - Ejemplos (Prácticas)

  • Ejemplo de sensor de presión SPI SCP1000: PressureSPI

  • Ejemplo de potenciómetro digital SPI AD5260: PotentiometerSPI

  • Controlador de 8 displays 7-segmentos o matriz de leds 8x8 SPI MAX7219: DataSheet

  • Shield Arduino para comunicaciones Ethernet empleando el controlador W5500 manejado por SPI: Ethernet_Shield

  • Para facilitar más el uso de estos periféricos SPI, hay disponibles librerías específicas para cada dispositivo que emplean por debajo #include <SPI.h>.

SPI - Referencias

Comunicaciones Cableadas: Comparación y Usos

BUS

TIPO

USOS

UART

Asíncrona
1:1
Full-Duplex

Velocidad media-baja (hasta 1 Mbit/s). Empleada para controlar dispositivos externos y Machine-To-Machine. En aplicaciones industriales permite emplear capas físicas muy robustas como RS-485 capaces de trabajar a distancias elevadas (hasta 1 Km) bajando el baudrate.

Comunicaciones Cableadas: Comparación y Usos

BUS

TIPO

USOS

I2C

Síncrona
1:N
Half-Duplex

Velocidad media-baja (hasta 1 Mbit/s) con solo 2 hilos. Empleada para controlar y configurar dispositivos internos. Distancias cortas. Requiere arbitraje del uso de las líneas.

Comunicaciones Cableadas: Comparación y Usos

BUS

TIPO

USOS

SPI

Síncrona
1:N
Full-Duplex

Velocidad alta (>10 Mbit/s) con versiones duales y quad QSPI (>100 Mbit/s). Necesita más líneas que I2C pero permite Full-Duplex y arbitraje directo. Empleada para controlar y configurar dispositivos internos. Distancias cortas. Protocolo usado en tarjetas SD, controladores Ethernet, convertidores AD y DA, etc.