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