Browse Source

Fix touchRead on K66

main
PaulStoffregen 8 years ago
parent
commit
759ba1b417
2 changed files with 17 additions and 9 deletions
  1. +6
    -2
      teensy3/kinetis.h
  2. +11
    -7
      teensy3/touch.c

+ 6
- 2
teensy3/kinetis.h View File

#define HAS_KINETIS_I2C0 #define HAS_KINETIS_I2C0
#define HAS_KINETIS_LLWU_16CH #define HAS_KINETIS_LLWU_16CH
#define HAS_KINETIS_ADC0 #define HAS_KINETIS_ADC0
#define HAS_KINETIS_TSI


// Teensy 3.1 // Teensy 3.1
#elif defined(__MK20DX256__) #elif defined(__MK20DX256__)
#define HAS_KINETIS_LLWU_16CH #define HAS_KINETIS_LLWU_16CH
#define HAS_KINETIS_ADC0 #define HAS_KINETIS_ADC0
#define HAS_KINETIS_ADC1 #define HAS_KINETIS_ADC1
#define HAS_KINETIS_TSI


// Teensy-LC // Teensy-LC
#elif defined(__MKL26Z64__) #elif defined(__MKL26Z64__)
#define HAS_KINETIS_I2C1_STOPF #define HAS_KINETIS_I2C1_STOPF
#define HAS_KINETIS_LLWU_16CH #define HAS_KINETIS_LLWU_16CH
#define HAS_KINETIS_ADC0 #define HAS_KINETIS_ADC0
#define HAS_KINETIS_TSI_LITE




#elif defined(__MK64FX512__) #elif defined(__MK64FX512__)
#define HAS_KINETIS_MPU #define HAS_KINETIS_MPU
#define HAS_KINETIS_ADC0 #define HAS_KINETIS_ADC0
#define HAS_KINETIS_ADC1 #define HAS_KINETIS_ADC1
#define HAS_KINETIS_TSI_LITE








// Touch sense input (TSI) // Touch sense input (TSI)


#if defined(KINETISK)
#if defined(HAS_KINETIS_TSI)
#define TSI0_GENCS (*(volatile uint32_t *)0x40045000) // General Control and Status Register #define TSI0_GENCS (*(volatile uint32_t *)0x40045000) // General Control and Status Register
#define TSI_GENCS_LPCLKS ((uint32_t)0x10000000) // #define TSI_GENCS_LPCLKS ((uint32_t)0x10000000) //
#define TSI_GENCS_LPSCNITV(n) (((n) & 15) << 24) // #define TSI_GENCS_LPSCNITV(n) (((n) & 15) << 24) //
#define TSI0_CNTR13 (*(volatile uint32_t *)0x40045118) // Counter Register #define TSI0_CNTR13 (*(volatile uint32_t *)0x40045118) // Counter Register
#define TSI0_CNTR15 (*(volatile uint32_t *)0x4004511C) // Counter Register #define TSI0_CNTR15 (*(volatile uint32_t *)0x4004511C) // Counter Register
#define TSI0_THRESHOLD (*(volatile uint32_t *)0x40045120) // Low Power Channel Threshold Register #define TSI0_THRESHOLD (*(volatile uint32_t *)0x40045120) // Low Power Channel Threshold Register
#elif defined(KINETISL)
#elif defined(HAS_KINETIS_TSI_LITE)
#define TSI0_GENCS (*(volatile uint32_t *)0x40045000) // General Control and Status #define TSI0_GENCS (*(volatile uint32_t *)0x40045000) // General Control and Status
#define TSI_GENCS_OUTRGF ((uint32_t)0x80000000) // Out of Range Flag #define TSI_GENCS_OUTRGF ((uint32_t)0x80000000) // Out of Range Flag
#define TSI_GENCS_ESOR ((uint32_t)0x10000000) // End-of-scan or Out-of-Range Interrupt Selection #define TSI_GENCS_ESOR ((uint32_t)0x10000000) // End-of-scan or Out-of-Range Interrupt Selection

+ 11
- 7
teensy3/touch.c View File

#include "core_pins.h" #include "core_pins.h"
//#include "HardwareSerial.h" //#include "HardwareSerial.h"


#if defined(HAS_KINETIS_TSI) || defined(HAS_KINETIS_TSI_LITE)

#if defined(__MK20DX128__) || defined(__MK20DX256__) #if defined(__MK20DX128__) || defined(__MK20DX256__)
// These settings give approx 0.02 pF sensitivity and 1200 pF range // These settings give approx 0.02 pF sensitivity and 1200 pF range
// Lower current, higher number of scans, and higher prescaler // Lower current, higher number of scans, and higher prescaler
}; };


#elif defined(__MK66FX1M0__) #elif defined(__MK66FX1M0__)
#define CURRENT 2
#define NSCAN 9 #define NSCAN 9
#define PRESCALE 2 #define PRESCALE 2
static const uint8_t pin2tsi[] = { static const uint8_t pin2tsi[] = {


int touchRead(uint8_t pin) int touchRead(uint8_t pin)
{ {
#if defined(__MK64FX512__)
return 0; // no Touch sensing :(
#else
uint32_t ch; uint32_t ch;


if (pin >= NUM_DIGITAL_PINS) return 0; if (pin >= NUM_DIGITAL_PINS) return 0;


*portConfigRegister(pin) = PORT_PCR_MUX(0); *portConfigRegister(pin) = PORT_PCR_MUX(0);
SIM_SCGC5 |= SIM_SCGC5_TSI; SIM_SCGC5 |= SIM_SCGC5_TSI;
#if defined(KINETISK)
#if defined(HAS_KINETIS_TSI)
TSI0_GENCS = 0; TSI0_GENCS = 0;
TSI0_PEN = (1 << ch); TSI0_PEN = (1 << ch);
TSI0_SCANC = TSI_SCANC_REFCHRG(3) | TSI_SCANC_EXTCHRG(CURRENT); TSI0_SCANC = TSI_SCANC_REFCHRG(3) | TSI_SCANC_EXTCHRG(CURRENT);
while (TSI0_GENCS & TSI_GENCS_SCNIP) ; // wait while (TSI0_GENCS & TSI_GENCS_SCNIP) ; // wait
delayMicroseconds(1); delayMicroseconds(1);
return *((volatile uint16_t *)(&TSI0_CNTR1) + ch); return *((volatile uint16_t *)(&TSI0_CNTR1) + ch);
#elif defined(KINETISL)
#elif defined(HAS_KINETIS_TSI_LITE)
TSI0_GENCS = TSI_GENCS_REFCHRG(4) | TSI_GENCS_EXTCHRG(3) | TSI_GENCS_PS(PRESCALE) TSI0_GENCS = TSI_GENCS_REFCHRG(4) | TSI_GENCS_EXTCHRG(3) | TSI_GENCS_PS(PRESCALE)
| TSI_GENCS_NSCN(NSCAN) | TSI_GENCS_TSIEN | TSI_GENCS_EOSF; | TSI_GENCS_NSCN(NSCAN) | TSI_GENCS_TSIEN | TSI_GENCS_EOSF;
TSI0_DATA = TSI_DATA_TSICH(ch) | TSI_DATA_SWTS; TSI0_DATA = TSI_DATA_TSICH(ch) | TSI_DATA_SWTS;
delayMicroseconds(1); delayMicroseconds(1);
return TSI0_DATA & 0xFFFF; return TSI0_DATA & 0xFFFF;
#endif #endif
#endif
} }


#else


int touchRead(uint8_t pin)
{
return 0; // no Touch sensing :(
}

#endif





Loading…
Cancel
Save