CLASS for automated serial 'chip select' implimentation utilizing mbed LPC1768 Timer2 hardware and it's inturrupt features.

Revision:
0:9fa30f3069ae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SSEL_spi.cpp	Sat Mar 22 18:57:17 2014 +0000
@@ -0,0 +1,52 @@
+/* Class SSEL_spi, Copyright 2014, David T. Mort (http://mbed.org/users/dtmort/)
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+#include "SSEL_spi.h"
+#include "mbed.h"
+
+SSEL_spi::SSEL_spi(uint32_t frame, int mode){
+    //hardwire SPI sclk to p30 so Counter2 can trigger p8 SSEL from serial clock counts
+    //Setup Timer/Counter2 ********************************************************************************
+     LPC_SC->PCONP |=       0x00400000; //Timer/COUNTER2 turn power on bit 22, Table 46
+     LPC_PINCON->PINSEL0 |= 0x00003300; //Timer/COUNTER2: (9:8)CAP2.0 on p30, (13:12)MAT2.0 on p8(SSEL), Table 79
+     switch (mode){
+        case 1:
+        case 2:
+            LPC_TIM2->CTCR= 2;          //increment on falling edge of CAP2.0 input, Table 428
+        break;
+        case 0:
+        case 3:
+            LPC_TIM2->CTCR= 1;          //increment on rising edge of CAP2.0 input, Table 428
+     }
+     LPC_TIM2->MCR  =       3;          //reset TC on match to MR0 (bit 1) & interrupt (bit 0), Table 429
+     LPC_TIM2->EMR  =       48;         //set bits 5:4 for toggle function, clear bit 0 MAT2.0(SSEL), Table 431/432
+     
+     NVIC_EnableIRQ(TIMER2_IRQn);       //this method enables timer2 interrupt at run time
+     
+     LPC_TIM2->TCR  =       3UL;        //1:0 reset TC/PC & enable counter, clear bit 1 to begin counting, Table 427    
+     LPC_TIM2->MR0  =       frame;      //clock bit counter load, see 21.6.7
+     LPC_TIM2->TCR &=      ~2UL;        //clear bit 1 to enable counting
+}
+
+void SSEL_spi::active(bool cs){
+     LPC_TIM2->EMR =        48+cs;      //set or clear bit 0 of MAT2.0(SSEL) pin 8 output, Table 431/432
+}     
+
+    // ISR routine ****************************************************************************************
+extern "C" void TIMER2_IRQHandler (void){
+    if((LPC_TIM2->IR & 0x01)==0x01){    //if MR0 interrupt, proceed, Table 426
+        LPC_TIM2->IR  =      1UL;       //clear MR0 interrupt flag by writing 1, writing 0 has no effect
+        LPC_TIM2->EMR ^=     1UL;       //toggle bit:0 to reset SSEL back to active state, Table 431
+    }
+}