我在从机模式下使用PIC32MX795F512L SPI3模块。我的主人通过SPI线路发送数据,但我的奴隶的中断服务程序从未被调用。 RX中断标志在从机侧的硬件中设置,我可以读取SPI3BUF并获得正确的值,但ISR仍未被调用。
这是我的spi init代码:
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个小时。
答案 0 :(得分:1)
要检查的事项:
1 - 是否需要修改全局中断掩码以使其工作?
2 - 是否需要修改中断级别/优先级掩码?
3 - 您是否给中断一个唯一的级别/优先级,一些微型不允许两个中断共享相同的lev& pri,有些将默认为垃圾或非工作值。
答案 1 :(得分:0)
要看其他一些事情:
检查芯片的勘误表。 Microchip在PIC中有与SPI相关的硅问题的历史。
看一下这个讨论:http://www.microchip.com/forums/m573732.aspx。它主要针对外围芯片,但SPIxSTATbits.SPITBE和SPIxSTATbits.SPIRBF讨论可能会让你有所作为。