Está en la página 1de 13

UNIVERSIDAD PRIVADA DEL VALLE

FACULTAD DE INFORMÁTICA Y ELECTRÓNICA Evaluación


ELECTRONICA Y SISTEMAS
CAMPUS TIQUIPAYA

MICROPROCESADORES II

Informe de Práctica de Laboratorio Nº 1

ENVÍO Y RECEPCIÓN DE DATOS


CON LA INTERFACE SPI
GRUPO “B”

Estudiante: Oscar Miranda Castro


Docente: Ing. Gerson Pérez Villarroel

Cochabamba, 16 de marzo del 2019


Gestión I-2019
1. OBJETIVOS

El estudiante:

 Maneja el módulo SSP para poder configurar la interface SPI en el AVR como:
o Maestro y Esclavo
o Para el envío y recepción simultanea de datos.
o Sólo para enviar datos.
o Sólo para recibir datos.

2. MARCO TEÓRICO

La Interfaz Periférica Serial (SPI) es un bus de interfaz comúnmente utilizado para enviar datos
entre microcontroladores y pequeños periféricos, como registros de desplazamiento, sensores y
tarjetas SD. Utiliza líneas de reloj y datos separadas, junto con una línea de selección para elegir el
dispositivo con el que desea hablar.

¿Qué está mal con los puertos serie?

Un puerto serie común, del tipo con líneas TX y RX, se denomina "asíncrono" (no síncrono) porque
no hay control sobre cuándo se envían los datos o si se garantiza que ambos lados se ejecutan
exactamente a la misma velocidad. Como las computadoras normalmente se basan en todo lo
que se sincroniza con un único "reloj" (el cristal principal conectado a una computadora que lo
maneja todo), esto puede ser un problema cuando dos sistemas con relojes ligeramente
diferentes intentan comunicarse entre sí.

Para evitar este problema, las conexiones en serie asíncronas agregan bits adicionales de inicio y
detención a cada byte para ayudar al receptor a sincronizar los datos a medida que llegan.  Ambos
lados también deben acordar la velocidad de transmisión (como 9600 bits por segundo) de
antemano. Las ligeras diferencias en la velocidad de transmisión no son un problema porque el
receptor se vuelve a sincronizar al comienzo de cada byte.
La serie asíncrona funciona bien, pero tiene una gran sobrecarga tanto en los bits adicionales de
inicio y finalización enviados con cada byte, como en el complejo hardware requerido para enviar
y recibir datos. Y como probablemente haya notado en sus propios proyectos, si ambos lados no
están configurados a la misma velocidad, los datos recibidos serán basura. Esto se debe a que el
receptor está muestreando los bits en momentos muy específicos (las flechas en el diagrama
anterior). Si el receptor mira los momentos incorrectos, verá los bits equivocados.

Una solución sincrónica

SPI funciona de una manera ligeramente diferente. Es un bus de datos "síncrono", lo que significa
que utiliza líneas separadas para los datos y un "reloj" que mantiene a ambos lados en perfecta
sincronización. El reloj es una señal oscilante que le dice al receptor exactamente cuándo debe
muestrear los bits en la línea de datos. Este podría ser el borde ascendente (de menor a mayor) o
descendente (de mayor a menor) de la señal del reloj; la hoja de datos especificará cuál
usar. Cuando el receptor detecta ese borde, inmediatamente mirará la línea de datos para leer el
siguiente bit (ver las flechas en el siguiente diagrama). Debido a que el reloj se envía junto con los
datos, especificar la velocidad no es importante, aunque los dispositivos tendrán una velocidad
máxima a la que pueden funcionar (discutiremos la elección del borde del reloj y la velocidad en
un momento).

Una razón por la que SPI es tan popular es porque el hardware receptor puede ser un
simple registro de desplazamiento . Este es un hardware mucho más simple. Que el UART
(Receptor / Transmisor Asíncrono Universal) que requiere el serial asíncrono.
Recibiendo información

Es posible que piense para sí mismo, eso suena genial para las comunicaciones en una sola
dirección, pero ¿cómo puede enviar datos en la dirección opuesta? Aquí es donde las cosas se
ponen un poco más complicadas.

