J'essaie d'envoyer des données à une carte SD à partir d'un PIC18f4580, mais le PIC n'envoie pas ce qu'il devrait être.Problèmes USART de transmission sur un PIC
variables globales liées:
unsigned char TXBuffer[128]; //tx buffer
unsigned char TXCurrentPos = 0x00; //tracks the next byte to be sent
unsigned char TXEndPos = 0x00; //tracks where new data should be put into the array
J'ajoute des données à un tampon en utilisant la fonction suivante:
void addToBuffer(char data){
TXBuffer[TXEndPos] = data;
TXEndPos++;
}
Et mettre les données de la TXBuffer en TXREG avec l'interruption suivante:
else if (PIR1bits.TXIF == 1){
if((TXEndPos - TXCurrentPos) > 0){ // if there is data in the buffer
TXREG = TXBuffer[TXCurrentPos]; // send next byte
TXCurrentPos++; // update to the new position
}
En utilisant un oscilloscope, je peux voir que le PIC envoie 0x98, indépendamment de ce que je mets dans le tampon. En fait, je ne mets jamais 0x98 dans le tampon.
Cependant, si je remplace
TXREG = TXBuffer[TXCurrentPos];
avec
TXREG = 0x55;
ou
TXREG = TXCurrentPos;
puis-je obtenir les résultats escomptés, qui est le PIC enverrez 0x55 à plusieurs reprises, ou le nombre en hausse de 0 respectivement.
Alors, pourquoi le PIC a-t-il du mal à envoyer des données à partir de la matrice, mais à un autre moment, cela va-t-il bien? Je soulignerai que le transfert est géré dans une interruption, parce que j'ai l'impression que c'est la racine de mon problème.
EDIT: Il est un tampon circulaire dans le sens retour à 0 TXEndPos et TXCurrentPos quand ils atteignent 127. je désactive également l'interruption d'émission lorsque TXEndPos - TXCurrentPos == 0, et réactiver lors de l'ajout de données à le tampon. Vraiment, mon code fonctionne complètement comme prévu en ce que si j'ajoute 13 caractères à TXBuffer en main, mon PIC transmettra 13 caractères, puis s'arrêtera. Le problème est qu'ils sont toujours le même (mauvais) caractère - 0x98.
EDIT2: fonctions plus complètes sont ici: http://pastebin.com/MyYz1Qzq
Vous pourriez essayer de poser cette même question sur http://chiphacker.com/, il y a beaucoup d'experts pic là-bas. – SingleNegationElimination
Il est peu probable qu'une carte SD souhaite être contrôlée par un flux série asynchrone généré par un UART. Êtes-vous sûr de ne pas vouloir utiliser SPI à la place? – RBerteig
Il serait probablement plus facile de répondre si vous postez un peu plus du code associé et expliquez un peu plus en détail ce que vous essayez de faire. –