LPC2148 SPI and SSP behaviour
2006-05-01 by Jan Thogersen
Hi,
It's now my second week in the presence of a Phillips ARM processor and
I must say that it really rock's! However, due to my lack of experience
with this wonder I face some problems getting the thing to obey all my
orders :-)
I really appreciate the effort people are making in this mailing list to
help each other and when I gain some experience I will do my best to
repay my debt!
Playing with the SPI and SSP module left me with a couple of questions...
SPI speed:
I initialized the SPI module and to my surprise the clock was only 7.5
MHz even though the core was running 60MHz. Then I saw in the datasheet
that the SPI module only runs at 1/8 of the core speed. Can that really
be true and why is that? 7.5MHz at max is close to useless in these days.
SSP interrupts:
In my design I have a DAC connected to the SSP module. The DAC needs 24
bits for each conversion. Therefore I need to pull the SS low then send
the 24bits and wait for the SSP modul to enter idle state (Checking the
busy flag) then raise the SS again. Now I want to get this process to
run automatically in interrupts. So I need to get an interrupt when the
SSP is done... But it doesn't seem to be possible, the only flag
available is the timeout flag and that is issued 32 clocks after the
transmission ends. Which leaves me with a bit gab in the transmission.
Is the timeout flag my only friend in this situation?
Interrupt problem:
I got timer vectored interrupts up and running just fine, however the
SSP just won't request any interrupts. Here is a snippet of my code.
Maybe it's very obvious what I'm doing wrong, but I can't see it.
As I said the other interrupts are working just fine, so I really can't
see why the SSP interrupts won't work.
I'm using the CrossWorks compiler.
static void SSP_isr(void) __attribute__ ((interrupt ("IRQ")));
static void SSP_isr(void) {
static uint8 ting;
for(;;);
VICVectAddr = 0;
}
void SSP_Init(void) {
SSPCR0 = (0 << 8) | 0x47; // Set phases and baud rate
SSPCR1 = 0x02; // Enable SSP module
SSPCPSR = 0x02; // Clock Prescale Register
PINSEL1 |= 0x000002A8; // Map the SPI functionality to pins
SSPIMSC = SSPIMSC_RORIM |SSPIMSC_RTIM | SSPIMSC_RXIM | SSPIMSC_TXIM;
// Enable the interrupts
VICIntSelect &= ~0x00000800; // Map SSP to "IRQ"
VICIntEnable = 0x00000800; // Enable the SSP interrupt in the VIC
VICVectCntl2 = 0x0000002B; // Map SSP interrupt to VIC slot 2
VICVectAddr2 = (unsigned int) SSP_isr; // Assign the interrupt handler
}
And one last question... is it possible to shift between the ARM and
thumb mode realtime. Is it possible to make some of my functions in
thumb mode and some in ARM mode? Any pragma to control the mode?
Thanks in advance! Hope that I have made some worthy questions!
Best regards
Jan Thogersen