2012-04-20 43 views
4

我在從模式下使用PIC32MX795F512L SPI3模塊。我的主機通過SPI線路發送數據,但從機的中斷服務程序從未被調用。 RX中斷標誌在從機側的硬件中置位,我可以讀取SPI3BUF並獲得正確的值,但ISR仍未被調用。RXIF標誌置位時PIC32 SPI ISR未被調用?

這裏是我的SPI初始化代碼:

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 

我使用的MPLAB X和C32編譯器。我一直在我的頭上撞牆4個小時。

+1

是否發生其他中斷?大多數中斷控制器/處理器具有某種全局中斷啓用/禁用。無論如何,我認爲你的問題已在http://www.microchip.com/forums/m647728-print.aspx上得到解答。 – Clifford 2012-04-20 18:41:49

回答

1

需要檢查的事項:
1 - 是否有一個全局中斷掩碼需要修改以使其工作?
2 - 是否需要修改中斷級別/優先級掩碼?
3 - 您是否給過中斷一個獨特的級別/優先級,有些微指令不允許兩個中斷共享相同的優先級,有些則默認爲垃圾或非工作值。

+0

只是添加 - 它可能也可能不重要,但有時您需要屏蔽中斷(設置IPL),當旋轉屏蔽位時,然後在完成時重新啓用。 – 2012-06-14 15:10:07

0

一些其他的事情來看待它:

  1. 檢查勘誤表,你的芯片。 Microchip在PIC中有與SPI相關的硅問題的歷史。

  2. 看看這個討論:http://www.microchip.com/forums/m573732.aspx。它主要針對外設芯片,但SPIxSTATbits.SPITBE和SPIxSTATbits.SPIRBF討論可能會爲您提供一些幫助。