チップ セレクトを備えた 1.53MHz SPI バスで接続された2 つのPIC32MXマイクロコントローラがあります。スレーブ側の割り込みサービス ルーチンでデータを正しく送信するのに問題があります。テスト ケースとして、マスターに 10 ミリ秒ごとに 2 バイト (0x01、0x00) を送信させています。スレーブは 0x01 コマンド ID を受信し、マスターが 2 番目のバイト (ダミーの 0x00) を送信したときに 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