En SPI, solo un lado genera la señal de reloj (generalmente llamada CLK o SCK para Serial ClocK).  El
lado que genera el reloj se llama el "maestro", y el otro lado se llama el "esclavo". Siempre hay un
solo maestro (que es casi siempre su microcontrolador), pero puede haber múltiples esclavos
(más sobre esto en un poco).

Cuando los datos se envían desde el maestro a un esclavo, se envían a una línea de datos llamada
MOSI, para "Master Out / Slave In". Si el esclavo necesita enviar una respuesta al maestro, el
maestro continuará generando un número de ciclos de reloj predispuestos, y el esclavo colocará
los datos en una tercera línea de datos llamada MISO, para "Master In / Slave Out".

Observe que dijimos "arreglado de antemano" en la descripción anterior. Debido a que el maestro


siempre genera la señal del reloj, debe saber de antemano cuando un esclavo necesita devolver
los datos y la cantidad de datos que se devolverán. Esto es muy diferente de la serie asincrónica,
donde se pueden enviar cantidades aleatorias de datos en cualquier dirección en cualquier
momento. En la práctica, esto no es un problema, ya que SPI generalmente se usa para hablar con
sensores que tienen una estructura de comando muy específica. Por ejemplo, si envía el comando
de "lectura de datos" a un dispositivo, sabrá que el dispositivo siempre le enviará, por ejemplo,
dos bytes a cambio. (En los casos en que desee devolver una cantidad variable de datos, siempre
puede devolver uno o dos bytes especificando la longitud de los datos y luego hacer que el
maestro recupere la cantidad completa).

Tenga en cuenta que SPI es "full duplex" (tiene líneas de envío y recepción separadas) y, por lo
tanto, en ciertas situaciones, puede transmitir y recibir datos al mismo tiempo (por ejemplo,
solicitando una nueva lectura del sensor mientras recupera los datos del el anterior).  La hoja de
datos de su dispositivo le dirá si esto es posible.

Selección de esclavo (SS)

Hay una última línea que debes tener en cuenta, llamada SS para seleccionar esclavos.  Esto le dice
al esclavo que debe despertarse y recibir / enviar datos y también se usa cuando hay varios
esclavos presentes para seleccionar el que le gustaría hablar.

La línea SS normalmente se mantiene alta, lo que desconecta al esclavo del bus SPI.  (Este tipo de
lógica se conoce como "activo bajo", y a menudo verá usarlo para habilitar y restablecer líneas.)
Justo antes de que se envíen datos al esclavo, la línea baja, lo que activa el esclavo.  Cuando
termine de usar el esclavo, la línea se vuelve alta nuevamente. En un registro de desplazamiento ,
esto corresponde a la entrada "latch", que transfiere los datos recibidos a las líneas de salida.
Múltiples esclavos

Hay dos formas de conectar múltiples esclavos a un bus SPI:

1. En general, cada esclavo necesitará una línea SS separada. Para hablar con un esclavo en
particular, hará baja la línea SS de ese esclavo y mantendrá el resto de ellos en alto (no
quiere que se activen dos esclavos al mismo tiempo, o ambos pueden tratar de hablar sobre
la misma línea MISO que resulta en datos confusos). Muchos esclavos requerirán muchas
líneas de SS; si te estás quedando sin salidas, hay chips decodificadores binarios que pueden
multiplicar tus salidas SS.

1. Por otro lado, algunas partes prefieren estar conectadas en cadena, y el MISO (salida) de uno
va al MOSI (entrada) del siguiente. En este caso, una sola línea SS va a todos los esclavos. Una vez
que se envían todos los datos, la línea SS se levanta, lo que hace que todas las fichas se activen
simultáneamente. Esto se usa a menudo para registros de desplazamiento en cadena
y controladores de LED direccionables .
Tenga en cuenta que, para este diseño, los datos se desborda de un esclavo de otro, por lo que
enviar datos a cualquier uno de esclavos, que necesitará para transmitir datos suficientes para
llegar a todos ellos. Además, tenga en cuenta que la primera información que transmita terminará
en el último esclavo.

