칩 선택이있는 1.53MHz SPI bus에 연결된 두 개의 PIC32MX 마이크로 컨트롤러가 있습니다. 슬레이브 측에서 데이터를 올바르게 전송하는 서비스 루틴을 방해하는 데 문제가 있습니다. 테스트 케이스로서, 나는 주인에게 매 10ms마다 2 바이트 (0x01, 0x00)를 보내야한다. 슬레이브는 마스터가 두 번째 바이트 (더미 0x00)를 보낼 때 0x01 명령 ID를 수신하고 0x02로 응답해야합니다.PIC32에 SPI 슬레이브 ISR을 구현 하시겠습니까?
각 전송은 다음과 같아야합니다. 슬레이브가 비록 방해로 시작 위치를
마스터 슬레이브는
0x01로 0x00으로
× 00는 0x02
난 정말 모르겠어요. airsysTx라는 FIFO 버퍼를 사용하여 다음에 마스터가 요청할 때 데이터를 이동해야 할 필요가 있습니다. 슬레이브는 마스터로부터 0x01을 수신하고 FIFO가있을 때 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
× 00 0x01로
실제로. RX 플래그 또는 슬레이브 선택을 받으면, 데이터 레지스터를 한 번만 쓰는 것이 아니라면, 데이터를 주변에 퍼지 시작하기에는 이미 너무 늦습니다. 마스터가 데이터를 가져 오기로 결정하면 데이터는 이미 SPI 데이터 레지스터에서 사용 가능해야합니다. – Lundin