我正在編寫代碼以在需要從另一個器件接收2個字節(16位)數據的PIC18F2680單片機的中斷服務程序中接收SPI數據微控制器。 PIC只接收數據(被動收聽),並且不向發送者返回任何內容。這兩條數據線在設備上使用MISO和SCLK。在SPI通信中沒有使用從機選擇,而MOSI對於收聽命令不是必需的,只有從機響應。我在設計時並沒有意識到SPI數據包一次發送16位,否則我會使用不同的微控制器。PIC18F SPI從器件中斷在4 MHz時接收多個字節問題
我想知道是否有辦法在SPI ISR中讀取兩個連續的字節而不會丟失任何數據。我目前的實現:
OpenSPI(SLV_SSOFF,MODE_00,SMPMID);
//***********************************SPI ISR*********************************
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh() {
unsigned int next;
//the interrupt flag is set for SPI
if(PIR1bits.SSPIF ==1){
spiByte1 = SSPBUF;
while(SSPSTATbits.BF != 0);
spiByte2 = SSPBUF;
}
PIR1bits.SSPIF = 0;
}
但是,這似乎得到了一些正確的數據,但失去了很多其他字節。有沒有更好的方法來完成這個任務,還是我使用8位MCU的SOL?
謝謝
約翰
while循環中的條件不是錯誤的嗎?你不應該等到緩衝區滿了(BF是1)嗎?現在它等待直到BF == 0,這應該立即成立(即不等待)。 –