Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Spi external interrupt code for pic24fj64ga006

Status
Not open for further replies.

user19

Junior Member level 2
Joined
Apr 7, 2017
Messages
22
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
209
Hi,

I am trying to get the external interrupt (using external interrupt 3 ) code to work on my pic24fj64ga006. I can see the pin going low but not triggering the interrupt.

Is enabling the interrupt and setting priority enough for the interrupt to work ?


Please find the attached code

Code:
#include <p24FJ64GA006.h>
#include "p24fxxxx.h"
#include "xc.h"

#ifdef __PIC24FJ64GA006__ //Defined by MPLAB when using 24FJ256GB110 device
 // JTAG/Code Protect/Write Protect/Clip-on Emulation mode
 // Watchdog Timer/ICD pins select
 _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx1) 
 // Disable CLK switch and CLK monitor, OSCO or Fosc/2, HS oscillator,
 // Primary oscillator
 _CONFIG2(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRIPLL)
#endif

// RB6 as SS for SPI slave MCU
#define SPI_SS_TRIS TRISBbits.TRISB6
#define SPI_SS_PORT PORTBbits.RB6

unsigned short spiBufT[]={0x02,0x03,0x0d,0}; 
int Counter = 0;

void InitClock()
{
    CLKDIVbits.RCDIV=0;
    while(OSCCONbits.LOCK != 1) {};
}

void SPI2Init(void)
{
    //config SPI1
    SPI2STATbits.SPIEN = 0; // disable SPI port
    SPI2STATbits.SPISIDL = 0; // Continue module operation in Idle mode
    
    SPI2BUF = 0; // clear SPI buffer
    
    IFS2bits.SPI2IF = 0; // clear interrupt flag
    IEC2bits.SPI2IE = 0; // disable interrupt
    
    SPI2CON1bits.DISSCK = 0; // Internal SPIx clock is enabled
    SPI2CON1bits.DISSDO = 0; // SDOx pin is controlled by the module
    SPI2CON1bits.MODE16 = 0; // set in 16-bit mode, clear in 8-bit mode
    SPI2CON1bits.SMP = 0; // Input data sampled at middle of data output time
    SPI2CON1bits.CKP = 0; // CKP and CKE is subject to change ...
    SPI2CON1bits.CKE = 0; // ... based on your communication mode.
    SPI2CON1bits.MSTEN = 1; // 1 = Master mode; 0 = Slave mode
    SPI2CON1bits.SPRE = 4; // Secondary Prescaler = 4:1
    SPI2CON1bits.PPRE = 2; // Primary Prescaler = 4:1
 
    SPI2CON2 = 0; // non-framed mode
    
    SPI_SS_PORT = 1; // ALL SPI_SS_PORT PINS ARE CLEARED
    SPI_SS_TRIS = 0; // set SS as output -RB6
 
    SPI2STATbits.SPIEN = 1; // enable SPI port, clear status
}

unsigned short writeSPI2( unsigned short data )
{
    
    SPI2BUF = data; 
    while(!SPI2STATbits.SPIRBF); // wait for transfer to complete
    return SPI2BUF; // read the received value
}

int main (void)
{
    
 unsigned short i;
 InitClock();
  
 SPI2Init();
 SPI_SS_PORT = 0;
    
     
    //Enable interrupts...
            
    
    //INTCON1bits.NSTDIS = 1; // Disable nested interrupts
    INTCON2bits.INT3EP = 1; // Interrupt on positive edge of External Interrupt 3
    IPC13bits.INT3IP = 001; // Priority level
    //IFS3bits.INT3IF = 1; // Interrupt req flag status 
    IEC3bits.INT3IE = 1; // Enable interrupt
    
        
    while(1)
    {
        
    }
    
    SPI_SS_PORT = 1;
 return 0;
}

void __attribute__((__interrupt__, no_auto_psv)) _INT3Interrupt(void)
{
    //clear interrupt flag
    IFS3bits.INT3IF = 0; 
    int i;
    // SPI Read...
    Counter++;
    
}


Thanks & Regards
 

I think you also need to enable the spi interrupt with IEC3bits.SPI1IE=1.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top