#include "lpc21xx.h"
#include "types.h"

#define MEMMAP_BOOT_LOADER_MODE   0       // Interrupt vectors are re-mapped to Boot Block.
#define MEMMAP_USER_FLASH_MODE    (1<<0)  // Interrupt vectors are not re-mapped and reside in Flash.
#define MEMMAP_USER_RAM_MODE      (1<<1)  // Interrupt vectors are re-mapped to Static RAM.

#define IO_SPI		0x5500
#define IO_EINT1	0xc0	

// ***********************************************
// local functions
// ***********************************************

void can_isr (void) __attribute__ ((interrupt)); 

// ***********************************************
// MAIN LOOP
// ***********************************************

int main (void)
{
// --- map INT-vector ---

	MEMMAP = MEMMAP_USER_FLASH_MODE;

	PINSEL0 = (IO_SPI | IO_EINT1);		// set spi pins 0.4 to 0.7 and EINT1 pin 0.3
	
// Init Vector Interrupt Controller

	VPBDIV = 0x00;				// --- workaround for EXTINT.1 bug
	EXTMODE = 0x02;				// set mode for EINT1
	VPBDIV = 0x02;				// ---
	VPBDIV = 0x01;				// --- end workaround
	EXTINT = 0x02;				// clear INT flags 

	VICIntSelect = 0x00000000;		// EINT1 is IRQ 
	VICIntEnable = 0x00008000;		// EINT1 is enabled
	VICVectAddr0 = (uint32_t) can_isr; 	// address for EINT1 IRQ service routine
	VICVectCntl0 = 0x20 | 0x0f; 		// EINT1 is enabled with priority 0 

	while (1)	
	{
	}
	return 0; 
}

// END OF MAIN LOOP ******************************

void can_isr (void)
{
	do_something();

// Acknowledge Interrupt

	EXTINT = 0x02;
	VICVectAddr = 0x00;  
}
