SPSE14 ComunicacaoSerial DanielQuadros
SPSE14 ComunicacaoSerial DanielQuadros
SPSE14 ComunicacaoSerial DanielQuadros
Microcontroladores
Daniel Quadros
dqsoft.blogspot.com
dqsoft.blogspot@gmail.com
Comunicando com a Periferia...
Um bit de cada vez
Agenda
• O Que é Comunicação Serial?
• Porque Comunicação Serial?
• Comunicação Serial Assíncrona
– RS232, RS422 e RS485
• Comunicação a 1 fio: 1-Wire
• Comunicação a 2 fios: I2C
• Comunicação a 3 fios
• Comunicação a 4 fios: SPI e Microwire
Comunicação Serial
• Um bit enviado de cada vez
• Half x Full duplex
• Necessidades:
– Localizar os bits: síncrono ou assíncrono
– Localizar os bytes
– Endereçamento se multiponto
• Base da implementação é o shift register
Porque Comunicação Serial?
• Reduz interconexões
– Menos pinos
– Layout mais simples
– Menos interferência
– Meio pode dificultar múltiplas conexões
• Desvantagem é o desempenho
Exemplos
• Escolhidos por
– Disponibilidade
– Variedade
• Não necessariamente os melhores
• Relógio + Ram
• PIC – PCF8583
• MSP430 – DS1002
• HCS08 • EEProm
– 24W256
– 93C66
• Sensor Temp
– DS18B20
Comunic. Serial Assíncrona
#INT_RA
void RA_isr()
{
if ((input(SERIAL_RX)==0) &&
(bitRx==0))
{
bitRx = 1;
disable_interrupts(INT_RA4);
SET_TIMER1 (0xFFFF - 60);
disable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
}
}
Comunic. Serial Assincrona
case 1: // confirma start
PIC Rx bitRx = 2;
break;
(cont)
case 10: // confirma stop
byte filaRx [16]; if (dado == 1) {
volatile int8 poeRx, tiraRx; aux = (poeRx+1) & 0xF;
byte bufRx; if (aux != tiraRx) {
filaRx[poeRx] = bufRx;
#INT_TIMER1 poeRx = aux;
void TrataRx () }
{ }
int1 dado; enable_interrupts(INT_RA4);
int8 aux; disable_interrupts(INT_TIMER1);
enable_interrupts(INT_RTCC);
SET_TIMER1 (0xFFFF-156); break;
dado = input (SERIAL_RX);
switch (bitRx) default: // 2 a 9 = dados
{ bufRx = bufRx >> 1;
// ..................... if (dado == 1)
} bufRx |= 0x80;
} bitRx++;
break;
Comunic. Serial Assincrona
HCS08
#define BusClock 8000000
#define Baud 19200
Fonte: wikipedia
Comunicação 2 Fios - I2C
Escrita EEProm
Leitura EEProm
Comunicação 2 Fios - I2C
Comunicação 2 Fios - I2C
// Efetua a escrita
if (PCF8583_TxByte (PCF8583_ADDR) &&
PCF8583_TxByte (ender) &&
PCF8583_TxByte (dado))
;
// Stop
delay_us (5); sda_baixo;
delay_us (5); scl_alto;
delay_us (5); sda_alto;
}
Comunicação 2 Fios - I2C
byte PCF8583_Read (byte ender) byte PCF8583_RxByte ()
{ {
byte result = 0; int i; byte dado;
delay_us (10); sda_baixo;
delay_us (5); scl_baixo; for (i = 0; i < 8; i++)
delay_us (5); {
if (PCF8583_TxByte (PCF8583_ADDR) && delay_us (5); scl_alto;
PCF8583_TxByte (ender)) { dado = dado << 1;
delay_us (10); scl_alto; if (input(PCF8583_SDA))
delay_us (10); sda_baixo; dado |= 1;
delay_us (5); scl_baixo; delay_us (5); scl_baixo;
delay_us (5); }
if (PCF8583_TxByte(PCF8583_ADDR|1)) sda_alto; delay_us (5);
result = PCF8583_RxByte (); scl_alto; delay_us (5);
} scl_baixo;
delay_us (5); sda_baixo; return dado;
delay_us (5); scl_alto; }
delay_us (5); sda_alto;
return result;
}
Comunicação 2 Fios - I2C
• 24WC256 – EEProm 256Kbits (32Kx8)
– Não volátil (100 anos)
– 100.000 ciclos de apagamento
– I2C 1MHz
– Tempo de escrita: 5ms (Vcc 3 a 5,5V)
– Page Write (Page = 64 bytes)
– Endereço I2C : 1 0 1 0 0 A1 A0 R
Comunicação 2 Fios - I2C
// Iniciação USI
USICKCTL = USIDIV2 | USIDIV0 | USISSEL1 |
MSP430 USICKPL | USISWRST;
USICTL0 = USIPE7 | USIPE6 | USIMST;
USICTL1 = USII2C;
USICNT = 0;
USICKCTL &= ~USISWRST;
// Transmite um byte
byte I2C_TxByte (byte b)
{
USISRL = b;
USICTL0 |= USIOE;
USICNT = 8;
while ((USICTL1 & USIIFG) == 0)
;
USI USICTL0 &= ~USIOE;
• I2C e SPI USICNT = 1;
while ((USICTL1 & USIIFG) == 0)
• Shift & Clock ;
• Interrupções return (USISRL & 1) == 0;
}
Comunicação 2 Fios - I2C
void I2C_TxStart ()
// Recebe um byte {
byte I2C_RxByte () USICTL0 |= USIOE;
{ USISRL = 0xFF;
byte dado; USICNT = 1;
while ((USICTL1 & USIIFG) == 0)
USICTL0 &= ~USIOE; ;
USICNT = 8; USISRL = 0;
while ((USICTL1 & USIIFG) == 0) USICTL0 |= USIGE;
; USICTL0 &= ~USIGE;
dado = USISRL; }
• Microwire
– Subset restrito do SPI
– Somente modo 0
– Half duplex
Comunicação 4 Fios - SPI
• 93C66 – EEProm 4096bits (256x16 ou 512x8)
– Não volátil (40 anos)
– 1.000.000 ciclos de apagamento
– Microwire 250KHz a 3 MHz
– Tempo de escrita: 15ms a 5ms
Comunicação 4 Fios - SPI
Atenção!
Comunicação 4 Fios - SPI
HCS08 SPI V3
• Gera clock
• Gerencia shift
• Gera/Trata –CS
• Interrupções
• Duas opções de pinos
Comunicação 4 Fios - SPI
// Iniciação void Grava (byte addr, word dado)
SOPT2_SPIPS = 1; // pinos {
SPIC1 = 0x52; // hab SPI, Mode 0 int i;
SPIC2 = 0x00; // MISO/MOSI
SPIBR = 0x05; // busclk/64 PTBD_PTBD7 = 1;
for (i = 0; i < 100; i++)
// Write Enable ;
PTBD_PTBD7 = 1; WriteSPI (0x05); WriteSPI (addr);
for (i = 0; i < 100; i++) WriteSPI (dado >> 8);
; WriteSPI (dado & 0xFF);
WriteSPI (0x04); WriteSPI (0xFF); for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++) ;
; PTBD_PTBD7 = 0;
PTBD_PTBD7 = 0; for (i = 0; i < 100; i++)
;
// Envia um byte PTBD_PTBD7 = 1;
void WriteSPI (byte b) while (PTAD_PTAD0 == 0)
{ ;
while (!SPIS_SPTEF) PTBD_PTBD7 = 0;
; for (i = 0; i < 100; i++)
SPID = b; ;
} }
Comunicação 4 Fios - SPI
byte ReadSPI () word Le (byte addr)
{ {
byte d; byte d1, d2;
int i, j; int i;
Perguntas?
Visite o
Garoa Hacker Clube