This is a VERY low-level library for controlling the TSI hardware module in a KL25 microcontroller. The programmer creates the TSI object passing basic parameters, and selects the active channels. Then, a scan on a given channel can be started, and the raw result can be read.

Committer:
quevedo
Date:
Fri Sep 26 17:25:06 2014 +0000
Revision:
1:532aa572220b
Parent:
0:b39f4f954a9b
Corrected to activate clock gating on PORTs A, B, and C so all electrodes can work

Who changed what in which revision?

UserRevisionLine numberNew contents of line
quevedo 0:b39f4f954a9b 1 #include "mbed.h"
quevedo 0:b39f4f954a9b 2 #include "TSIHW.h"
quevedo 0:b39f4f954a9b 3
quevedo 0:b39f4f954a9b 4 /* TSI constructor
quevedo 0:b39f4f954a9b 5 Parameters: the values of the fields REFCHRG, EXTCHRG, DVOLT, PS, and NSCN from TSI0_GENCS register
quevedo 0:b39f4f954a9b 6 Not using interrupts, capacitive sensing (non-noise detection), not configured to work in STOP modes
quevedo 0:b39f4f954a9b 7 */
quevedo 0:b39f4f954a9b 8 TSI::TSI(char rchg, char echg, char dvolt, char ps, char nscn) {
quevedo 0:b39f4f954a9b 9 // The first version is preconfigured for non-noise detection, no interrupts, not running on stop modes, software trigger
quevedo 1:532aa572220b 10 SIM->SCGC5 |= 0x00000E20; // clock gate for TSI and PORTS A, B, and C
quevedo 0:b39f4f954a9b 11 TSI0->GENCS = 0xC0000080 | ((rchg & 0x07) << 21) | ((echg & 0x07) << 16) | ((dvolt & 0x03) << 19) | ((ps & 0x07) << 13) | ((nscn & 0x1F) << 8);
quevedo 0:b39f4f954a9b 12 }
quevedo 0:b39f4f954a9b 13
quevedo 0:b39f4f954a9b 14 /* TSI destructor */
quevedo 0:b39f4f954a9b 15 TSI::~TSI() { }
quevedo 0:b39f4f954a9b 16
quevedo 0:b39f4f954a9b 17 /* Function to configure a pin to work with the corresponding channel (passed as the single parameter) */
quevedo 0:b39f4f954a9b 18 void TSI::ActivateChannel(char ch) {
quevedo 0:b39f4f954a9b 19 // reads channel number and sets the MUX of the corresponding pin to ALT0 function
quevedo 0:b39f4f954a9b 20 switch(ch) {
quevedo 0:b39f4f954a9b 21 case 0: PORTB->PCR[0] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 22 case 1: PORTA->PCR[0] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 23 case 2: PORTA->PCR[1] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 24 case 3: PORTA->PCR[2] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 25 case 4: PORTA->PCR[3] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 26 case 5: PORTA->PCR[4] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 27 case 6: PORTB->PCR[1] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 28 case 7: PORTB->PCR[2] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 29 case 8: PORTB->PCR[3] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 30 case 9: PORTB->PCR[16] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 31 case 10: PORTB->PCR[17] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 32 case 11: PORTB->PCR[18] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 33 case 12: PORTB->PCR[19] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 34 case 13: PORTC->PCR[0] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 35 case 14: PORTC->PCR[1] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 36 case 15: PORTC->PCR[2] &= 0xFFFFF8FF; break;
quevedo 0:b39f4f954a9b 37 default: error("PinName provided to TSI::ActivateChannel() does not correspond to any known TSI channel.");
quevedo 0:b39f4f954a9b 38 }
quevedo 0:b39f4f954a9b 39 }
quevedo 0:b39f4f954a9b 40
quevedo 0:b39f4f954a9b 41 // Function to trigger the reading of a given channel
quevedo 0:b39f4f954a9b 42 void TSI::Start(char ch) {
quevedo 0:b39f4f954a9b 43 //writes 1 to the software trigger bit, defining the channel number in the respective bits
quevedo 0:b39f4f954a9b 44 TSI0->GENCS |= 0x00000004; // clears EOSF
quevedo 0:b39f4f954a9b 45 TSI0->DATA = 0x00400000 | (ch << 28);
quevedo 0:b39f4f954a9b 46 }
quevedo 0:b39f4f954a9b 47
quevedo 0:b39f4f954a9b 48 // Function to read scan result; returns zero if not finished
quevedo 0:b39f4f954a9b 49 uint16_t TSI::Read() {
quevedo 0:b39f4f954a9b 50 uint16_t aux;
quevedo 0:b39f4f954a9b 51
quevedo 0:b39f4f954a9b 52 if(!(TSI0->GENCS & 0x00000004)) {
quevedo 0:b39f4f954a9b 53 return 0;
quevedo 0:b39f4f954a9b 54 } else {
quevedo 0:b39f4f954a9b 55 aux = TSI0->DATA & 0x0000FFFF;
quevedo 0:b39f4f954a9b 56 TSI0->GENCS |= 0x00000004; // clears EOSF
quevedo 0:b39f4f954a9b 57 return aux;
quevedo 0:b39f4f954a9b 58 }
quevedo 0:b39f4f954a9b 59 }