Bonjour a tous et surtout toi RISC qui je pense "risc" d'etre de bon conseils ,
Je tente d’établir une communication SPI entre deux microcontroleur PIC32 en utilisant la DMA.
La communication dans le sens Maitre -> Slave est ok .
La communication dans le sens Slave -> maître est ok , juste pour le premier transfert !!! Ensuite et ce pour tous les transferts qui suivent, les réponses reçues par le maître sont toujours décalées de un octet.
Je précise que c'est le maître qui génère le transfert "a la main" ( utilisant la fonction StartTranfert de la bibliothèque périphérique C32 (bit CFORCE) ).
L'esclave est quant à lui en mode automatique : une fois le transfert fait, il attend le prochain train d'impulsion du maître.
Voici la chronologie des évènements visualisé à l'aide de points d’arrêt (placé dans les interruption de transmission du maître et de l'esclave) et d'un scope:
1. Démarrage de l'esclave, il initialise ses channel DMA Rx et Tx .
2. Buffer de 28octet est prêt à être envoyé: Buf[0]=1, Buf[27]=1.
3. Démarrage du maître, il initialise ses channel DMA Rx et Tx .
4. Buffer de 28octet est prêt à être envoyé: Buf[0]=1, Buf[27]=1.
5. INTERRUPTION des deux cartes . Pas de problemes le buffer du maître contient bien : Rxmaster Buf[0]=1, Rxmaster Buf[27]=1.
Observation: au scope comme dans le debugger tout c'est bien déroulé...mais c'était sans compter sur la suite.
6. On relance l'esclave qui vient d'incrémenter les data a envoyer: Tx Slave Buf[0]=2, Tx Slave Buf[27]=2.
7. On relance le maître qui va généré 10ms plus tard un nouveaux transfert.
8. INTERRUPTION des deux cartes . Problème: Rxmaster Buf[0]=1, Rxmaster Buf[27]=2.
9.On relance l'esclave qui vient d'incrémenter les data a envoyer: Tx Slave Buf[0]=3, Tx Slave Buf[27]=3.
10. On relance le maître qui va généré 10ms plus tard un nouveaux transfert.
11. INTERRUPTION des deux cartes . Problème: Rxmaster Buf[0]=2, Rxmaster Buf[27]=3.
Il y a donc bien un problème de décalage à partir du deuxième envoi ...
J'ai vérifier plusieurs fois mes initialisations qui semblent correctes, peut être faut-il jouer avec les registres DCHxSIZ pour "tricher" et éviter ce problème de décalage...
Mais dans ce cas je comprends pas pourquoi le premier transfert ce déroule bien et pas la reste. Si je poste c'est que tout ce que j'ai essayer n'a pas suffit et meme si j'utilise un dummy byte, c'est pas tres propre et ca ne me donne pas la raison du pourquoi du comment...
Merci de m'éclairer de vos lumières !!!
-----