Comunicação SPI - Microcontrolandos
Home Tutoriais Comunicação SPI
Tiago Henrique terça-feira, março 05, 2013 7 comentários
Comunicação SPI(Serial Peripheral Interface )
A comunicação SPI sempre tem um Master, isto é, sempre um será o Master e o restante será Slave. Por exemplo, o PIC é o Master e os outros periféricos são Slave. Esta comunicação contém 4 conexões:
SS (Slave Select) - Seleciona qual escravo receberá os dados.
Alguns periféricos são apenas Slave, por exemplo, cartão SD, memória flash e alguns sensores.
SDI (Slave Data IN) - Pino de dados de entrada;
SDO - (Slave Data OUT) - Pino de dados de saída;
Comunicação full duplex;
Flexibilidade protocolo completo para os bits transferidos;
Não se limita a 8-bit palavras;
Escolha arbitrária do tamanho da mensagem, conteúdo e finalidade Interface de hardware extremamente simples;
Normalmente mais baixos requisitos de energia do que I2C devido a menos circuitos;
Não necessita de resistores de pull-up;
Escravos usar relógio do mestre, e não precisam de osciladores de precisão;
Os escravos não precisa de um endereço único;
Requer mais pinos do CI;
Sinais de out-of-band Chip Select são obrigatórios nos barramentos comuns;
Sem controle de fluxo de hardware pelo escravo (mas o mestre pode atrasar o clock seguinte para diminuir a taxa de transferência);
Não há reconhecimento do escravo (o mestre poderia estar transmitindo a lugar nenhum e não saberiamos);
Suporta apenas um dispositivo mestre;
Geralmente propenso a causar picos de ruído em comunicação defeituoso;
Lida apenas com curtas distâncias em relação ao RS-232, RS-485, ou CAN-BUS;
Muitas variações existentes, o que torna difícil encontrar ferramentas de desenvolvimento, como adaptadores de host que suportam essas variações;
Este exemplo controla o potenciômetro Digital AD5206. Possui 6 canais, isto é, 6 potenciômetros. Possui os seguintes pinos: A1, W1, B1 ... A6, W6, B6.
Código: Exemplo com PIC
sbit CS0 at RC0_bit;
sbit CS0_Direction at TRISC0_bit;
void AD5206_write(short channel, short value){
CS0 = 0; //seleciona o periferico
SPI1_Write(channel); //envia o endereço de um dos potenciometros(0 - 5)
SPI1_Write(value);  //envia o valor de posicao do potenciometro(0 - 255)
CS0 = 1; //deseleciona o periferico
CS0_Direction = 0; //define pino cs como saida
//este loop faz alterar o valor do potenciometro do canal 0
AD5206_Write(0, i);//incrementa de 0 a 255
for(i=255; i>=0; i--){
AD5206_Write(0, i);//decrementa de 255 a 0
Código: Exemplo com Arduino
#include const int slaveSelectPin = 10; void setup(){ pinMode (slaveSelectPin, OUTPUT); SPI.begin(); } void loop(){ for(i=0; i<255; i++){ digitalPotWrite(0, i); delay_ms(100); } for(i=255; i>=0; i--){ digitalPotWrite(0, i); delay_ms(100); } } void digitalPotWrite(int address, int value) { digitalWrite(slaveSelectPin,LOW); SPI.transfer(address); SPI.transfer(value); digitalWrite(slaveSelectPin,HIGH); }
Vittor segunda-feira, 6 de janeiro de 2014 14:22:00 BRST
Esse código foi feito em qual programa?
Tiago Henrique segunda-feira, 6 de janeiro de 2014 14:30:00 BRST
O primeiro foi feito no MikroC PRO PIC e o outro foi na IDE do Arduino.
Carolina quarta-feira, 19 de março de 2014 16:15:00 BRT
Olá, no codigo em C, onde estão as rotinas SPI1_Init e SPI1_Write? Obrigada
Tiago Henrique quarta-feira, 19 de março de 2014 16:22:00 BRT
SPI1_Write e SPI1_Init são da biblioteca SPI, do próprio MikroC PRO PIC.
Carolina domingo, 27 de abril de 2014 19:53:00 BRT
vc tem alguma coisa semelhante pro compilador HITECH? Obrigada pela ajuda
Anônimo quarta-feira, 24 de dezembro de 2014 12:50:00 BRST
Olá Tiago será que você pode me ajudar com o CI ISD1730? é um ci para gravação e reprodução de faixas de áudio, ele trabalha com comunicação SPI, porém não estou conseguindo fazer o microcontrolador acessar a faixa de memória exata que gravei a mensagem e no tempo certo de reprodução. meu e-mail é henrique-sousa1994@hotmail.com