Пример #1
0
void hw_tsi_init(uint_8 chnlID)
{
	//开启TSI时钟
	SIM_SCGC5 |= (SIM_SCGC5_TSI_MASK) | (SIM_SCGC5_PORTA_MASK);
	//通道5使能
	PORTA_PCR4 = PORT_PCR_MUX(0); 
    //配置TSI通用寄存器
	 TSI0_GENCS |= (TSI_GENCS_REFCHRG(4)
				| TSI_GENCS_DVOLT(0)
				| TSI_GENCS_EXTCHRG(6)
				| TSI_GENCS_PS(2)
				| TSI_GENCS_NSCN(11)
				| TSI_GENCS_TSIIEN_MASK
				| TSI_GENCS_STPE_MASK
	);
	 
    TSI0_GENCS &= ~TSI_GENCS_ESOR_MASK;
    TSI0_GENCS &= ~TSI_GENCS_STM_MASK;
	//清越值标志位和扫描完成位
	TSI0_GENCS |= (TSI_GENCS_OUTRGF_MASK) | (TSI_GENCS_EOSF_MASK);
	//选择通道
	TSI0_DATA |= (TSI_DATA_TSICH(chnlID)); 
	//TSI使能
	TSI0_GENCS |= (TSI_GENCS_TSIEN_MASK);
}
Пример #2
0
void TSI0_IRQHandler()
{
    if (TSI0_GENCS & TSI_GENCS_OUTRGF_MASK && isSleeping) {
        TSI0_GENCS |= TSI_GENCS_OUTRGF_MASK | TSI_GENCS_EOSF_MASK;
        outOfRangeInterruptCount++;
    } else {
#if defined(CAPELECTRODE_TIMESTAMPS)
        activeElectrode->timestamp[activeElectrode->bufferWriteIndex] = tpmGetTimeHighPrecision(TPM_TIMER);
#endif
        activeElectrode->buffer[activeElectrode->bufferWriteIndex++] = (TSI0_DATA & TSI_DATA_TSICNT_MASK) / (TSI_SCAN_COUNT * TSI_PRESCALE_DIVISOR);
        TSI0_GENCS |= TSI_GENCS_EOSF_MASK;
        activeElectrode->bufferWriteIndex %= ELECTRODE_BUFFER_SIZE;

        if (!(activeElectrode->flags & ELECTRODE_FLAGS_ACTIVE) && !activeElectrode->bufferWriteIndex) {
            activeElectrode->baseline =
                (activeElectrode->buffer[0] + activeElectrode->buffer[1] + activeElectrode->buffer[2] + activeElectrode->buffer[3]) / 4;
            activeElectrode->flags |= ELECTRODE_FLAGS_ACTIVE;
        }

        activeElectrode++;
        if (electrodeCount == activeElectrode - electrodeList) {
            activeElectrode = electrodeList;
        }
        TSI0_DATA = TSI_DATA_TSICH(activeElectrode->channel) | TSI_DATA_SWTS_MASK;
    }
}
Пример #3
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
}
Пример #4
0
void capElectrodeWake()
{
    capElectrodeInit();
    isSleeping = 0;
    if (activeElectrode) {
        TSI0_DATA = TSI_DATA_TSICH(activeElectrode->channel) | TSI_DATA_SWTS_MASK;
    }
}
Пример #5
0
void capElectrodeWakeableSleep(int electrodeIdx)
{
    Electrode* wakeElectrode = electrodeList + electrodeIdx;

    TSI0_GENCS &= ~TSI_GENCS_TSIEN_MASK;

    isSleeping = 1;
    TSI0_TSHD = TSI_TSHD_THRESL(wakeElectrode->baseline / 2) | TSI_TSHD_THRESH(wakeElectrode->baseline + 5);
    TSI0_DATA = TSI_DATA_TSICH(wakeElectrode->channel);
    TSI0_GENCS = // Fields to clear
        TSI_GENCS_OUTRGF_MASK | TSI_GENCS_EOSF_MASK
            |
            // Fields to set: 16uA ref charge, 8uA ext charge, 0.43V DVolt, 1 scans, enable interrupt & module, enable in low power, hardware trigger
            TSI_GENCS_REFCHRG(5) | TSI_GENCS_DVOLT(2) | TSI_GENCS_EXTCHRG(4) | TSI_GENCS_STPE_MASK |
            TSI_GENCS_PS(1) | TSI_GENCS_NSCN(0) | TSI_GENCS_TSIEN_MASK | TSI_GENCS_TSIIEN_MASK | TSI_GENCS_STM_MASK;
}
Пример #6
0
void capElectrodeSetElectrodes(int count, Electrode* electrodes)
{
    NVIC_DisableIRQ(TSI0_IRQn);

    if (count > 0 && electrodes != NULL) {
        electrodeList = electrodes;
        electrodeCount = count;

        for (int i = 0; i < count; i++) {
            electrodes[i].flags = 0;
            electrodes[i].baseline = 0;
            electrodes[i].bufferWriteIndex = 0;
        }

        activeElectrode = electrodeList;
        NVIC_EnableIRQ(TSI0_IRQn);
        TSI0_DATA = TSI_DATA_TSICH(activeElectrode->channel) | TSI_DATA_SWTS_MASK;
    } else {
        electrodeList = NULL;
        electrodeCount = 0;
    }
}
Пример #7
0
// Initiate a touch scan on the given channel
inline static void scanStart(int channel)
{
   TSI0_DATA = TSI_DATA_TSICH(channel) | TSI_DATA_SWTS_MASK;
}