Este tipo de diseño se usa generalmente en situaciones de solo salida, como conducir LED donde
no necesita recibir datos. En estos casos, puede dejar la línea MISO del maestro desconectada. Sin
embargo, si los datos necesitan ser devueltos al maestro, puede hacerlo cerrando el bucle de
cadena margarita (cable azul en el diagrama de arriba). Tenga en cuenta que si hace esto, los
datos de retorno del esclavo 1 deberán pasar por todos los esclavos antes de volver al maestro,
así que asegúrese de enviar suficientes comandos de recepción para obtener los datos que
necesita.

3. ENUNCIADO DEL PROBLEMA O LA PRÁCTICA

Parte 1.1

Diseñar dos programas aplicando la interface SPI e implementar el circuito que cumpla la
siguiente función: Se debe programar un AVR como maestro y otro AVR como esclavo. El maestro
debe enviar hacia el otro AVR el valor digital, de la conversión realizada por su módulo ADC, de
una señal analógica introducida al primer canal AD del maestro. El esclavo debe mostrar por
alguno de sus puertos, por medio de LEDs, el valor digital que ha recibido del maestro.

Diagrama de Bloques general.


+5V
+5V

SDO SDO
SDO SDO
SDI
Canal A/D SDI SDI
Canal A/D SCKSDI SCK
SCK SCK
PIC
AVR
PIC PIC
AVR
PIC
Esclavo
Maestro Esclavo
Maestro

PORT X
PORT X

LEDs
LEDs
Parte 1.2

Diseñar dos programas aplicando la interface SPI e implementar el circuito que cumpla la
siguiente función: Se debe programar un ARDUINO o un AVR como maestro y un AVR como
esclavo. El maestro debe enviar hacia el AVR el valor digital, de la conversión realizada por su
módulo ADC, de una señal analógica introducida a un canal AD del maestro. El esclavo debe
mostrar por alguno de sus puertos, por medio de LEDs, el valor digital que ha recibido del
maestro. Así mismo el esclavo debe enviar su conversión AD al maestro para que lo pueda
mostrar.

Diagrama de Bloques general.

4. MEDICIÓN, CÁLCULOS Y GRÁFICOS

CÓDIGO:
MAESTRO
#include <avr/io.h>
#define F_CPU 16000000UL
#define MOSI 3
#define SCK 5
#define SS 2
#include <util/delay.h>

int main(void)
{
int i=0;

ADCSRA=0b10000111; // ADEN=1 ->ADC Enable


// ADATE=0 -> Des habilito modo carrera libre
// ADPS2=1; ADPS1=1; ADPS0=1 ->Prescaler=128 (16Mhz/128=125khz)
ADCSRB=0b00000000; // ADTS[2..0]=000 -> Modo carrera libre (deshabilitado por
ADATE=0)
ADMUX =0b01000000; //MUX3=0;MUX2=0;MUX1=0;MUX0=0 ->Elige canal 0 (ADC0/PC0)
//REFS1=0;REFS0 =1-> Voltaje de referecia interno AVcc, con
capacitor de 100nF en AREF
//ADlAR=0 ->Selecciono la forma de presentacion del dato
DIDR0|=(1<<ADC0D); //Des habilita el buffer digital para el canal 0
DDRB = (1<<MOSI)|(1<<SCK)|(1<<SS);
DDRD = 0xff;
PORTD =0xff;
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

while (1)
{
ADMUX &=~(1<<MUX2)&~(1<<MUX1)&~(1<<MUX0);//Selecciono canal0->MUX[2..0]=000
ADCSRA |= (1<<ADSC); //Inicio la conversi?n A/D
while (bit_is_set(ADCSRA,ADSC));//Espero fin de conversi?n
i=ADC;
SPDR = i;
while(!(SPSR & (1<<SPIF)));
PORTD = SPDR;
_delay_ms(10);

}
return 0;
}

ESCLAVO

#include <avr/io.h>#define F_CPU 16000000UL


