Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: [lpc2000] Re: SPI Interrupt not firing?

2005-10-12 by Richard Duits

Same experience here. Tried to do the interrupt thing, now I just start 
the SPI transfer, do some other stuff and then poll until the transfer 
is ready. Is there anybody that has used the SPI interrupt successfully???

Richard Duits.


drb5599 wrote:

> I believe you Gary.  I had the same problem.  I have been using the
> MCB2130 (2138) and LPC2131 (my hardware).  I finally gave up on the
> SPI interrupt and now just use polling.  Not very efficient, but in
> my application it is acceptable.
> Strange thing to me was the fact that it is just the SPI interrupt
> that has caused problems.  I have been able to configure and use
> every other interrupt available, no problem.
>
> -Dave
>
>
> --- In lpc2000@yahoogroups.com, "ee_gary" <ee_gary@y...> wrote:
> >
> > --- In lpc2000@yahoogroups.com, Sten <list@n...> wrote:
> > >
> > > ee_gary wrote:
> > > > Long time lurker, first time poster...
> > > >
> > > > I've set the SPIE bit in the Control Register.  I can see the
> SPIF bit
> > > > get set in the Status Register.  However, I do NOT see the SPI
> > > > Interrupt bit get set in the Interrupt Register.  Shouldn't
> this occur
> > > > as soon as the SPIF bit is set, regardless of how the VIC is
> set up?
> > > > I have the VIC set up "correctly", but the ISR never executes
> > > > (presumably because the SPI Interrupt never fires).  I've had
> > > > interrupts working correctly for UART0 and a timer, so I know
> that
> > > > interrupts can work (they just aren't in this occasion).
> > > >
> > > > I can do non-interrupt SPI transmits (i.e. the 1st byte of an
> > > > interrupt-based multibye transfer) so I know the hardware is ok
> (SSEL
> > > > = 1).  I've duplicated this on the MCB2130 and a LPC2214 dev
> board.
> > > >
> > > > Any insight from those that have implemented interrupt based
> SPI is
> > > > appreciated.
> > > >
> > > > Stumped in Seattle...
> > > >
> > >
> > > Please can you send a small portion of source code? It sounds
> > unbelievable.
> > >
> > >   Sten
> > >
> > > --
> > > /************************************************
> > >  Do you need a tiny and efficient real time
> > >  operating system (RTOS) with a preemtive
> > >  multitasking for LPC2000 or AT91SAM7?
> > >
> > >    http://nanortos.net-attack.de/
> > >
> > >  Or some open-source tools and code for LPC2000?
> > >
> > >    http://www.net-attack.de/
> > >
> > > ************************************************/
> > >
> >
> > It'd be my pleasure.  Here's the init function:
> > void spi0Init(void)
> > {
> >   // Set port pins for SPI0
> >   PINSEL0 = (PINSEL0 & ~S0_PINMASK) | S0_PINSEL;
> >
> >   // Set SPI Registers
> >   S0SPCR = 0;           // Clear all bits
> >   S0SPCR |= SPCR_CPHA;  // Data sampled on rising edge
> >   S0SPCR |= SPCR_CPOL;      // SCK active low
> >   S0SPCR |= SPCR_MSTR;      // Master mode
> >
> >   S0SPSR;         // Cleared by a read of this register
> >   S0SPDR;         // Cleared by a read of this register
> >   S0SPCCR = 128;  // 8 is max speed
> >   S0SPINT = 1;    // Cleared by writing a 1 to it
> >
> >   // initialize the interrupt vector
> >   VICIntSelect = 0;  // Select IRQ
> >   VICIntEnable = 0x00000400;
> >   VICVectAddr0 = (unsigned long)spi0ISR;
> >   VICVectCntl0 = 0x0000002A;
> >                                                
>      
> >   // initialize the transmit data queue
> >   spi0_tx_extract_idx = spi0_tx_insert_idx = 0;
> >   spi0_tx_running = 0;
> > }
> >
> > and the transmit function:
> > int spi0Putch(int ch)
> > {
> >   uint16_t temp;
> >   unsigned cpsr;
> >
> >   temp = (spi0_tx_insert_idx + 1) % SPI0_TX_BUFFER_SIZE;
> >
> >   if (temp == spi0_tx_extract_idx)
> >     return -1;                          // no room
> >
> >   cpsr = disableIRQ();                  // disable global interrupts
> >   S0SPCR &= ~SPCR_SPIE;                 // disable TX interrupts
> >   restoreIRQ(cpsr);                     // restore global interrupts
> >
> >   // check if in process of sending data
> >   if (spi0_tx_running){
> >     // add to queue
> >     spi0_tx_buffer[spi0_tx_insert_idx] = (uint8_t)ch;
> >     spi0_tx_insert_idx = temp;
> >   }
> >   else{
> >     // set running flag and write to output register   
> >     spi0_tx_running = 1;
> >     S0SPDR = (uint8_t)ch;
> >   }
> >   cpsr = disableIRQ();                  // disable global interrupts
> >   S0SPCR |= SPCR_SPIE;                  // enable TX interrupts
> >   restoreIRQ(cpsr);                     // restore global interrupts
> >
> >   return (uint8_t)ch;
> > }
> >
> > and finally, the ISR that never fires...
> > void spi0ISR(void)
> > {
> >   // perform proper ISR entry so thumb-interwork works properly
> >   ISR_ENTRY();
> >
> >   // check if more data to send
> >   if (spi0_tx_insert_idx != spi0_tx_extract_idx){
> >     S0SPDR = spi0_tx_buffer[spi0_tx_extract_idx++];
> >     spi0_tx_extract_idx %= SPI0_TX_BUFFER_SIZE;
> >   }
> >   else{ // No more to transmit
> >     S0SPCR &= ~SPCR_SPIE;
> >     spi0_tx_running = 0;
> >   }
> >  
> >   S0SPINT = 1; 
> >   VICVectAddr = 0x00000000;  
> >
> >   ISR_EXIT();
> > }
> >
> > It seems like it should be something simple.  Everything looks okay,
> > but the ISR never fires.
> >
> > Thanks,
> >
> > Gary
> >
>
>
>
>
>
>
> SPONSORED LINKS
> Microprocessor 
> <http://groups.yahoo.com/gads?t=ms&k=Microprocessor&w1=Microprocessor&w2=Microcontrollers&w3=Pic+microcontrollers&w4=8051+microprocessor&c=4&s=93&.sig=tsVC-J9hJ5qyXg0WPR0l6g> 
> 	Microcontrollers 
> <http://groups.yahoo.com/gads?t=ms&k=Microcontrollers&w1=Microprocessor&w2=Microcontrollers&w3=Pic+microcontrollers&w4=8051+microprocessor&c=4&s=93&.sig=DvJVNqC_pqRTm8Xq01nxwg> 
> 	Pic microcontrollers 
> <http://groups.yahoo.com/gads?t=ms&k=Pic+microcontrollers&w1=Microprocessor&w2=Microcontrollers&w3=Pic+microcontrollers&w4=8051+microprocessor&c=4&s=93&.sig=TpkoX4KofDJ7c6LyBvUqVQ> 
>
> 8051 microprocessor 
> <http://groups.yahoo.com/gads?t=ms&k=8051+microprocessor&w1=Microprocessor&w2=Microcontrollers&w3=Pic+microcontrollers&w4=8051+microprocessor&c=4&s=93&.sig=1Ipf1Fjfbd_HVIlekkDP-A> 
>
>
>
> ------------------------------------------------------------------------
> YAHOO! GROUPS LINKS
>
>     *  Visit your group "lpc2000
>       <http://groups.yahoo.com/group/lpc2000>" on the web.
>        
>     *  To unsubscribe from this group, send an email to:
>        lpc2000-unsubscribe@yahoogroups.com
>       <mailto:lpc2000-unsubscribe@yahoogroups.com?subject=Unsubscribe>
>        
>     *  Your use of Yahoo! Groups is subject to the Yahoo! Terms of
>       Service <http://docs.yahoo.com/info/terms/>.
>
>
> ------------------------------------------------------------------------
>

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.