Página 1 de 2
89c51ED2 SPI

Enviado:
22 Jan 2007 17:56
por mauricio.esposito
alguem já fez a comunicação com varios microcontroladores 89c51 usando SPI ??

Enviado:
24 Jan 2007 14:26
por zachary
Eu também estou interessado nesse assunto.
Eu trabalho atualmente num projeto com o AT89C51ED2. e penso em interligar algumas placas entre si, eu pretendia fazer isso por I2C mas se funcionar por SPI acredito que a coisa fica melhor pois esse CHIP ja possui um hardware interno que facilita a coisa e torna a comunicação mais rápida.
Vc ja tem uma idéia da como fazer? Tem algum hardware montado onde possa fazer os testes?
Vamos trocar idéias...
Abraço
Zac

Enviado:
24 Jan 2007 17:46
por mauricio.esposito
zachary já fiz funcionar um master e 2 slave que é o que preciso, funciona muito bem ,gera interrupção tudo ok ,tudo com hardware(SPI) do micro ,nada implementado via software ,o meu problema é que não consegui fazer comunicacao bidirecional com eles como se fosse uma uart,fiz algumas placas com o 89c51ed2 plcc 68 com controle do download via serial (FLIP),lcd 4x20 e ram 32K e 4 chaves nas ints e conectores molex com as portas para implementaçao de algum periferico.

Enviado:
25 Jan 2007 07:24
por zachary
Oi Mauricio
Deixa eu ver se entedi, você consegue escrever nos SLAVEs mas não consegue ler, é isso?
Abraço.
Zac

Enviado:
25 Jan 2007 07:35
por mauricio.esposito
isso vc envia para os slaves ,mas os slaves nao enviam para o master eles so recebem

Enviado:
25 Jan 2007 07:48
por zachary
Mauricio, teria como vc postar a parte do código que faz a comunicação tanto do Master quanto dos Slaves?
Não tem muita coisa pra dar errado no hardware, principalmente se vc já consegue comunicar na direção MASTER -> SLAVE.
Vc chegou a monitorar com um osciloscópio o pino MISO do MASTER? Pois é por ele que retornam os dados dos Slaves. Outra coisa, vc ja experimentou comunicar ligando apenas 1 MASTER e 1 SLAVE? Funcionou?
Abraço
Zac

Enviado:
26 Jan 2007 15:01
por mauricio.esposito
Zac te envio os codigos no domingo !! que estou viajando e os codigos estão em outra maquina.mas cheguei a comunicar 1 master e 1 slave e tambem não funcionou ,mas nao monitorei os pinos.

Enviado:
28 Jan 2007 20:46
por mauricio.esposito
segue codigo ,conforme combinado
/*---------------------------------------------------
TESTE SPI.C
---------------------------------------------------*/
#include <at89c51xd2.h>
#define CURSOR_FINO 0x0E // Faz o cursor sublinhado.
#define CURSOR_CHEIO 0x0D // Faz o cursor completo.
#define CURSOR_APAGA 0x0C // Apaga o cursor.
char serial_data;
char data_example=0x21;
bit transmit_completed=0;
xdata unsigned char COMANDOLCD _at_ 0xFFF0; // cpu teste
xdata unsigned char DADOLCD _at_ 0xFFF1; // cpu teste
void cmlcd (unsigned char);
void setcursor (unsigned char);
void wrlcd (unsigned char);
void gotoxy (unsigned char, unsigned char);
void write (unsigned char *);
void initlcd (void);
void atualiza (void);
void INICIALIZA (void);
void TELA (void);
/*-----------------------------------------
---- Envia um comando para o display. ----
-----------------------------------------*/
void cmlcd(unsigned char c)
{
unsigned int delay;
COMANDOLCD=c;
for (delay = 0; delay < 20; delay++);
}
/*------------------------------------------
---- Envia um caractere para o display. ----
------------------------------------------*/
void wrlcd(unsigned char c)
{
unsigned int delay;
DADOLCD=c;
for (delay = 0; delay < 10; delay++);
}
/*-------------------------------------
---- Posiciona o cursor no display ----
-------------------------------------*/
void gotoxy(unsigned char x, unsigned char y)
{
cmlcd((128 | (((--y & 1)^1)<< 6))+((--x & 127) | ((--y & 2) << 3)));
}
/*-----------------------------------------------------
---- Envia para o display uma cadeia de caracteres ----
-----------------------------------------------------*/
void write(unsigned char *c)
{
for(;*c!=0;c++) wrlcd(*c);
}
/*----------------------------------
---- Define o formato do cursor ----
----------------------------------*/
void setcursor(unsigned char tipo)
{
cmlcd(tipo);
}
/*-----------------------------------------
---- initlcd ----
-----------------------------------------*/
void initlcd(void)
{
unsigned int t;
for (t = 0; t < 500; t++);
cmlcd(0x38);
for (t = 0; t < 500; t++);
cmlcd(0x38);
for (t = 0; t < 500; t++);
cmlcd(0x0C);
for (t = 0; t < 500; t++);
cmlcd(0x01);
for (t = 0; t < 500; t++);
}
/*-----------------------------------------
---- Inicializa o Display ----
-----------------------------------------*/
void INICIALIZA (void)
{
unsigned int count;
initlcd ();
setcursor (CURSOR_APAGA);
gotoxy (9,1);
write (" ");
gotoxy (1,2);
write ("** **");
for (count=0 ; count<65500 ; count++);
}
/*-----------------------------------------
---- Mostra Mensagem do Projeto ----
-----------------------------------------*/
void TELA (void)
{
gotoxy (1,1);
write (" PROJETO SPI ");
gotoxy (1,2);
write (" 89c51ed2 Master ");
gotoxy (5,3);
write (" ");
gotoxy (5,4);
write (" ");
}
/*------------------------------------------------
The main C function. Program execution starts
here after stack initialization.
------------------------------------------------*/
void main (void)
{
unsigned int t;
P0=0xFF;
P1=0xFF;
P2=0xFF;
P3=0xFF;
INICIALIZA ();
TELA ();
SPCON |= 0x10;
P1_1=1;
SPCON |= 0x01; // f/4
SPCON &= ~0x08;
SPCON |= 0x04;
IEN1 |= 0x04;
SPCON |= 0x40;
EA=1;
serial_data=0;
while (1)
{
gotoxy (5,3);
write (" Enviou: ");
wrlcd (data_example);
SPDAT=data_example;
data_example++;
if (data_example == 121) data_example=0x21;
while (!transmit_completed);
transmit_completed=0;
SPDAT=0x00;
while (!transmit_completed);
transmit_completed=0;
gotoxy (5,4);
write (" Recebeu: ");
wrlcd (serial_data);
for (t=0;t<40000;t++);
}
}
void it_SPI (void) interrupt 9
{
switch (SPSTA)
{
case 0x80:
serial_data=SPDAT;
transmit_completed=1;
break;
case 0x10:
break;
case 0x40:
break;
}
}

