KL25 driver for Tango Control System

Dependencies:   mbed

Committer:
jskl
Date:
Thu Aug 28 07:50:06 2014 +0000
Revision:
2:9fe6f1e273b4
Parent:
0:5d27c333afa6
Fixed bugs in JSON format replies

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jskl 0:5d27c333afa6 1 /* Freescale Semiconductor Inc.
jskl 0:5d27c333afa6 2 * mbed Microcontroller Library
jskl 0:5d27c333afa6 3 * (c) Copyright 2014 ARM Limited.
jskl 0:5d27c333afa6 4 *
jskl 0:5d27c333afa6 5 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
jskl 0:5d27c333afa6 6 * and associated documentation files (the "Software"), to deal in the Software without
jskl 0:5d27c333afa6 7 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
jskl 0:5d27c333afa6 8 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
jskl 0:5d27c333afa6 9 * Software is furnished to do so, subject to the following conditions:
jskl 0:5d27c333afa6 10 *
jskl 0:5d27c333afa6 11 * The above copyright notice and this permission notice shall be included in all copies or
jskl 0:5d27c333afa6 12 * substantial portions of the Software.
jskl 0:5d27c333afa6 13 *
jskl 0:5d27c333afa6 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
jskl 0:5d27c333afa6 15 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
jskl 0:5d27c333afa6 16 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
jskl 0:5d27c333afa6 17 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jskl 0:5d27c333afa6 18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
jskl 0:5d27c333afa6 19 */
jskl 0:5d27c333afa6 20
jskl 0:5d27c333afa6 21 #include "mbed.h"
jskl 0:5d27c333afa6 22 #include "tsi_sensor.h"
jskl 0:5d27c333afa6 23
jskl 0:5d27c333afa6 24 void tsi_irq(void);
jskl 0:5d27c333afa6 25 TSIAnalogSlider *TSIAnalogSlider::_instance;
jskl 0:5d27c333afa6 26
jskl 0:5d27c333afa6 27 TSIAnalogSlider::TSIAnalogSlider(uint32_t elec0, uint32_t elec1,
jskl 0:5d27c333afa6 28 uint32_t range)
jskl 0:5d27c333afa6 29 : _elec0(elec0), _elec1(elec1), _range(range) {
jskl 0:5d27c333afa6 30 _instance = this;
jskl 0:5d27c333afa6 31 _current_elec = &_elec0;
jskl 0:5d27c333afa6 32 SIM->SCGC5 |= SIM_SCGC5_TSI_MASK;
jskl 0:5d27c333afa6 33
jskl 0:5d27c333afa6 34 TSI0->GENCS |= (TSI_GENCS_ESOR_MASK | TSI_GENCS_MODE(0) | TSI_GENCS_REFCHRG(4)
jskl 0:5d27c333afa6 35 | TSI_GENCS_DVOLT(0) | TSI_GENCS_EXTCHRG(7) | TSI_GENCS_PS(4)
jskl 0:5d27c333afa6 36 | TSI_GENCS_NSCN(11) | TSI_GENCS_TSIIEN_MASK | TSI_GENCS_STPE_MASK);
jskl 0:5d27c333afa6 37 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK;
jskl 0:5d27c333afa6 38
jskl 0:5d27c333afa6 39 NVIC_SetVector(TSI0_IRQn, (uint32_t)&tsi_irq);
jskl 0:5d27c333afa6 40 NVIC_EnableIRQ(TSI0_IRQn);
jskl 0:5d27c333afa6 41
jskl 0:5d27c333afa6 42 selfCalibration();
jskl 0:5d27c333afa6 43 }
jskl 0:5d27c333afa6 44
jskl 0:5d27c333afa6 45 static void initBaseline(TSIElectrode& elec)
jskl 0:5d27c333afa6 46 {
jskl 0:5d27c333afa6 47 uint32_t channel0 = elec.getChannel();
jskl 0:5d27c333afa6 48 TSI0->DATA = ((channel0 << TSI_DATA_TSICH_SHIFT) );
jskl 0:5d27c333afa6 49 TSI0->DATA |= TSI_DATA_SWTS_MASK;
jskl 0:5d27c333afa6 50 while(!(TSI0->GENCS & TSI_GENCS_EOSF_MASK));
jskl 0:5d27c333afa6 51 TSI0->GENCS |= TSI_GENCS_EOSF_MASK;
jskl 0:5d27c333afa6 52 elec.setBaseline(TSI0->DATA & TSI_DATA_TSICNT_MASK);
jskl 0:5d27c333afa6 53 }
jskl 0:5d27c333afa6 54
jskl 0:5d27c333afa6 55 void TSIAnalogSlider::selfCalibration(void)
jskl 0:5d27c333afa6 56 {
jskl 0:5d27c333afa6 57 TSI0->GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
jskl 0:5d27c333afa6 58 TSI0->GENCS &= ~TSI_GENCS_TSIEN_MASK; // Disable TSI module
jskl 0:5d27c333afa6 59
jskl 0:5d27c333afa6 60 uint32_t trigger_backup;
jskl 0:5d27c333afa6 61 if(TSI0->GENCS & TSI_GENCS_STM_MASK) { // Back-up TSI Trigger mode from Application
jskl 0:5d27c333afa6 62 trigger_backup = 1;
jskl 0:5d27c333afa6 63 } else {
jskl 0:5d27c333afa6 64 trigger_backup = 0;
jskl 0:5d27c333afa6 65 }
jskl 0:5d27c333afa6 66
jskl 0:5d27c333afa6 67 TSI0->GENCS &= ~TSI_GENCS_STM_MASK; // Use SW trigger
jskl 0:5d27c333afa6 68 TSI0->GENCS &= ~TSI_GENCS_TSIIEN_MASK; // Enable TSI interrupts
jskl 0:5d27c333afa6 69 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK; // Enable TSI module
jskl 0:5d27c333afa6 70
jskl 0:5d27c333afa6 71 initBaseline(_elec0);
jskl 0:5d27c333afa6 72 initBaseline(_elec1);
jskl 0:5d27c333afa6 73
jskl 0:5d27c333afa6 74 TSI0->DATA = ((_elec0.getChannel() << TSI_DATA_TSICH_SHIFT));
jskl 0:5d27c333afa6 75
jskl 0:5d27c333afa6 76 TSI0->GENCS &= ~TSI_GENCS_TSIEN_MASK; // Disable TSI module
jskl 0:5d27c333afa6 77 TSI0->GENCS |= TSI_GENCS_TSIIEN_MASK; // Enale TSI interrupt
jskl 0:5d27c333afa6 78 if (trigger_backup) { // Restore trigger mode
jskl 0:5d27c333afa6 79 TSI0->GENCS |= TSI_GENCS_STM_MASK;
jskl 0:5d27c333afa6 80 } else {
jskl 0:5d27c333afa6 81 TSI0->GENCS &= ~TSI_GENCS_STM_MASK;
jskl 0:5d27c333afa6 82 }
jskl 0:5d27c333afa6 83
jskl 0:5d27c333afa6 84 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK; // Enable TSI module
jskl 0:5d27c333afa6 85 TSI0->DATA |= TSI_DATA_SWTS_MASK;
jskl 0:5d27c333afa6 86 }
jskl 0:5d27c333afa6 87
jskl 0:5d27c333afa6 88
jskl 0:5d27c333afa6 89 void TSIAnalogSlider::sliderRead(void ) {
jskl 0:5d27c333afa6 90 if (_scan_in_progress) {
jskl 0:5d27c333afa6 91 _scan_in_progress = 0;
jskl 0:5d27c333afa6 92 uint32_t delta0 = _elec0.getDelta();
jskl 0:5d27c333afa6 93 uint32_t delta1 = _elec1.getDelta();
jskl 0:5d27c333afa6 94
jskl 0:5d27c333afa6 95 if ((delta0 > _elec0.getThreshold()) || (delta1 > _elec1.getThreshold())) {
jskl 0:5d27c333afa6 96 uint32_t perc_pos0 = (delta0 * 100) / (delta0 + delta1);
jskl 0:5d27c333afa6 97 uint32_t perc_pos1 = (delta1 * 100) / (delta0 + delta1);
jskl 0:5d27c333afa6 98 setSliderPercPosition(0, perc_pos0);
jskl 0:5d27c333afa6 99 setSliderPercPosition(1, perc_pos1);
jskl 0:5d27c333afa6 100 uint32_t dist_pos0 = (perc_pos0 * _range) / 100;
jskl 0:5d27c333afa6 101 uint32_t dist_pos1 = (perc_pos0 * _range) / 100;
jskl 0:5d27c333afa6 102 setSliderDisPosition(0, dist_pos0);
jskl 0:5d27c333afa6 103 setSliderDisPosition(1, dist_pos1);
jskl 0:5d27c333afa6 104
jskl 0:5d27c333afa6 105 setAbsolutePosition(((100 - perc_pos0) + perc_pos1) / 2);
jskl 0:5d27c333afa6 106 setAbsoluteDistance(((_range - dist_pos0) + dist_pos1) / 2);
jskl 0:5d27c333afa6 107 } else {
jskl 0:5d27c333afa6 108 setSliderPercPosition(0, 0);
jskl 0:5d27c333afa6 109 setSliderPercPosition(1, 0);
jskl 0:5d27c333afa6 110 setSliderDisPosition(0, 0);
jskl 0:5d27c333afa6 111 setSliderDisPosition(1, 0);
jskl 0:5d27c333afa6 112 setAbsolutePosition(0);
jskl 0:5d27c333afa6 113 setAbsoluteDistance(0);
jskl 0:5d27c333afa6 114 }
jskl 0:5d27c333afa6 115 }
jskl 0:5d27c333afa6 116 }
jskl 0:5d27c333afa6 117
jskl 0:5d27c333afa6 118 float TSIAnalogSlider::readPercentage() {
jskl 0:5d27c333afa6 119 sliderRead();
jskl 0:5d27c333afa6 120 return (float)getAbsolutePosition() / 100.0;
jskl 0:5d27c333afa6 121 }
jskl 0:5d27c333afa6 122
jskl 0:5d27c333afa6 123 uint32_t TSIAnalogSlider::readDistance() {
jskl 0:5d27c333afa6 124 sliderRead();
jskl 0:5d27c333afa6 125 return getAbsoluteDistance();
jskl 0:5d27c333afa6 126 }
jskl 0:5d27c333afa6 127
jskl 0:5d27c333afa6 128 static void changeElectrode(TSIAnalogSlider *analog_slider)
jskl 0:5d27c333afa6 129 {
jskl 0:5d27c333afa6 130 TSIElectrode* elec = analog_slider->getCurrentElectrode();
jskl 0:5d27c333afa6 131 uint32_t signal = (TSI0->DATA & TSI_DATA_TSICNT_MASK);
jskl 0:5d27c333afa6 132 elec->setSignal(signal);
jskl 0:5d27c333afa6 133
jskl 0:5d27c333afa6 134 TSIElectrode *next_elec = analog_slider->getNextElectrode(elec);
jskl 0:5d27c333afa6 135
jskl 0:5d27c333afa6 136 analog_slider->setCurrentElectrode(next_elec);
jskl 0:5d27c333afa6 137 TSI0->DATA = ((next_elec->getChannel() << TSI_DATA_TSICH_SHIFT) );
jskl 0:5d27c333afa6 138 TSI0->DATA |= TSI_DATA_SWTS_MASK;
jskl 0:5d27c333afa6 139 }
jskl 0:5d27c333afa6 140
jskl 0:5d27c333afa6 141
jskl 0:5d27c333afa6 142 void tsi_irq(void)
jskl 0:5d27c333afa6 143 {
jskl 0:5d27c333afa6 144 TSIAnalogSlider *analog_slider = TSIAnalogSlider::getInstance();
jskl 0:5d27c333afa6 145 analog_slider->setScan(1);
jskl 0:5d27c333afa6 146 TSI0->GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
jskl 0:5d27c333afa6 147 changeElectrode(analog_slider);
jskl 0:5d27c333afa6 148 }