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.
TSIHW.cpp@1:532aa572220b, 2014-09-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |