2012-04-20 2 views
4

Я использую модуль PIC32MX795F512L SPI3 в режиме ведомого. Мой мастер отправляет данные по линии SPI, но моя служба прерывания прерывания никогда не вызывается. Флаг прерывания RX устанавливается на аппаратном уровне на подчиненной стороне, и я могу читать SPI3BUF и получать правильное значение, но ISR все еще не вызывается.PIC32 SPI ISR не вызывается, когда установлен флаг RXIF?

Вот мой СПИ код инициализации:

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. Я четыре часа стучал головой о стену.

+1

Существуют ли другие прерывания? Большинство контроллеров/процессоров прерываний имеют какое-то глобальное прерывание включения/отключения. Я думаю, что ваш вопрос уже ответил на http://www.microchip.com/forums/m647728-print.aspx в любом случае. – Clifford

ответ

1

Что нужно проверить:
1 - Существует ли глобальная маска прерывания, которую необходимо изменить, чтобы эта работа работала?
2 - Имеется ли предел уровня прерывания/приоритет, который необходимо изменить?
3 - Предоставили ли вы прерывание уникальный уровень/приоритет, некоторые микроны не позволят двум прерываниям использовать один и тот же lev & pri, а некоторые по умолчанию будут использовать нежелательные или неработающие значения.

+0

Просто для добавления - это может быть или не иметь значения, но иногда вам нужно маскировать прерывания (установить IPL) при скрещивании бит маски, а затем снова включить, когда это будет сделано. –

0

Некоторые другие вещи, чтобы посмотреть на него:

  1. Проверьте опечаток для чипа. Microchip имеет историю связанных с SPI проблем кремния в ПОС.

  2. Взгляните на эту дискуссию: http://www.microchip.com/forums/m573732.aspx. В основном это относится к периферийному чипу, но обсуждение SPIxSTATbits.SPITBE и SPIxSTATbits.SPIRBF может дать вам что-то для продолжения.

Смежные вопросы