collapse

* Posts Recentes

MKR Vidor4000 por josecarlos
[Ontem às 21:05]


PWM com ventoinha por edeweld
[Ontem às 20:42]


Frequência máxima de pwm com controlo de duty cycle de 0 a 100% por Njay
[Ontem às 19:59]


NiCd por NiMH? por jm_araujo
[Ontem às 11:46]


LusoRobótica - Website - Estado actual por TigPT
[19 de Maio de 2018, 22:34]


Concurso Robô Bombeiro 2018 por Tesla
[18 de Maio de 2018, 11:01]


Trafo Amplificador Behrimger ? por jm_araujo
[16 de Maio de 2018, 18:55]


Alfândega / Taxas Alfandegárias / Portes por Njay
[16 de Maio de 2018, 01:26]


Compra Colectiva à Farnell N3-2018 (Maio 2018) por Hugu
[15 de Maio de 2018, 15:34]


Robô BBC micro:bit controlado com gestos no telemóvel Android por Tayeb
[14 de Maio de 2018, 19:41]

Autor Tópico: Ligar dois PIC por SPI  (Lida 4001 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline pedrosal

  • Mini Robot
  • *
  • Mensagens: 7
Ligar dois PIC por SPI
« em: 19 de Outubro de 2009, 22:45 »
Já consegui colocar a comunicação a funcionar mas não fiquei contente com a solução...

A história é a seguinte. Tenho dois PIC do tipo 18 ligados por SPI. O master transmite dados para o slave que contem uma ligação USB para o PC. Na minha arquitectura a ideia é existir um PIC dedicado às questões relacionadas com comunicação e outro ao processamento propriamente dito, daí a ligação.

No master tenho este código:

Código: [Seleccione]
OpenSPI(SPI_FOSC_64, MODE_00, SMPMID);
....

TRISCbits.TRISC2 = 0;
PORTCbits.RC2 = 0;
Delay10TCYx(100);

safePutsSPI(buffer);
Delay10TCYx(100);

PORTCbits.RC2 = 1;
Delay10TCYx(100);

A variável buffer é um string com cerca de 12 chars.

void safePutcSPI(unsigned char c)
{
unsigned char echo;
unsigned char retries;
TRISCbits.TRISC2 = 0;
PORTCbits.RC2 = 0;
Delay10TCYx(1);
while(1)
{
echo=0;
WriteSPI(c);
ReadSPI();
Delay10TCYx(1);
retries = 0;
while(retries < 10)
{
if(DataRdySPI())
{
echo = ReadSPI();
}
else
{
Delay10TCYx(1);
retries++;
}
}

if(echo == c)
{
break;
}
}

PORTCbits.RC2 = 1;
Delay10TCYx(1);
}

O meu RC2 é o Slave Select e está ligado ao SS do slave (naturalmente :) ).

Do lado do Slave tenho:

Ao iniciar:

Código: [Seleccione]
OpenSPI(SLV_SSON, MODE_00, SMPMID);
No loop:

Código: [Seleccione]
if(DataRdySPI())
{
received = getcSPI();
if(received != '\0')
{
buffer[bufferCurrent]=received;

if(bufferCurrent == 11)
{
... send via usb
}
}
else
{
bufferCurrent++;
}
}
            
            
Gostava de saber se alguém conhece alguma solução para eu me ver livre do diabo dos delays e se existem algumas bibliotecas que me possam ajudar. Esta era supostamente a parte fácil do meu projecto :).
            
« Última modificação: 19 de Outubro de 2009, 22:51 por TigPT »

Offline pedrosal

  • Mini Robot
  • *
  • Mensagens: 7
Re: Ligar dois PIC por SPI
« Responder #1 em: 22 de Outubro de 2009, 21:42 »
Posso ver-me livre dos delays assim:

http://www.microchipc.com/Hi-Tech_C_multitask/