use mbed os

Dependents:   Seeed_Grove_I2C_Touch_Example

Fork of MPR121 by Sam Grove

Committer:
Nate Yonkee
Date:
Thu Jun 29 11:03:25 2017 -0600
Revision:
9:8cb5ce483be3
Parent:
6:b6bb38744edd
Child:
11:ad26c0810f02
autoformat with astyle

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nate Yonkee 9:8cb5ce483be3 1 /**
Nate Yonkee 9:8cb5ce483be3 2 * @file MPR121.cpp
Nate Yonkee 9:8cb5ce483be3 3 * @brief Device driver - MPR121 capactiive touch IC
Nate Yonkee 9:8cb5ce483be3 4 * @author sam grove
Nate Yonkee 9:8cb5ce483be3 5 * @version 1.0
Nate Yonkee 9:8cb5ce483be3 6 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MPR121.pdf
Nate Yonkee 9:8cb5ce483be3 7 *
Nate Yonkee 9:8cb5ce483be3 8 * Copyright (c) 2013
Nate Yonkee 9:8cb5ce483be3 9 *
Nate Yonkee 9:8cb5ce483be3 10 * Licensed under the Apache License, Version 2.0 (the "License");
Nate Yonkee 9:8cb5ce483be3 11 * you may not use this file except in compliance with the License.
Nate Yonkee 9:8cb5ce483be3 12 * You may obtain a copy of the License at
Nate Yonkee 9:8cb5ce483be3 13 *
Nate Yonkee 9:8cb5ce483be3 14 * http://www.apache.org/licenses/LICENSE-2.0
Nate Yonkee 9:8cb5ce483be3 15 *
Nate Yonkee 9:8cb5ce483be3 16 * Unless required by applicable law or agreed to in writing, software
Nate Yonkee 9:8cb5ce483be3 17 * distributed under the License is distributed on an "AS IS" BASIS,
Nate Yonkee 9:8cb5ce483be3 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Nate Yonkee 9:8cb5ce483be3 19 * See the License for the specific language governing permissions and
Nate Yonkee 9:8cb5ce483be3 20 * limitations under the License.
Nate Yonkee 9:8cb5ce483be3 21 */
Nate Yonkee 9:8cb5ce483be3 22
Nate Yonkee 9:8cb5ce483be3 23 #include "MPR121.h"
Nate Yonkee 9:8cb5ce483be3 24 #include "mbed_debug.h"
Nate Yonkee 9:8cb5ce483be3 25
Nate Yonkee 9:8cb5ce483be3 26 #define DEBUG 1
Nate Yonkee 9:8cb5ce483be3 27
Nate Yonkee 9:8cb5ce483be3 28 MPR121::MPR121(I2C &i2c, InterruptIn &pin, MPR121_ADDR i2c_addr)
Nate Yonkee 9:8cb5ce483be3 29 {
Nate Yonkee 9:8cb5ce483be3 30 _i2c = &i2c;
Nate Yonkee 9:8cb5ce483be3 31 _irq = &pin;
Nate Yonkee 9:8cb5ce483be3 32 _i2c_addr = (i2c_addr << 1);
Nate Yonkee 9:8cb5ce483be3 33
Nate Yonkee 9:8cb5ce483be3 34 return;
Nate Yonkee 9:8cb5ce483be3 35 }
Nate Yonkee 9:8cb5ce483be3 36
Nate Yonkee 9:8cb5ce483be3 37 MPR121::MPR121(I2C &i2c, MPR121_ADDR i2c_addr)
Nate Yonkee 9:8cb5ce483be3 38 {
Nate Yonkee 9:8cb5ce483be3 39 _i2c = &i2c;
Nate Yonkee 9:8cb5ce483be3 40 _irq = NULL;
Nate Yonkee 9:8cb5ce483be3 41 _i2c_addr = (i2c_addr << 1);
Nate Yonkee 9:8cb5ce483be3 42
Nate Yonkee 9:8cb5ce483be3 43 return;
Nate Yonkee 9:8cb5ce483be3 44 }
Nate Yonkee 9:8cb5ce483be3 45
Nate Yonkee 9:8cb5ce483be3 46 void MPR121::init(void)
Nate Yonkee 9:8cb5ce483be3 47 {
Nate Yonkee 9:8cb5ce483be3 48 // set the i2c speed
Nate Yonkee 9:8cb5ce483be3 49 _i2c->frequency(400000);
Nate Yonkee 9:8cb5ce483be3 50 // irq is open-collector and active-low
Nate Yonkee 9:8cb5ce483be3 51 if(_irq != NULL) {
Nate Yonkee 9:8cb5ce483be3 52 _irq->mode(PullUp);
Nate Yonkee 9:8cb5ce483be3 53 }
Nate Yonkee 9:8cb5ce483be3 54
Nate Yonkee 9:8cb5ce483be3 55 // setup and registers - start with POR values (must be in stop mode)
Nate Yonkee 9:8cb5ce483be3 56 MPR121::writeRegister(SRST, 0x63); //REG 0x80
Nate Yonkee 9:8cb5ce483be3 57
Nate Yonkee 9:8cb5ce483be3 58 // Baseline Filtering Control Register (changes response sensitivity)
Nate Yonkee 9:8cb5ce483be3 59 // http://cache.freescale.com/files/sensors/doc/app_note/AN3891.pdf
Nate Yonkee 9:8cb5ce483be3 60 MPR121::writeRegister(MHDR, 0x1); //REG 0x2B
Nate Yonkee 9:8cb5ce483be3 61 MPR121::writeRegister(NHDR, 0x1); //REG 0x2C
Nate Yonkee 9:8cb5ce483be3 62 MPR121::writeRegister(NCLR, 0x0); //REG 0x2D
Nate Yonkee 9:8cb5ce483be3 63 MPR121::writeRegister(FDLR, 0x0); //REG 0x2E
Nate Yonkee 9:8cb5ce483be3 64 MPR121::writeRegister(MHDF, 0x1); //REG 0x2F
Nate Yonkee 9:8cb5ce483be3 65 MPR121::writeRegister(NHDF, 0x1); //REG 0x30
Nate Yonkee 9:8cb5ce483be3 66 MPR121::writeRegister(NCLF, 0xFF); //REG 0x31
Nate Yonkee 9:8cb5ce483be3 67 MPR121::writeRegister(FDLF, 0x2); //REG 0x32
Nate Yonkee 9:8cb5ce483be3 68
Nate Yonkee 9:8cb5ce483be3 69 // Touch / Release Threshold
Nate Yonkee 9:8cb5ce483be3 70 // cache.freescale.com/files/sensors/doc/app_note/AN3892.pdf
Nate Yonkee 9:8cb5ce483be3 71 for(int i=0; i<(12*2); i+=2) { // touch
Nate Yonkee 9:8cb5ce483be3 72 MPR121::writeRegister(static_cast<MPR121_REGISTER>(E0TTH+i), 0x20); //REG 0x41...0x58 odd
Nate Yonkee 9:8cb5ce483be3 73 }
Nate Yonkee 9:8cb5ce483be3 74 for(int i=0; i<(12*2); i+=2) { // release
Nate Yonkee 9:8cb5ce483be3 75 MPR121::writeRegister(static_cast<MPR121_REGISTER>(E0RTH+i), 0x10); //REG 0x41...0x58 even
Nate Yonkee 9:8cb5ce483be3 76 }
Nate Yonkee 9:8cb5ce483be3 77
Nate Yonkee 9:8cb5ce483be3 78 // Debounce Register DR=b6...4, DT=b2...0
Nate Yonkee 9:8cb5ce483be3 79 MPR121::writeRegister(DT_DR, 0x11); //REG 0x5B
Nate Yonkee 9:8cb5ce483be3 80
Nate Yonkee 9:8cb5ce483be3 81 // Filter and Global CDC CDT Configuration (sample time, charge current)
Nate Yonkee 9:8cb5ce483be3 82 MPR121::writeRegister(CDC_CONFIG, 0x10); //REG 0x5C default 10
Nate Yonkee 9:8cb5ce483be3 83 MPR121::writeRegister(CDT_CONFIG, 0x20); //REG 0x5D default 24
Nate Yonkee 9:8cb5ce483be3 84
Nate Yonkee 9:8cb5ce483be3 85 // Auto-Configuration Registers
Nate Yonkee 9:8cb5ce483be3 86 // http://cache.freescale.com/files/sensors/doc/app_note/AN3889.pdf
Nate Yonkee 9:8cb5ce483be3 87 MPR121::writeRegister(AUTO_CFG0, 0x33); // REG 0x7B
Nate Yonkee 9:8cb5ce483be3 88 MPR121::writeRegister(AUTO_CFG1, 0x07); // REG 0x7C
Nate Yonkee 9:8cb5ce483be3 89 MPR121::writeRegister(USL, 0xc9); // REG 0x7D((3.3-.07)/3.3) * 256
Nate Yonkee 9:8cb5ce483be3 90 MPR121::writeRegister(LSL, 0x83); // REG 0x7E((3.3-.07)/3.3) * 256 * 0.65f
Nate Yonkee 9:8cb5ce483be3 91 MPR121::writeRegister(TL, 0xb5); // REG 0x7F((3.3-.07)/3.3) * 256 * 0.9f
Nate Yonkee 9:8cb5ce483be3 92 // 255 > USL > TL > LSL > 0
Nate Yonkee 9:8cb5ce483be3 93
Nate Yonkee 9:8cb5ce483be3 94 // Electrode Configuration Register - enable all 12 and start
Nate Yonkee 9:8cb5ce483be3 95 MPR121::writeRegister(ECR, 0x8f);
Nate Yonkee 9:8cb5ce483be3 96
Nate Yonkee 9:8cb5ce483be3 97 return;
Nate Yonkee 9:8cb5ce483be3 98 }
Nate Yonkee 9:8cb5ce483be3 99
Nate Yonkee 9:8cb5ce483be3 100 void MPR121::enable(void)
Nate Yonkee 9:8cb5ce483be3 101 {
Nate Yonkee 9:8cb5ce483be3 102 _button = 0;
Nate Yonkee 9:8cb5ce483be3 103 _button_has_changed = 0;
Nate Yonkee 9:8cb5ce483be3 104 // enable the 12 electrodes - allow disable to put device into
Nate Yonkee 9:8cb5ce483be3 105 // lower current consumption mode
Nate Yonkee 9:8cb5ce483be3 106 MPR121::writeRegister(ECR, 0x8f);
Nate Yonkee 9:8cb5ce483be3 107 // and attach the interrupt handler
Nate Yonkee 9:8cb5ce483be3 108 if(_irq != NULL) {
Nate Yonkee 9:8cb5ce483be3 109 _irq->fall(this, &MPR121::handler);
Nate Yonkee 9:8cb5ce483be3 110 }
Nate Yonkee 9:8cb5ce483be3 111
Nate Yonkee 9:8cb5ce483be3 112 return;
Nate Yonkee 9:8cb5ce483be3 113 }
Nate Yonkee 9:8cb5ce483be3 114
Nate Yonkee 9:8cb5ce483be3 115 void MPR121::disable(void)
Nate Yonkee 9:8cb5ce483be3 116 {
Nate Yonkee 9:8cb5ce483be3 117 // detach the interrupt handler
Nate Yonkee 9:8cb5ce483be3 118 _irq->fall(NULL);
Nate Yonkee 9:8cb5ce483be3 119 _button = 0;
Nate Yonkee 9:8cb5ce483be3 120 _button_has_changed = 0;
Nate Yonkee 9:8cb5ce483be3 121 // put the device in low current consumption mode - dont re-init registers
Nate Yonkee 9:8cb5ce483be3 122 MPR121::writeRegister(ECR, 0x0);
Nate Yonkee 9:8cb5ce483be3 123 MPR121::writeRegister(AUTO_CFG0, 0x0); // REG 0x7B
Nate Yonkee 9:8cb5ce483be3 124 MPR121::writeRegister(AUTO_CFG1, 0x0); // REG 0x7C
Nate Yonkee 9:8cb5ce483be3 125
Nate Yonkee 9:8cb5ce483be3 126 return;
Nate Yonkee 9:8cb5ce483be3 127 }
Nate Yonkee 9:8cb5ce483be3 128
Nate Yonkee 9:8cb5ce483be3 129 uint32_t MPR121::isPressed(void)
Nate Yonkee 9:8cb5ce483be3 130 {
Nate Yonkee 9:8cb5ce483be3 131 return _button_has_changed;
Nate Yonkee 9:8cb5ce483be3 132 }
Nate Yonkee 9:8cb5ce483be3 133
Nate Yonkee 9:8cb5ce483be3 134 uint16_t MPR121::buttonPressed(void)
Nate Yonkee 9:8cb5ce483be3 135 {
Nate Yonkee 9:8cb5ce483be3 136 if(_irq == NULL) {
Nate Yonkee 9:8cb5ce483be3 137 handler();
Nate Yonkee 9:8cb5ce483be3 138 }
Nate Yonkee 9:8cb5ce483be3 139 _button_has_changed = 0;
Nate Yonkee 9:8cb5ce483be3 140 return _button;
Nate Yonkee 9:8cb5ce483be3 141 }
Nate Yonkee 9:8cb5ce483be3 142
Nate Yonkee 9:8cb5ce483be3 143 void MPR121::registerDump(Serial &obj) const
Nate Yonkee 9:8cb5ce483be3 144 {
Nate Yonkee 9:8cb5ce483be3 145 uint8_t reg_val = 0;
Nate Yonkee 9:8cb5ce483be3 146
Nate Yonkee 9:8cb5ce483be3 147 for(int i=0; i<0x80; i++) {
Nate Yonkee 9:8cb5ce483be3 148 reg_val = MPR121::readRegister(static_cast<MPR121_REGISTER>(i));
Nate Yonkee 9:8cb5ce483be3 149 obj.printf("Reg 0x%02x: 0x%02x \n", i, reg_val);
Nate Yonkee 9:8cb5ce483be3 150 }
Nate Yonkee 9:8cb5ce483be3 151
Nate Yonkee 9:8cb5ce483be3 152 return;
Nate Yonkee 9:8cb5ce483be3 153 }
Nate Yonkee 9:8cb5ce483be3 154
Nate Yonkee 9:8cb5ce483be3 155 void MPR121::registerDump(void) const
Nate Yonkee 9:8cb5ce483be3 156 {
Nate Yonkee 9:8cb5ce483be3 157 uint8_t reg_val = 0;
Nate Yonkee 9:8cb5ce483be3 158
Nate Yonkee 9:8cb5ce483be3 159 for(int i=0; i<0x80; i++) {
Nate Yonkee 9:8cb5ce483be3 160 reg_val = MPR121::readRegister(static_cast<MPR121_REGISTER>(i));
Nate Yonkee 9:8cb5ce483be3 161 printf("Reg 0x%02x: 0x%02x \n", i, reg_val);
Nate Yonkee 9:8cb5ce483be3 162 }
Nate Yonkee 9:8cb5ce483be3 163
Nate Yonkee 9:8cb5ce483be3 164 return;
Nate Yonkee 9:8cb5ce483be3 165 }
Nate Yonkee 9:8cb5ce483be3 166
Nate Yonkee 9:8cb5ce483be3 167 void MPR121::handler(void)
Nate Yonkee 9:8cb5ce483be3 168 {
Nate Yonkee 9:8cb5ce483be3 169 uint16_t reg_val = 0, oor_val = 0;
Nate Yonkee 9:8cb5ce483be3 170 // read register 0 and 1
Nate Yonkee 9:8cb5ce483be3 171 reg_val = MPR121::readRegister(ELE0_7_STAT);
Nate Yonkee 9:8cb5ce483be3 172 reg_val |= MPR121::readRegister(ELE8_11_STAT) << 8;
Nate Yonkee 9:8cb5ce483be3 173 // 2 and 3
Nate Yonkee 9:8cb5ce483be3 174 oor_val = MPR121::readRegister(ELE0_7_OOR_STAT);
Nate Yonkee 9:8cb5ce483be3 175 oor_val |= MPR121::readRegister(ELE8_11_OOR_STAT) << 8;
Nate Yonkee 9:8cb5ce483be3 176
Nate Yonkee 9:8cb5ce483be3 177 // debugging stuff and errors - if OOR fails someone was touching the pad during auto-config
Nate Yonkee 9:8cb5ce483be3 178 // Just reboot until they're not doing this
Nate Yonkee 9:8cb5ce483be3 179 if((0 != oor_val) && DEBUG) {
Nate Yonkee 9:8cb5ce483be3 180 debug("MPR121 OOR failure - 0x%04x\n", oor_val);
Nate Yonkee 9:8cb5ce483be3 181 wait(0.1f);
Nate Yonkee 9:8cb5ce483be3 182 NVIC_SystemReset();
Nate Yonkee 9:8cb5ce483be3 183 }
Nate Yonkee 9:8cb5ce483be3 184
Nate Yonkee 9:8cb5ce483be3 185 _button = reg_val;
Nate Yonkee 9:8cb5ce483be3 186 _button_has_changed = 1;
Nate Yonkee 9:8cb5ce483be3 187
Nate Yonkee 9:8cb5ce483be3 188 return;
Nate Yonkee 9:8cb5ce483be3 189 }
Nate Yonkee 9:8cb5ce483be3 190
Nate Yonkee 9:8cb5ce483be3 191 void MPR121::writeRegister(MPR121_REGISTER const reg, uint8_t const data) const
Nate Yonkee 9:8cb5ce483be3 192 {
Nate Yonkee 9:8cb5ce483be3 193 char buf[2] = {reg, data};
Nate Yonkee 9:8cb5ce483be3 194 uint8_t result = 0;
Nate Yonkee 9:8cb5ce483be3 195
Nate Yonkee 9:8cb5ce483be3 196 result = _i2c->write(_i2c_addr, buf, 2);
Nate Yonkee 9:8cb5ce483be3 197 if(result && DEBUG)
Nate Yonkee 9:8cb5ce483be3 198 {
Nate Yonkee 9:8cb5ce483be3 199 debug("I2C write failed\n");
Nate Yonkee 9:8cb5ce483be3 200 }
Nate Yonkee 9:8cb5ce483be3 201
Nate Yonkee 9:8cb5ce483be3 202 return;
Nate Yonkee 9:8cb5ce483be3 203 }
Nate Yonkee 9:8cb5ce483be3 204
Nate Yonkee 9:8cb5ce483be3 205 uint8_t MPR121::readRegister(MPR121_REGISTER const reg) const
Nate Yonkee 9:8cb5ce483be3 206 {
Nate Yonkee 9:8cb5ce483be3 207 char buf[1] = {reg}, data = 0;
Nate Yonkee 9:8cb5ce483be3 208 uint8_t result = 1;
Nate Yonkee 9:8cb5ce483be3 209
Nate Yonkee 9:8cb5ce483be3 210 result &= _i2c->write(_i2c_addr, buf, 1, true);
Nate Yonkee 9:8cb5ce483be3 211 result &= _i2c->read(_i2c_addr, &data, 1);
Nate Yonkee 9:8cb5ce483be3 212
Nate Yonkee 9:8cb5ce483be3 213 if(result && DEBUG)
Nate Yonkee 9:8cb5ce483be3 214 {
Nate Yonkee 9:8cb5ce483be3 215 debug("I2C read failed\n");
Nate Yonkee 9:8cb5ce483be3 216 }
Nate Yonkee 9:8cb5ce483be3 217
Nate Yonkee 9:8cb5ce483be3 218 return data;
Nate Yonkee 9:8cb5ce483be3 219 }