Documentos de Académico
Documentos de Profesional
Documentos de Cultura
COMUNICACIÓN SPI
Grupo “A”
Docente:
Ariel Quezada Castro
Objetivo General
Objetivos Específicos
2. MARCO TEORICO
Iniciar la comunicación – S
Enviar 7 bits de dirección – ADDR
Generar 1 bit de Lectura ó Escritura – R/W
Enviar 8 bits de dirección de memoria
Transmitir 8 bits de datos –
Confirmar la recepción de datos – ACK – ACK nowledged
Generar confirmación de No-recepción, NACK – No-ACK nowledged
Finalizar la comunicación
Estos pasos son seguidos por el maestro debido a que este es el único con la capacidad de
generar la señal de reloj para realizar la transmisión de datos.
3. ENUNCIADO
Configurar uno de los microcontroladores como maestro y el otro como esclavo SPI
(usar el modo 3). El maestro realiza la lectura de un voltaje analógico (en un
potenciómetro) y envía éste valor por el puerto SPI. El esclavo recibe el valor enviado
desde el maestro SPI y muestra el valor en un LCD y también lo envía por el puerto
serial para que se visualice en un terminal serial.
4. DISEÑO
Parte 1 - Master
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <stdlib.h>
#define MOSI 3
#define SCK 5
#define SS 2
int main(void)
{
uint8_t valorH,valorL=0;
DDRB= (1<<MOSI)| (1<<SS)|(1<<SCK);
SPCR= (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);
ADMUX=0b01000000;
ADCSRA=0b10000111;
DIDR0=0b00000011;
while (1)
{
ADMUX=0b01000000;
ADCSRA|=(1<<ADSC);
while((ADCSRA & (1<<ADIF))==0);
valorL=ADCL;
valorH=ADCH;
SPDR=valorH;
while(!(SPSR & (1<<SPIF)));
valorH=SPDR;
_delay_ms(100);
SPDR=valorL;
while(!(SPSR & (1<<SPIF)));
valorL=SPDR;
_delay_ms(100);
}
}
Parte 2 - Slave
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#define F_CPU 16000000UL
void lcdWrite4(uint8_t);
void lcdCommand(uint8_t cmd);
void lcdData(uint8_t);
void lcdInit (void);
void lcdGotoxy(uint8_t x, uint8_t);
void lcdPrint(char * str);
void resetear_lcd(void);
int main(void)
{
uint8_t ADL,ADH=0;
uint16_t AD=0;
char txt[4];
DDRB=(1<<4);
SPCR=(1<<SPE);
UCSR0A=0b00000010;
UCSR0B=0b00001000;
UCSR0C=0b00000110;
UBRR0=207;
lcdInit();
lcdCommand(0x0C);
lcdCommand(0x80);
lcdPrint("ADC: ");
lcdCommand(0xC0);
lcdPrint("LAB 7");
while (1)
{
SPDR=0;
while(!(SPSR & (1<<SPIF)));
ADH=SPDR;
SPDR=0;
while(!(SPSR & (1<<SPIF)));
ADL=SPDR;
AD=(ADH<<8) | (ADL);
while(!(UCSR0A & (1<<5)));
UDR0=13;
sendstring(itoa(AD,txt,10));
while(!(UCSR0A & (1<<5)));
UDR0=13;
lcdCommand(0x86);
lcdPrint(itoa(AD,txt,10));
if (AD<10)
{
lcdCommand(0x87);
lcdPrint(" ");
}
if (AD<100 && AD>=10)
{
lcdCommand(0x88);
lcdPrint(" ");
}
if (AD<1000 && AD>100)
{
lcdCommand(0x89);
lcdPrint(" ");
}
_delay_ms(500);
}
}
void resetear_lcd()
{
for (int i=0; i<=20; i++)
{
lcdGotoxy(0+i,0);
lcdPrint(" ");
lcdGotoxy(0+i,1);
lcdPrint(" ");
}
}
void lcdCommand (uint8_t cmd ) //OJO solo parte del puerto es del LCD.
{
LCD_CPRT &= ~(1<<LCD_RS);
lcdWrite4(cmd);
_delay_us(100);
lcdWrite4(cmd << 4);
_delay_us(100);
}
void lcdInit(void)
{
LCD_DDDR |= (1<<LCD_D4) | (1<<LCD_D5) | (1<<LCD_D6) | (1<<LCD_D7);
LCD_CDDR |= (1<<LCD_RS) | (1<<LCD_EN);
_delay_ms(50);
LCD_CPRT &= ~(1<<LCD_EN);
LCD_CPRT &= ~(1<<LCD_RS);
lcdWrite4(0x30);
_delay_ms(5);
lcdWrite4(0x30);
_delay_us(100);
lcdWrite4(0x30);
_delay_us(100);
lcdWrite4(0x20);
_delay_ms(100);
lcdCommand(0x28);
lcdCommand(0x0E);
lcdCommand(0x01);
_delay_ms(2);
lcdCommand(0x06);
}
}
void sendstring(char*cadena)
{
while(*cadena!=0x00)
{
sendchar(*cadena);
cadena++;
}
}
5. SIMULACIÓN
6. CUESTIONARIO
7. CONCLUSIONES
Se pudo realizar la comunicación entre el maestro y el esclavo permitiendo apreciar
algunas de las ventajas de esta comunicación como es la separación de funciones en
donde a cada microcontrolador se le asigno funciones especificas al igual que se
pudo entender la conexión entre los dispositivos para un mejor entendimiento de
los pines de comunicación.