ssp_router2/can_ssp_router_test_project/src/hardware_setup.c

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  }
Generated on Tue Jun 29 16:36:14 2010 by  doxygen 1.6.3