int touchRead(uint8_t pin) { uint32_t ch; if (pin >= NUM_DIGITAL_PINS) return 0; ch = pin2tsi[pin]; if (ch == 255) return 0; *portConfigRegister(pin) = PORT_PCR_MUX(0); SIM_SCGC5 |= SIM_SCGC5_TSI; #if defined(HAS_KINETIS_TSI) TSI0_GENCS = 0; TSI0_PEN = (1 << ch); TSI0_SCANC = TSI_SCANC_REFCHRG(3) | TSI_SCANC_EXTCHRG(CURRENT); TSI0_GENCS = TSI_GENCS_NSCN(NSCAN) | TSI_GENCS_PS(PRESCALE) | TSI_GENCS_TSIEN | TSI_GENCS_SWTS; delayMicroseconds(10); while (TSI0_GENCS & TSI_GENCS_SCNIP) ; // wait delayMicroseconds(1); return *((volatile uint16_t *)(&TSI0_CNTR1) + ch); #elif defined(HAS_KINETIS_TSI_LITE) TSI0_GENCS = TSI_GENCS_REFCHRG(4) | TSI_GENCS_EXTCHRG(3) | TSI_GENCS_PS(PRESCALE) | TSI_GENCS_NSCN(NSCAN) | TSI_GENCS_TSIEN | TSI_GENCS_EOSF; TSI0_DATA = TSI_DATA_TSICH(ch) | TSI_DATA_SWTS; delayMicroseconds(10); while (TSI0_GENCS & TSI_GENCS_SCNIP) ; // wait delayMicroseconds(1); return TSI0_DATA & 0xFFFF; #endif }
boolean tsi_init(uint8_t pin, uint16_t threshold) { boolean error = false; if ( tsi_pins[pin] == 255) { error = true; return error; } TSI0_THRESHOLD = threshold; TSI0_GENCS |= TSI_GENCS_EOSF; TSI0_GENCS |= ((TSI_GENCS_NSCN(9)) | (TSI_GENCS_PS(2)) | (TSI_GENCS_STPE) | (TSI_GENCS_LPSCNITV(7)) | (TSI_GENCS_TSIIE)); TSI0_SCANC |= ((TSI_SCANC_EXTCHRG(2)) | (TSI_SCANC_REFCHRG(3)) | (TSI_SCANC_AMPSC(1)) | (TSI_SCANC_AMCLKS(0))); TSI0_PEN |= TSI_PEN_LPSP(tsi_pins[pin]); TSI0_GENCS |= TSI_GENCS_TSIEN; //Enables TSI while(!(TSI0_GENCS&TSI_GENCS_EOSF)){}; //Wait for last scan to happen TSI0_GENCS |= TSI_GENCS_OUTRGF; //Clear all pending flags TSI0_GENCS |= TSI_GENCS_EOSF; return false; }