We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi There: I am trying to connect LPC2148 to an external ADC via SPI1 interface. I am using Keil development system and MCB2148 DEVELOPMENT BOARD. I have taken the Keil example and changed for SPI. After I initialize and send CS(SSEL1 PIN 55 on the processor) on the ADC to High I expect to see clock on pin 47, reach my break point in the SPI1_isr(); which I don’t get. Do you see a problem in the set up code? Any suggestion or ideas? Anyone has similar code for guideline? Thank you for your help in advance.
void SPI1_Init(void) {
VICVectAddr0 = (unsigned int) &SPI1_Isr; // Channel0 on Source#11 ... enabled VICVectCntl0 = 0x2B;
IODIR0 |= 0x00100000; // P0.20 defined IOCLR0 = 0x00100000; // LTC2351 = 0 // configure SPI1 pins (except SSEL1) PINSEL1 |= 0x00000028;
// Set up SSP Control Register 0 // CPHA=1, CPOL=0, SPI , 14 BIT DATA, SCR =8 page 186 SSPCR0 = 0x088D;
// Set up SSP Control Register 1 // NORMAL OPERATION, SSP DISABLE,MASTER MODE, SLAVE OUTPUT DISABLE PAGE 187 IN MANUAL SSPCR1 = 0x02;
// Set up SSP clock prescale register. // CPSDVSR = 10, previously SCR = 8, BIT FREQ = 1/6 MHZ= PCLK/(CPSDVSR * (SCR+1). SSPCPSR = 10;
// Set up SSP Intrrupt Mask SET/CLEAR Register // Rec over run accurs, Rec Timeout condition accurs,Rx FIFO NOT EMPTY. SSPIMSC = 0x07;
msg = spiBuf; count = 4; // number of short
// Send dummy write to ger SPI started SSPDR = 0xFA; // sent first byte // Show no data is ready for processing. EXT_ADs_data_Ready_flag =0;
VICIntEnable |= 0x800; // 11th bit is the SPI 1
}
void SPI1_Isr(void) __irq { // READ SSP Status register // Rx FIFO not empty? and no error? if ((SSPSR & 0x1F) == 0x04) { *msg++ = SSPDR; // read data from slave if (--count > 0) // save the data in my SPI array spiBuf[count] = *(msg-1); else { // Take out the SSEL1 (set to LOW) IOCLR0 = 0x00100000;
state = SPI_OK; // transfer completed
// set up message pointer and msg count. msg = spiBuf; count = 4; // number of short
// send resent data for processing EXT_AD_Ch1_Data = spiBuf[0]; EXT_AD_Ch2_Data = spiBuf[1]; EXT_AD_Ch3_Data = spiBuf[2]; EXT_AD_Ch4_Data = spiBuf[3];
// show new data ready. EXT_ADs_data_Ready_flag = 1; } }
else // SPI error { *msg = SSPDR; // dummy read to clear flags state = SPI_ERROR; }
SSPICR = 0x03; // reset interrupt flag VICVectAddr = 0; // reset VIC }
I don't think too many people are interested in reading your code, unless you post it properly formattted. And is the above really all involved code? You don't show all declarations.
Another thing. Avoid magic numbers.
IOCLR0 = 0x00100000
Would be better with
enum { P0_SPI_SLAVE_SELECT = 20, // P0.20 = SPI slave select for ADC }; ... IOCLR0 = 1u << P0_SPI_SLAVE_SELECT;