Embedded 设置RXIF标志时未调用PIC32 SPI ISR?

Embedded 设置RXIF标志时未调用PIC32 SPI ISR?,embedded,microcontroller,interrupt,pic,spi,Embedded,Microcontroller,Interrupt,Pic,Spi,我在从属模式下使用PIC32MX795F512L SPI3模块。我的主机正在通过SPI线路发送数据,但我的从机的中断服务程序从未被调用。RX中断标志正在从机端的硬件中设置,我可以读取SPI3BUF并获得正确的值,但ISR仍然没有被调用 以下是我的spi初始化代码: void InitSPI3() { int rData; IEC0CLR=0x1c000000;//Disable Rx Tx, Error interrupts SPI3CON = 0; // Stops

我在从属模式下使用PIC32MX795F512L SPI3模块。我的主机正在通过SPI线路发送数据,但我的从机的中断服务程序从未被调用。RX中断标志正在从机端的硬件中设置,我可以读取SPI3BUF并获得正确的值,但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-是否需要修改全局中断掩码以使其正常工作?
2-是否有需要修改的中断级别/优先级掩码?

3-如果您为中断指定了唯一的级别/优先级,某些微型计算机将不允许两个中断共享相同的lev和pri,而某些微型计算机将默认为垃圾或非工作值。

其他一些注意事项:

  • 检查芯片的勘误表。Microchip在PIC中有SPI相关硅问题的历史

  • 请看以下讨论:。它主要针对外围芯片,但是SPIxSTATbits.SPITBE和SPIxSTATbits.SPIRBF讨论可能会给您一些东西


  • 是否有其他中断发生?大多数中断控制器/处理器具有某种全局中断启用/禁用功能。我想你的问题在任何情况下都已经得到了回答。只是补充一句-这可能有问题,也可能没有问题,但有时你需要在旋转掩码位时屏蔽中断(设置IPL),然后在完成后重新启用。