SPI Interrupt service routine problem

Hi,
I am using ARM7 Lpc 2148. For a slave receive function in SPI, i am using ISR to get the data from Master . When i used in polling method i got the data from master, slave can receive all the data.
When using with ISR, the function doesnt get mapped when an interrupt occurs.
Master started txmtng data, I viewed the data in Proteus, SPI debug mode.
The slave receives the data, i checked with the status register in slave ,it got set after receiving a data.
But ISR function doent start after interrupt occurs.
I have configured the VIC for SPI0. I have given the code below, can you please take a look on it and predict where the problem is?.

#include <LPC214X.H>
#include "timer.h"
#include "lcd.h"


void spi_slave_init(void);
int8 spi_read(void);
int8 Loc,data,m = 6;


void SPI_ISR(void)__irq
{
        m = 44;
        S0SPINT = 0x01;
        VICVectAddr=0;

}

int main()
{
        set_clock();
        lcd_init();
        spi_slave_init();

        lcd_command(0xc0);

        while(1)
        {
                if(S0SPINT)
                {
                        S0SPINT=0x01;
                        lcd_command(0x80);
                display_hex(S0SPDR,2);
                }

        if(S0SPSR&0x80)
        {
                lcd_command(0xc1);
                display_String("SPIF Set");
        }
        else
        {
                lcd_command(0xc1);
                display_String("SPIF not set");
        }



        if(S0SPSR&0x40)
        {
                lcd_command(0xc2);
                display_String("WCOL SET");
        }
        else
        {
                lcd_command(0xc2);
                display_String("WCOL NOT SET");
        }


        if(S0SPSR&0x20)
        {
                lcd_command(0xc3);
                display_String("ROVR SET");
        }
        else
        {
                lcd_command(0xc3);
                display_String("ROVR NOT SET");
        }


if(S0SPSR&0x10)
        {
                lcd_command(0xc4);
                display_String("MOde fault set");
        }
        else
        {
                lcd_command(0xc4);
                display_String("MODE FAULT NOT SET");
        }


if(S0SPSR&0x08)
        {
                lcd_command(0xc5);
                lcd_data('ABORT');
        }
        else
        {
                lcd_command(0xc5);
                lcd_data('ABORT not occured');
        }




        if(VICIRQStatus&0x400)
        {
        lcd_data('IRQ Set');
        }

                display_hex(m,2);  // TO check whether 'm' value changed because if data rcvd it will step into ISR, so that m can change from 6 to 44 value. But this is not  working.


        }
}

void spi_slave_init()
{
        PINSEL0|=0x00005500;
        IODIR0|=0xffffffaf;
        IOCLR0|=0xffffffff;
        S0SPCR|=0x0088;
        VICIntEnable = 0x0400;
        VICVectCntl0 = 0x2A ;   //0x20 |0x10; //0x0A
        VICVectAddr0 = ( unsigned int)SPI_ISR;
}

int8 spi_read()
{
        if((S0SPSR & 0x20)) {}
        while(!(S0SPSR & 0x80));
        return S0SPDR;
}

Note :
* SPI Cntrol reg : I have set as Slave, CPHA =1,CPOL =0,8bits reception , and Serial peripheral interrupt enable (SPIE =1 ) .
* SPI status Reg - Checkking for all faults and interrupts .
* VIC : SPI0 enabled, Address for ISR given, Ctl0 provided for priority.
* Checking S0SPINT : When a data rxcvd from master it is getting enabled,but after that i couldnt disable S0SPINT.

Parents
  • "Ctl0 provided for priority."
    That register is not priority.

    Another thing - it's bad practice to enable an interrupt and then after it has been enabled assign the interrupt handler. What if the interrupt is already pending and gets trigged before the address is assigned?

    And why are you mixing interrupt-driven and polling code?

Reply
  • "Ctl0 provided for priority."
    That register is not priority.

    Another thing - it's bad practice to enable an interrupt and then after it has been enabled assign the interrupt handler. What if the interrupt is already pending and gets trigged before the address is assigned?

    And why are you mixing interrupt-driven and polling code?

Children
More questions in this forum