Bonjour à tous,
Je me lance actuellement sur ma première application mettant en oeuvre une communication par bus SPI avec deux PICs : 24HJ12GP202 et 24HJ12GP01. Ce sont les même à la seule différence du nombre de pattes. Par ailleurs, certains vont me dire... "mais ce ne sont pas des dsPIC!". Non, en effet, mais l'utilisation en est quasiment la même.
Voilà donc ce que je tente de faire mais qui ne marche pas:
Je tente de faire une communication entre eux. Mettant déjà exercé sur la communication RS232 via l'UART de ces PIC, pour vérifier que la communication fonctionne bien , j'utilise le port série de mon ordi pour visualiser les réponses du SPI.
Le GP201 a été déclaré comme maître et le GP202 comme esclave. En gros, le maître envoie toutes les secondes (environ), le code 10 ou le code 120 (choisis de façon hasardeuse). Dès qu'il a envoyer un code, il attend la réponse de l'esclave engendrée par le code qu'il vient de lui envoyer. Ainsi, sur interruption, lorsque l'esclave reçoit 10 il renvoie la valeur d'un compteur qui s'incrémente en partant de 0 à chaque réception de code 10. Lorsqu'il reçoit 120 en envoie la valeur d'un compte à rebour qui se décrémente en partant de 255 à chaque réception de code 120. Ainsi, lorsque le maître envoie le code 10, il reçoit la valeur du compteur qu'il m'envoie ensuite sur le port série de l'ordi suivit d'une virgule. Lorsqu'il envoie le code 120, il reçoit la valeur du compte à rebour qu'il m'envoie ensuite sur le port série de l'ordi suivit d'un retour à la ligne.
Ainsi donc, je dois normalement observer quelque chose comme ça:
0,255
1,254
2,253
3,252
4,251
...
254,1
255,0
0,255
1,254
...
Le truc c'est que ça ne marche pas... peut-être ais-je loupé un truc dans le fonctionnement du SPI...
or, je reçois:
,
,
,
,
,
et quelques fois des trucs bisards...
,
,-
,
¤,
,
,
Pour le maître, je l'ai configuré de la façon suivante:
void InitSPI(void)
{
SPI1STATbits.SPIEN = 0;
SPI1STATbits.SPISIDL = 0;
SPI1STATbits.SPIROV = 0;
SPI1CON1bits.DISSCK = 0;
SPI1CON1bits.DISSDO = 0;
SPI1CON1bits.MODE16 = 0;
SPI1CON1bits.SMP = 0;
SPI1CON1bits.CKE = 0;
SPI1CON1bits.SSEN = 0;
SPI1CON1bits.CKP = 0;
SPI1CON1bits.MSTEN = 1;
SPI1CON1bits.SPRE = 0;
SPI1CON1bits.PPRE = 0;
_SPIEN = 1;
}
voici le main du maître:
int main(void)
{
InitUC();
for (b = 0; b < 256; b++) Tab[b] = b;
while(1)
{
if (i == 250000)
{
while (_SPITBF == 1);
SPI1BUF = 0b00001010;
SPI1STATbits.SPIROV = 0;
while (_SPIRBF != 1);
VarTemp = SPI1BUF;
for (a = 0; a < 256; a++)
{
if (VarTemp == Tab[a]) ReponseSPI = Tab[a];
}
while (_UTXBF == 1);
U1TXREG = ReponseSPI;
while (_UTXBF == 1);
U1TXREG = 0x2C;
}
if (i == 500000)
{
while (_SPITBF == 1);
SPI1BUF = 0b10100000;
SPI1STATbits.SPIROV = 0;
while (_SPIRBF == 0);
VarTemp = SPI1BUF;
for (a = 0; a < 256; a++)
{
if (VarTemp == Tab[a]) ReponseSPI = Tab[a];
}
while (_UTXBF == 1);
U1TXREG = ReponseSPI;
while (_UTXBF == 1);
U1TXREG = 0x0D;
while (_UTXBF == 1);
U1TXREG = 0x0A;
}
i++;
if (i > 500000)
{
i = 0;
}
}
return 1;
}
J'ai configuré l'esclave de la façon suivante :
void InitSPI(void)
{
SPI1STATbits.SPIEN = 0;
SPI1STATbits.SPISIDL = 0;
SPI1CON1bits.DISSCK = 1;
SPI1CON1bits.DISSDO = 0;
SPI1CON1bits.MODE16 = 0;
SPI1CON1bits.SMP = 0;
SPI1CON1bits.CKE = 0;
SPI1CON1bits.SSEN = 0;
SPI1CON1bits.CKP = 0;
SPI1CON1bits.MSTEN = 0;
SPI1CON1bits.SPRE = 0;
SPI1CON1bits.PPRE = 0;
_SPIEN = 1;
_SPI1IE = 1;
}
L'interruption du SPI:
void __attribute__((__interrupt__, no_auto_psv)) _SPI1Interrupt(void)
{
SPI1STATbits.SPIROV = 0;
while (_SPIRBF == 0);
ReceptionSPI = SPI1BUF;
_SPI1IF = 0;
}
Le main de l'esclave:
int main(void)
{
InitUC();
for (i = 0; i < 256; i++) Tab[i] = i;
while(1)
{
if (ReceptionSPI == 10)
{
Counter++;
while (_SPITBF == 1);
SPI1BUF = Tab[Counter];
ReceptionSPI = 0;
}
if (ReceptionSPI == 160)
{
Countdown--;
while(_SPITBF == 1);
SPI1BUF = Tab[Countdown];
ReceptionSPI = 0;
}
}
return 1;
}
Voilà en gros...
Si quelqu'un saurait ce qu'il ne va pas, merci de m'expliquer...
Cordialement
Crepuscule3
-----