00001 #include <includes.h> 00002 00003 void timer0_isr(void) __irq { 00004 00005 #ifdef DEBUG 00006 if (FIO0PIN & 1<<14) 00007 { 00008 VICIntEnClr = 0xFFFFFFFF; //Disable all interrupts before debugging 00009 VICVectAddr = 0; 00010 return; 00011 } 00012 #endif 00013 00014 T0IR = 0xFFFFFFFF; // Clear ALL Timer0 interrupt flags. 00015 asched_tick(); 00016 VICVectAddr = 0; // Clear interrupt in VIC. 00017 } 00018 00019 00021 void setup_hardware(void){ 00022 00023 //Reset interrupt controller (mostly for proper debugger operation) 00024 VICIntEnable = 0; 00025 VICVectAddr = 0; 00026 VICVectAddr = 0; 00027 VICVectAddr = 0; 00028 VICVectAddr = 0; 00029 VICVectAddr = 0; 00030 00031 /*********************************************************************/ 00032 /* Power control setup - turn on clocks for peripherals in use */ 00033 /*********************************************************************/ 00034 00035 //First check that SPI interrupts are disabled. 00036 S1SPCR = 0; 00037 00038 PCONP = 00039 (1<<1) //Timer0 00040 | (1<<2) //Timer1 00041 | (1<<3) //UART0 00042 | (1<<4) //UART1 00043 | (1<<5) //PWM0 00044 | (1<<12) //ADC internal 00045 | (1<<13) //CAN1 00046 | (1<<14) //CAN2 00047 | (1<<15) //CAN3 00048 | (1<<16) //CAN4 00049 | (1<<21) //SSP 00050 ; 00051 00052 /*********************************************************************/ 00053 /* Timer0 Initialization (except interrupts) */ 00054 /*********************************************************************/ 00055 //initialize Timer0 for 1 ms ticks 00056 00057 T0TCR = 0;//enabled for counting 00058 T0PR = 0;//no prescaling 00059 T0MR0 = (60000-1);//1 mS 00060 T0CTCR = 0;//simple timer 00061 T0MCR = 0x00000003;//interrupt and reset on MR0 00062 T0TCR = 1;//enabled for counting 00063 00064 /********************************************* 00065 * Put user initialization code below here. * 00066 *********************************************/ 00067 00068 00069 /*********************************************** 00070 * Heartbeat Init Section 00071 * Set pin direction to output for driving LEDs 00072 * Set initial LED state 00073 ***********************************************/ 00074 00075 SCS |= 1<<0;//Enable fast gpio on port 0. 00076 SCS |= 1<<1;//Enable fast gpio on port 1. 00077 00078 // Set up MCU LED IO lines 00079 FIO1DIR = 1<<23|1<<24|1<<25; 00080 FIO1SET = 1<<23|1<<24|1<<25; 00081 FIO1CLR = 1<<25; 00082 FIO1SET = 1<<23|1<<24; 00083 00084 /********* End Heartbeat Init Section ************/ 00085 00086 /*********************************************************************/ 00087 /* Timer1 Initialization */ 00088 /*********************************************************************/ 00089 //initialize Timer1 for full-clock (60MHz for now) free-run counting 00090 00091 T1TCR = 0;//counting disabled 00092 T1PR = 0;//no prescaling 00093 T1MR0 = (12000-1);//200 uS 00094 //(intended to allow complete read of receive buffer) 00095 T1CTCR = 0;//simple timer 00096 T1MCR = 0x00000003;//interrupt and reset on MR0 00097 // T1TCR = 1;//enabled for counting 00098 00100 //SSP setup 00101 // PCONP = PCONP & (~(1<<10)) & PCONP_RBM; // power setting: disable SPI1 00102 // PCONP = (PCONP | 1<<21) & PCONP_RBM; // power setting: enable SSP 00103 00104 PINSEL1 &= ~0x3FC; // clear P.017~P0.20; 00105 //Automatic control of slave select 1 (SSEL1) 00106 PINSEL1 |= 0x2A8; // P0.17: SCK1, P0.18: MISO1, P0.19: MOSI1, P0.20: SSEL1 00107 00108 //Manual control of slave select (SSEL) (i.e., via GPIO) 00109 // PINSEL1 |= 0xA8; // P0.17: SCK1, P0.18: MISO1, P0.19: MOSI1, P0.20: GPIO 00110 // FIO0DIR |= 1<<20; //P0.20 is output 00111 // FIO0SET = 1<<20; //Set high 00112 00113 SSPCR0 = 0xCF; // data size: 16 bits 00114 // SPI mode 00115 // CPOL=1: sclk high when idle 00116 // CPHA=1: sample on the first edge (falling edge) 00117 // Serial Clock Rate = 00118 00119 SSPCPSR = 20; // prescale divider - 3 Mbits/sec 00120 00121 00122 SSPCR1 = 0; // disable SSP/SPI1 00123 SSPCR1 = 0; //Master mode, no loopback mode 00124 SSPCR1 = ((SSPCR1 | (1<<1)) & ~(0xF<<4)); // enable SSP/SPI1 00125 00126 // SSPIMSC = 0xF; //Enable all ssp interrupt sources 00127 // SSPIMSC = 1<<3; //enable transmit interrupts only 00128 00129 // ****************************************************** 00130 //UART0 setup 00131 U0FCR = 0x1; // Enable FIFO 00132 U0FCR = 0x87; // Clear FIFOs and set to generate interrupt when RX FIFO reaches 8 bytes. 00133 00134 U0LCR=0x83; //Step 1: DLAB=1, enable baud rate divisor adjustments 00135 //Set to 8 data bits, 1 stop bit, no parity 00136 00137 //Step 2: Set baud rate divisor 00138 U0DLL=25; //Baud rate divisor for 115200 kbaud, with (1+0.3) fractional divider 00139 U0DLM=0; //and peripheral clock = 60MHz. 00140 00141 U0LCR &= ~(1<<7); // Step 3: DLAB=0, disable baud rate adjustments, continue with other setup 00142 00143 U0FDR = 3; // DIVADDVAL = 3 00144 U0FDR |= 10<<4; // MULTVAL = 10 00145 //U0IER_01 = 5; // Enable receive data and receive line status interrupts 00146 00147 //U0ACR = 0; // Autobaud disabled 00148 U0TER = 0x80; // Transmit enable 00149 PINSEL0 |= 1<<0; // UART0 TXD active on MCU pin P0[0] 00150 PINSEL0 &= ~(1<<1); // 00151 PINSEL0 |= 1<<2; // UART0 RXD active on MCU pin P0[1] 00152 PINSEL0 &= ~(1<<3); // 00153 00154 //VICProtection = 0; //Allow modification of VIC registers in user mode 00155 //VICVectAddr3 = (unsigned long)can_ssp_router_uart0_isr; //Set address of interrupt service routine 00156 //VICVectCntl3 = (1<<5) + 6; //Enable vectored interrupt slot 3 and set it to UART0 (interrupt source 6) 00157 // VICIntSelect &= ~(1<<6); //Clear bit 6 - use IRQ interrupts for UART0, not FIQ. 00158 //VICIntEnable = 1<<6; //Enable UART0 interrupt at vectored interrupt controller (VIC) 00159 00160 00161 // ******************************************************************** 00162 //On-board LED initialization 00163 00164 //Set LED lines to GPIO 00165 PINSEL1 &= ~(1<<28); // Set P0[30] to GPIO (default at reset is AIN3) 00166 PINSEL1 &= ~(1<<29); // 00167 00168 FIO0DIR |= 1<<30; // set P0[30] to be output (Green CAN1 LED) 00169 FIO1DIR |= 1<<16; // set P1[16] to be output (Red CAN1 LED) 00170 00171 FIO0DIR |= 1<<2; // set P0[2] to be output (Green CAN2 LED) 00172 FIO0DIR |= 1<<3; // set P0[3] to be output (Red CAN2 LED) 00173 00174 FIO1DIR |= 1<<19; // set P1[19] to be output (Green CAN3 LED) 00175 FIO1DIR |= 1<<18; // set P1[18] to be output (Red CAN3 LED) 00176 00177 FIO0DIR |= 1<<10; // set P0[10] to be output (Green CAN4 LED) 00178 FIO0DIR |= 1<<11; // set P0[11] to be output (Red CAN4 LED) 00179 00180 FIO1DIR |= 1<<23; // set P1[23] to be output (Green MCU LED) 00181 FIO1DIR |= 1<<24; // set P1[24] to be output (Red MCU LED) 00182 FIO1DIR |= 1<<25; // set P1[25] to be output (Blue MCU LED) 00183 00184 FIO0SET = 1<<30; // turn off green CAN1 LED 00185 FIO1SET = 1<<16; // turn off red CAN1 LED 00186 00187 FIO0SET = 1<<2; // turn off green CAN2 LED 00188 FIO0SET = 1<<3; // turn off red CAN2 LED 00189 00190 FIO1SET = 1<<19; // turn off green CAN3 LED 00191 FIO1SET = 1<<18; // turn off red CAN3 LED 00192 00193 FIO0SET = 1<<10; // turn off green CAN4 LED 00194 FIO0SET = 1<<11; // turn off red CAN4 LED 00195 00196 FIO1SET = 1<<23; // turn off green MCU LED 00197 FIO1SET = 1<<24; // turn off red MCU LED 00198 FIO1SET = 1<<25; // turn off blue MCU LED 00199 00200 //CAN 3 and 4 transceiver standby initialization (MAX3051 RS pin) 00201 FIO0DIR |= 1<<8; // set P0[8] to be output (CAN 3 RS) 00202 FIO0DIR |= 1<<9; // set P0[9] to be output (CAN 4 RS) 00203 00204 FIO0CLR |= 1<<8; // turn on CAN3 transceiver (high is standby) 00205 FIO0CLR |= 1<<9; // turn on CAN4 transceiver (high is standby) 00206 00207 //Control lines to LPC3250 module GPI lines - set to output 00208 FIO1DIR |= 1<<17; // set P1[8] to be output (LPC3250 GPI_0) 00209 FIO1DIR |= 1<<20; // set P1[20] to be output (LPC3250 GPI_2) 00210 FIO1DIR |= 1<<21; // set P1[21] to be output (LPC3250 GPI_5) 00211 FIO1DIR |= 1<<22; // set P1[22] to be output (LPC3250 GPI_6) 00212 00213 //Control/interrupt lines from LPC3250 module - set to input or interrupt 00214 FIO0DIR &= ~(1<<15); //Set P0[15] to input 00215 FIO0DIR &= ~(1<<16); //Set P0[16] to input 00216 00217 00218 00219 //Internal ADC pin setup - use AIN0 for battery current, and AIN1 for battery voltage 00220 PINSEL1 |= 1<<22; // AIN0 active on MCU pin P0[27] 00221 PINSEL1 &= ~(1<<23); // 00222 PINSEL1 |= 1<<24; // AIN1 active on MCU pin P0[28] 00223 PINSEL1 &= ~(1<<25); // 00224 00225 00226 00227 // ******************************************************************************* 00228 // CAN1 Initialization 00229 // ******************************************************************************* 00230 // PCONP = (PCONP | 1<<13) & PCONP_RBM; //Turn on CAN1 peripheral clock 00231 00232 PINSEL1 &= ~(3<<18); 00233 PINSEL1 |= 1<<18; // enable CAN controller 1 pin RD1 (TD1 not PINSELable) 00234 00235 C1MOD = 1; 00236 // C1MOD |= (1<<2); //Self-test mode: Transmit always considered successful, even without ACK 00237 // C1CMR = 1<<1; //Abort transmission? Because maybe putting the controller into reset mode isn't enough? 00238 C1CMR = (1<<3)|(1<<2)|(1<<1); 00239 C1GSR = 0; 00240 C1IER = 0; 00241 //C1BTR = 0; // default value for BTR 00242 C1BTR = (0<<23)|(2<<20)|(5<<16)|(1<<14)|(0<<10)|(1<<0); 00243 // C2BTR_bit.BRP = 1; // osc. freq. = 60MHz assume VPB = 60MHz 00244 // C2BTR_bit.SJW = 1; // Synchronization Jump Width 00245 // C2BTR_bit.TSEG1 = 5; // Time Segment1 = 5+1 = 6 00246 // C2BTR_bit.TSEG2 = 2; // Time Segment2 = 2+1 = 3 00247 // C2BTR_bit.SAM = 0; // sample once, baud rate = 6MHz 00248 00249 // default values 00250 C1TFI1 = 0; 00251 C1TFI2 = 0; 00252 C1TFI3 = 0; 00253 C1TID1 = 0; 00254 C1TID2 = 0; 00255 C1TID3 = 0; 00256 C1TDA1 = 0; 00257 C1TDA2 = 0; 00258 C1TDA2 = 0; 00259 C1TDB1 = 0; 00260 C1TDB2 = 0; 00261 C1TDB3 = 0; 00262 00263 // acceptance filter: bypass 00264 AFMR = 1<<1; 00265 00266 // CAN1RS is hardwired to ground on B10A 00267 // if(B2A_OVERRIDE){ 00268 // FIO1DIR|=1<<18;//Enable CAN tranceiver 00269 // FIO1CLR= 1<<18; 00270 // } 00271 00272 C1IER = 1<<0; //Turn on Rx Interrupt 00273 // C1IER |= ((1<<1) | (1<<9)) & 0x07FF; //Turn on Tx 1 and Tx 2 interrupts 00274 C1IER |= ((1<<1)) & 0x07FF; //Turn on Tx 1 interrupts 00275 C1IER |= ((1<<2)|(1<<3)|(1<<5)|(1<<7))&0x7FF; //Turn on CAN error interrupts 00276 // C1IER |= (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7); //Turn on CAN error interrupts 00277 // C1IER |= (1<<6); //Arbitration Lost interrupt 00278 C1GSR = 0; 00279 00280 C1CMR = 0x0E; 00281 C1MOD = 0; 00282 // ******************************************************************************* 00283 // CAN2 Initialization 00284 // ******************************************************************************* 00285 // PCONP = (PCONP | 1<<14) & PCONP_RBM; //Turn on CAN2 peripheral clock 00286 00287 PINSEL1 &= ~(3<<14); 00288 PINSEL1 |= 1<<14; // enable CAN controller 2 pin RD2 00289 PINSEL1 &= ~(3<<16); 00290 PINSEL1 |= 1<<16; // enable CAN controller 2 pin TD2 00291 00292 C2MOD = 1; 00293 // C1MOD |= (1<<2); //Self-test mode: Transmit always considered successful, even without ACK 00294 // C1CMR = 1<<1; //Abort transmission? Because maybe putting the controller into reset mode isn't enough? 00295 C2CMR = (1<<3)|(1<<2)|(1<<1); 00296 C2GSR = 0; 00297 C2IER = 0; 00298 // C1BTR = 0; // default value for BTR 00299 C2BTR = (0<<23)|(2<<20)|(5<<16)|(1<<14)|(0<<10)|(1<<0); 00300 // C2BTR_bit.BRP = 1; // osc. freq. = 60MHz assume VPB = 60MHz 00301 // C2BTR_bit.SJW = 1; // Synchronization Jump Width 00302 // C2BTR_bit.TSEG1 = 5; // Time Segment1 = 5+1 = 6 00303 // C2BTR_bit.TSEG2 = 2; // Time Segment2 = 2+1 = 3 00304 // C2BTR_bit.SAM = 0; // sample once, baud rate = 6MHz 00305 00306 // default values 00307 C2TFI1 = 0; 00308 C2TFI2 = 0; 00309 C2TFI3 = 0; 00310 C2TID1 = 0; 00311 C2TID2 = 0; 00312 C2TID3 = 0; 00313 C2TDA1 = 0; 00314 C2TDA2 = 0; 00315 C2TDA2 = 0; 00316 C2TDB1 = 0; 00317 C2TDB2 = 0; 00318 C2TDB3 = 0; 00319 00320 // C1IER = 1<<0; //Turn on Rx Interrupt 00321 // C1IER |= 1<<1; //Turn on Tx 1 interrupt 00322 // C1GSR = 0;//clear error counters 00323 00324 // acceptance filter: bypass 00325 // AFMR_bit.AccBP=1; 00326 // AFMR_bit.AccOff=0; 00327 AFMR = 1<<1; 00328 00329 // CAN2RS is hardwired to ground on B10A 00330 // if(B2A_OVERRIDE){ 00331 // FIO1DIR|=1<<19;//Enable CAN tranceiver 00332 // FIO1CLR= 1<<19; 00333 // } 00334 00335 C2IER = 1<<0; //Turn on Rx Interrupt 00336 // C2IER |= ((1<<1) | (1<<9)) & 0x07FF; //Turn on Tx 1 and Tx 2 interrupts 00337 C2IER |= ((1<<1)) & 0x07FF; //Turn on Tx 1 interrupts 00338 C2IER |= ((1<<2)|(1<<3)|(1<<5)|(1<<7))&0x7FF; //Turn on CAN error interrupts 00339 // C1IER |= (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7); //Turn on CAN error interrupts 00340 // C1IER |= (1<<6); //Arbitration Lost interrupt 00341 C2GSR = 0; 00342 00343 C2CMR = 0x0E; 00344 C2MOD = 0; 00345 00346 00347 // ******************************************************************************* 00348 // CAN3 Initialization 00349 // ******************************************************************************* 00350 // PCONP = (PCONP | 1<<15) & PCONP_RBM; //Turn on CAN3 peripheral clock 00351 00352 PINSEL1&=~(3<<10); 00353 PINSEL1 |= 2<<10; // enable CAN controller 3 pin RD3 00354 PINSEL1&=~(3<<12); 00355 PINSEL1 |= 1<<12; // enable CAN controller 3 pin TD3 00356 00357 C3MOD = 1; 00358 // C1MOD |= (1<<2); //Self-test mode: Transmit always considered successful, even without ACK 00359 // C1CMR = 1<<1; //Abort transmission? Because maybe putting the controller into reset mode isn't enough? 00360 C3CMR = (1<<3)|(1<<2)|(1<<1); 00361 C3GSR = 0; 00362 C3IER = 0; 00363 //C1BTR = 0; // default value for BTR 00364 C3BTR = (0<<23)|(2<<20)|(5<<16)|(1<<14)|(0<<10)|(1<<0); 00365 // C2BTR_bit.BRP = 1; // osc. freq. = 60MHz assume VPB = 60MHz 00366 // C2BTR_bit.SJW = 1; // Synchronization Jump Width 00367 // C2BTR_bit.TSEG1 = 5; // Time Segment1 = 5+1 = 6 00368 // C2BTR_bit.TSEG2 = 2; // Time Segment2 = 2+1 = 3 00369 // C2BTR_bit.SAM = 0; // sample once, baud rate = 6MHz 00370 00371 // default values 00372 C3TFI1 = 0; 00373 C3TFI2 = 0; 00374 C3TFI3 = 0; 00375 C3TID1 = 0; 00376 C3TID2 = 0; 00377 C3TID3 = 0; 00378 C3TDA1 = 0; 00379 C3TDA2 = 0; 00380 C3TDA2 = 0; 00381 C3TDB1 = 0; 00382 C3TDB2 = 0; 00383 C3TDB3 = 0; 00384 00385 // acceptance filter: bypass 00386 AFMR = 1<<1; 00387 FIO0DIR|=1<<8;//Enable CAN tranceiver 00388 FIO0CLR= 1<<8; 00389 00390 C3IER = 1<<0; //Turn on Rx Interrupt 00391 // C3IER |= ((1<<1) | (1<<9)) & 0x07FF; //Turn on Tx 1 and Tx 2 interrupts 00392 C3IER |= ((1<<1)) & 0x07FF; //Turn on Tx 1 interrupts 00393 C3IER |= ((1<<2)|(1<<3)|(1<<5)|(1<<7))&0x7FF; //Turn on CAN error interrupts 00394 // C1IER |= (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7); //Turn on CAN error interrupts 00395 // C1IER |= (1<<6); //Arbitration Lost interrupt 00396 C3GSR = 0; 00397 00398 C3CMR = 0x0E; 00399 C3MOD = 0; 00400 00401 00402 // ******************************************************************************* 00403 // CAN4 Initialization 00404 // ******************************************************************************* 00405 // PCONP = (PCONP | 1<<16) & PCONP_RBM; //Turn on CAN4 peripheral clock 00406 00407 PINSEL0&=~(3<<24); 00408 PINSEL0 |= 3<<24; // enable CAN controller 4 pin RD4 00409 PINSEL0&=~(3<<26); 00410 PINSEL0 |= 3<<26; // enable CAN controller 4 pin TD4 00411 00412 C4MOD = 1; 00413 // C1MOD |= (1<<2); //Self-test mode: Transmit always considered successful, even without ACK 00414 // C1CMR = 1<<1; //Abort transmission? Because maybe putting the controller into reset mode isn't enough? 00415 C4CMR = (1<<3)|(1<<2)|(1<<1); 00416 C4GSR = 0; //set error counters to zero 00417 C4IER = 0; 00418 // C1BTR = 0; // default value for BTR 00419 C4BTR = (0<<23)|(2<<20)|(5<<16)|(1<<14)|(0<<10)|(1<<0); 00420 // C2BTR_bit.BRP = 1; // osc. freq. = 60MHz assume VPB = 60MHz 00421 // C2BTR_bit.SJW = 1; // Synchronization Jump Width 00422 // C2BTR_bit.TSEG1 = 5; // Time Segment1 = 5+1 = 6 00423 // C2BTR_bit.TSEG2 = 2; // Time Segment2 = 2+1 = 3 00424 // C2BTR_bit.SAM = 0; // sample once, baud rate = 6MHz 00425 00426 // default values 00427 C4TFI1 = 0; 00428 C4TFI2 = 0; 00429 C4TFI3 = 0; 00430 C4TID1 = 0; 00431 C4TID2 = 0; 00432 C4TID3 = 0; 00433 C4TDA1 = 0; 00434 C4TDA2 = 0; 00435 C4TDA2 = 0; 00436 C4TDB1 = 0; 00437 C4TDB2 = 0; 00438 C4TDB3 = 0; 00439 00440 // acceptance filter: bypass 00441 // AFMR_bit.AccBP=1; 00442 // AFMR_bit.AccOff=0; 00443 AFMR = 1<<1; 00444 00445 00446 FIO0DIR|=1<<9;//Enable CAN tranceiver 00447 FIO0CLR= 1<<9; 00448 00449 C4IER = 1<<0; //Turn on Rx Interrupt 00450 // C4IER |= ((1<<1) | (1<<9)) & 0x07FF; //Turn on Tx 1 and Tx 2 interrupts 00451 C4IER |= ((1<<1)) & 0x07FF; //Turn on Tx 1 interrupts 00452 C4IER |= ((1<<2)|(1<<3)|(1<<5)|(1<<7))&0x7FF; //Turn on CAN error interrupts 00453 // C1IER |= (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7); //Turn on CAN error interrupts 00454 // C1IER |= (1<<6); //Arbitration Lost interrupt 00455 C4GSR = 0; 00456 00457 C4CMR = 0x0E; //Abort transmission, release receive buffer, clear data overrun. 00458 C4MOD = 0; //Put CAN controller in normal operating mode 00459 00460 00461 00462 00463 }