#define MISO 4
#include <util/delay.h>

int main(void)
{
int i=0;
ADCSRA=0b10000111; // ADEN=1 ->ADC Enable
// ADATE=0 -> Des habilito modo carrera libre
// ADPS2=1; ADPS1=1; ADPS0=1 ->Prescaler=128
(16Mhz/128=125khz)
ADCSRB=0b00000000; // ADTS[2..0]=000 -> Modo carrera libre (deshabilitado por
ADATE=0)
ADMUX =0b01000000; //MUX3=0;MUX2=0;MUX1=0;MUX0=0 ->Elige canal 0 (ADC0/PC0)
//REFS1=0;REFS0 =1-> Voltaje de referecia interno AVcc, con
capacitor de 100nF en AREF
//ADlAR=0 ->Selecciono la forma de presentacion del dato
DIDR0|=(1<<ADC0D); //Des habilita el buffer digital para el canal 0
SPCR = (1<<SPE);
DDRB = (1<<MISO);
DDRD = 0xff;

while (1)
{
ADMUX &=~(1<<MUX2)&~(1<<MUX1)&~(1<<MUX0);//Selecciono canal0->MUX[2..0]=000
ADCSRA |= (1<<ADSC); //Inicio la conversi?n A/D
while (bit_is_set(ADCSRA,ADSC));//Espero fin de conversi?n
i=ADC;
SPDR = i;
while (!(SPSR & (1<<SPIF)));
PORTD = SPDR;

}
return 0;
}
CIRCUITO ARMADO:

5. SIMULACIÓN
6. LAYOUT

7. CUESTIONARIO
1. Mencionar el criterio del algoritmo que se eligió para realizar la experiencia 1.2.

El SPI es un protocolo de transmisión que permite alcanzar velocidades muy altas y que se
diseñó pensando en comunicar un microcontrolador con distintos periféricos y que
funciona a full dúplex.

SPI utiliza una solución síncrona, porque utiliza unas líneas diferentes para los datos y el
Clock. El Clock es una señal que indica al que escucha exactamente cuándo leer las líneas de
datos, con lo que el problema de pérdida de sincronía se elimina de raíz
Los dispositivos SPI se comunican entre sí utilizando un bus de 4 señales (MOSI, MISO, SCK,
SS) y un esquema maestro/esclavo, en el cual el maestro inicia el protocolo de trasmisión
de los datos

2. Dibujar un diagrama que muestre como se puede configurarse un AVR como maestro solo
para que reciba datos provenientes del esclavo.

8. CONCLUSIONES Y RECOMENDACIONES

Serial Peripheral Interface (SPI) es un protocolo de datos en serie síncrono utilizado por los
microcontroladores para comunicarse rápidamente con uno o más dispositivos periféricos en
distancias cortas. También se puede usar para la comunicación entre dos microcontroladores.

Con una conexión SPI, siempre hay un dispositivo maestro (generalmente un microcontrolador)
que controla los dispositivos periféricos. Normalmente, hay tres líneas comunes a todos los
dispositivos:

 MISO (Master In Slave Out) - La línea esclava para enviar datos al maestro,

 MOSI (Master Out Slave In) - La línea Master para enviar datos a los periféricos,

 SCK (Serial Clock) - Los pulsos de reloj que sincronizan la transmisión de datos generada por el

maestro
Y una línea específica para cada dispositivo:

 SS (Slave Select): el pin en cada dispositivo que el maestro puede usar para habilitar y

deshabilitar dispositivos específicos.

En la práctica realizada utilizamos la interface SPI para poder implementar un circuito,


programando un AVR como maestro y un AVR como esclavo, el maestro envió el valor digital de la
conversión realizada por su módulo ADC y el esclavo mostro por el puerto D mediante leds el
valor recibido, y viceversa.

9. BIBLIOGRAFÍA
 https://www.arduino.cc/en/Reference/SPI
 https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi
 https://aprendiendoarduino.wordpress.com/2016/11/13/bus-spi/
 http://panamahitek.com/como-funciona-el-protocolo-spi/

También podría gustarte