Enviado:
29 Jan 2007 04:08
por jeanfernandes
Uma vez o MAuricio (o do livro) me pediu um esquema assim.
Acho que ele pode te dar mais suporte....
Nem sei se ele levou a ideia pra frente....
O negocio de juntar os fios nos mcus....tem apenas um porém.....
eu imagino que o pino de dados tem que ser "coletor" aberto....senão dá bode....

Enviado:
29 Jan 2007 15:41
por zachary
Ixi.... "C" num tenho experiencia nesse "BIXU" ....
Se fosse em assembler seria mais fácil pra mim. Mesmo assim vou dar uma verificada.
Outra coisa, quanto aos pinos a única coisa que vc tem de se preocupar é de não ligar duas "SAÍDAS" juntas pra não ocorrer colisão. Nem precisa se preocupar se é dreno (ou coletor) aberto pois o hardware do AT89C5... já preve que sejam ligados assim desde que vc ponha nível lógico "1" nesses pinos.
Ainda sugiro que você de uma verificada com o osciloscópio nesse pino "MISO" (no master) para ver se tem alguma atividade.
Outra coisa, como você sabe que o SLAVE está recebendo a informação?
Abraço,
Zac

Enviado:
30 Jan 2007 01:39
por Maurício
Salve, Jean !!
Tentei, mas não usei.
No final, resolví com paralela, mesmo.
E agora, fiz o mais óbvio: adotei a linha AVR e escolhí um integrado com duas seriais, ehehehehehehe
[]'s
RETI.

Enviado:
30 Jan 2007 06:52
por rubenprom
Eu tb cai no mesmo caminho, mas tudo bem, eu nao desisto!, o 8051 ainda é 10!

Enviado:
30 Jan 2007 09:49
por zachary
Maurício escreveu:Salve, Jean !!
Tentei, mas não usei.
No final, resolví com paralela, mesmo.
E agora, fiz o mais óbvio: adotei a linha AVR e escolhí um integrado com duas seriais, ehehehehehehe
[]'s
RETI.
Desistiu Maurício? Que pena

.....
Quando eu tiver tempo disponível (coisa rara aqui na empresa) vou montar um hardware pra desvendar essa "PARADA".
Se algém ainda se interessar por esse assunto é só falar! (escrever

)
Abraços
Zac
"8051... Para o infinito... E além!"

Enviado:
30 Jan 2007 14:18
por Maurício
Desistí porque o cliente tinha prazo, pra variar....
Precisava de um circuito com duas seriais.
Mas, como a comunicação não seria mestre-escravo, porque a CPU da segunda serial (C2051, que não tem SPI nativo) fazia a sinalização e o envio do byte recebido, acabei optando mesmo por paralela.
Chega um byte, sinaliza, o mestre recolhe a informação e retransmite.
Tudo feito por interrupção.
Com o AVR, economizei só uns 10 integrados pra fazer essa lógica funcionar.
Mas, se as duas CPUS tiverem SPI nativo, configuração mestre-escravo e multi-master não devem ser muito problemáticas, não !
Não sei te dizer, porque eu ainda não usei.
[]'s
RETI.

Enviado:
30 Jan 2007 18:50
por jeanfernandes
Mauricio
Entenda o problema
Se tem um MASTER e DOIS SLAVES eheheheeheh ai fica mais simples
da pra ligar via UART (dependendo das condicoes de protocolo do MASTER com um sistema de gerencia Externo).....veja bem
roteador tabajara
Se quiser expandir da pra fazer tb agora eh so trocar o 153 por um 151 e pensar do mermo jeito....
Fuiz.