2012-04-24 2 views
1

칩 선택이있는 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로

답변

1

일반적으로 당신은 당신이 노예로 정확하게 타이밍을 제어 할 수 없기 때문에 당신이 설명하는 방식으로 상호 작용하는 슬레이브 SPI 드라이버를 쓸 수 없습니다. ISR을 생성하는 것은 마스터의 첫 번째 바이트 또는 칩 선택 어설 션의 Rx입니까?

슬레이브는 마스터가 트랜잭션을 시작하기 전에 전송할 데이터 바이트를 설정해야합니다. 대개 첫 번째 바이트에 반응 할 시간이 없습니다. 이것을 수행하는 방법은 두 가지가 있습니다 :

1) 마스터는 1 또는 2 바이트의 쓰기 전용 트랜잭션을 수행하여 슬레이브에게 원하는 것을 알려줍니다. 그런 다음 마스터는 몇 밀리 초 동안 대기하여 슬레이브가 응답을 준비하도록합니다. 그런 다음 master는 읽기 전용 트랜잭션을 수행하여 슬레이브 응답을 수신합니다.

2) DMA 또는 FIFO를 사용하는 경우 마스터는 트랜잭션을 시작하기 전에 첫 번째 패딩 바이트를 fifo에 미리로드합니다. 그런 다음 ISR을 얻으면 남은 응답 데이터를 FIFO에 넣습니다 (플러시 없음). 응답을 형성 할 때 슬레이브 ISR 대기 시간을 수용 할 수있는 충분한 패드 바이트가 있어야합니다. 예를 들어, 응답의 첫 번째 N 바이트가 패드 바이트이고 그 뒤에 응답 데이터가 오는 것을 마스터가 알고있는 곳에 프로토콜을 정의 할 수 있습니다. 패딩 요구 사항은 마스터 클럭 속도 및 슬레이브 CPU 속도/인터럽트 대기 시간에 따라 달라집니다.

+0

실제로. RX 플래그 또는 슬레이브 선택을 받으면, 데이터 레지스터를 한 번만 쓰는 것이 아니라면, 데이터를 주변에 퍼지 시작하기에는 이미 너무 늦습니다. 마스터가 데이터를 가져 오기로 결정하면 데이터는 이미 SPI 데이터 레지스터에서 사용 가능해야합니다. – Lundin