4

PIC32MX795F512LSPI3モジュールをスレーブモードで使用しています。マスターはSPI回線を介してデータを送信していますが、スレーブの割り込みサービスルーチンが呼び出されることはありません。RX割り込みフラグがスレーブ側のハードウェアに設定されており、SPI3BUFを読み取って正しい値を取得できますが、ISRがまだ呼び出されていません。

これが私のspiinitコードです:

void InitSPI3()
{
    int rData;

    IEC0CLR=0x1c000000;//Disable Rx Tx, Error interrupts
    SPI3CON = 0; // Stops and resets the SPI3.
    SPI3BRG = 0;
    rData=SPI3BUF;// clears the receive buffer
    IFS0CLR = 0x1c000000;//Clear interrupt flags
    IPC6CLR=0x0000001f;// clear the priority
    //ipl7, subpri 0
    IPC6bits.SPI3IP = 7;
    IPC6bits.SPI3IS = 0;
    //Enable Rx Tx, Error interrupts
    IEC0bits.SPI3RXIE = 1;
    IEC0bits.SPI3TXIE = 1;
    //IEC0bits.SPI3EIE = 1;

    SPI3CONbits.CKE = 1;
    SPI3CONbits.SSEN = 1;

    SPI3STATbits.SPIROV = 0;// clear the Overflow

    //Enable SPI
    SPI3CONbits.ON = 1;

    //** from now on, the device is ready to receive and transmit data (slave mode)...
}

これが私のISRです

void    __ISR(_SPI_3_VECTOR, ipl7) _SPI3Interrupt()
{
    SET_D2();
    SET_D1();

    // RX INTERRUPT
    if(IFS0bits.SPI3RXIF) // receive data available in SPI3BUF Rx buffer
    {
        SPI_Rx_Interrupt();
    }

    // TX INTERRUPT
    if(IFS0bits.SPI3TXIF) // space available in SPI3BUF Tx buffer
    {
        SPI_Tx_Interrupt();
    }


    IFS0CLR = 0x1c000000; // clear SPI3 interrupts

} // end ISR

私はMPLABXとC32コンパイラを使用しています。私はこれで4時間壁に頭をぶつけてきました。

4

2 に答える 2

1

チェック事項:
1-それを機能させるために変更する必要のあるグローバル割り込みマスクはありますか?
2-変更が必要な割り込みレベル/優先度マスクはありますか?
3-割り込みに一意のレベル/優先度を指定しましたか?一部のマイクロでは、2つの割り込みが同じlev&priを共有できず、一部はデフォルトでジャンク値または機能しない値になります。

于 2012-06-14T11:58:54.553 に答える
0

それを見るための他のいくつかのこと:

  1. チップのエラッタを確認してください。マイクロチップ社には、PICにおけるSPI関連のシリコン問題の歴史があります。

  2. このディスカッションをご覧ください:http://www.microchip.com/forums/m573732.aspx。これは主にペリフェラルチップに向けられていますが、SPIxSTATbits.SPITBEとSPIxSTATbits.SPIRBFの議論はあなたに何かを続けることを与えるかもしれません。

于 2012-06-14T13:23:06.073 に答える