我正在编写代码以在需要从另一个器件接收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,这应该立即成立(即不等待)。 –