我正在编写代码以在 PIC18F2680 微控制器上的中断服务例程中接收 SPI 数据,该微控制器以 40MHz 运行,需要从另一个微控制器接收 2 个字节(16 位)的数据。PIC 只接收数据(被动侦听),不会将任何内容发送回发送者。使用 MISO 和设备上的 SCLK 的两条数据线。在 SPI 通信中没有使用从机选择,并且监听命令不需要 MOSI,只有从机响应。
在设计时我没有意识到 SPI 数据包一次发送 16 位,否则我会使用不同的微控制器。
我想看看是否有办法在 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?
谢谢,
约翰