我正在尝试从 PIC18f4580 向 SD 卡发送数据,但 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 在达到 127 时返回 0。当 TXEndPos - TXCurrentPos == 0 时,我还禁用发送中断,并在将数据添加到缓冲区时重新启用它。真的,我的代码完全按预期工作,如果我在 main 中向 TXBuffer 添加 13 个字符,我的 PIC 将传输 13 个字符然后停止。问题是它们总是相同的(错误的)字符 - 0x98。
EDIT2:更完整的功能在这里: http: //pastebin.com/MyYz1Qzq