Я пытаюсь отправить данные на SD-карту с PIC18f4580, но PIC не отправляет то, что должно быть.
связанные глобальные переменные:
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
Я добавляю данные в буфер, используя следующую функцию:
void addToBuffer(char data){
TXBuffer[TXEndPos] = data;
TXEndPos++;
}
И помещает данные из TXBuffer в TXREG со следующим прерыванием:
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
}
Используя осциллограф, я вижу, что PIC отправляет 0x98, независимо от того, что я помещаю в буфер. На самом деле я никогда не помещал 0x98 в буфер.
Однако, если я заменю
TXREG = TXBuffer[TXCurrentPos];
с
TXREG = 0x55;
или
TXREG = TXCurrentPos;
затем я получаю ожидаемые результаты, то есть PIC будет отправлять 0x55 несколько раз или считать от 0 соответственно.
Так почему у PIC проблемы с отправкой данных из массива, но в любое другое время это нормально? Подчеркну, что передача обрабатывается в прерывании, потому что я чувствую, что это корень моей проблемы.
РЕДАКТИРОВАТЬ: Это кольцевой буфер в том смысле, что TXEndPos и TXCurrentPos возвращаются к 0, когда они достигают 127.
Я также отключаю прерывание передачи, когда TXEndPos - TXCurrentPos == 0, и повторно включаю его при добавлении данных в буфер. Действительно, мой код работает полностью, как и ожидалось: если я добавлю 13 символов в TXBuffer в основном, мой PIC передаст 13 символов, а затем остановится. Проблема в том, что они всегда одинакового (неправильного) символа - 0x98.
EDIT2: более полные функции здесь: http://pastebin.com/MyYz1Qzq