我有两个PIC32MX微控制器,它们通过 1.53MHz SPI 总线与片选连接。我无法让我的从端中断服务程序正确传输数据。作为一个测试用例,我让主机每 10 毫秒发送两个字节(0x01、0x00)。当主机发送第二个字节(虚拟 0x00)时,从机应该接收 0x01 命令 id 并以 0x02 响应。
理想情况下,每次传输都应该是这样的。
主从
0x01 0x00
0x00 0x02
不过,我真的不确定从哪里开始从属中断。我正在使用一个名为 airsysTx 的 fifo 缓冲区来保存下次主机发出请求时需要移出的数据。从机接收到来自主机的 0x01 就好了,并在收到时将 0x02 写入 fifo 缓冲区。我不确定如何对中断进行编码,以便确保正确传输。我下面的代码是一个好的开始,但它是错误的。建议?
/*******************************************************************************
* Interrupt service routine for SPI3 interrupts from Air MCU.
* The user's code at this vector should perform any application specific
* operations and MUST clear the SPI3 interrupt flags before exiting.
******************************************************************************/
void __ISR(_SPI_3_VECTOR, ipl7) _SPI3Interrupt()
{
BYTE MasterCMD;
SET_D1();//Set debug LED
// RX INTERRUPT
if(IFS0bits.SPI3RXIF) // receive data available in SPI3BUF Rx buffer
{
MasterCMD = SPI3BUF;
if(AirCMD == 0x01)
{
airsysTxFlush();
airsysTxWrite(0x02);
}
}
//Transmit data if needed.
if(SPI3STATbits.SPITBE)
{
if(!airsysTxIsEmpty())
{
SPI3BUF = airsysTxRead();
}
else
{
//Else write 0 to the tx buffer to clear the spi shift reg
SPI3BUF = 0x00;
}
}
IFS0bits.SPI3RXIF = 0;
IFS0bits.SPI3TXIF = 0;
IFS0bits.SPI3EIF = 0;
SPI3STATbits.SPIROV = 0;// clear the Overflow
CLEAR_D1();//CLEAR Debug LED
} // end ISR
这段代码实际传输的是这样的:
理想情况下,每次传输都应该是这样的。
主从
0x01 0x02
0x00 0x01