Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
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;
}