Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Seeed_Grove_I2C_Touch_Example
Fork of MPR121 by
Revision 25:534ca7bbccf1, committed 2017-07-02
- Comitter:
- Nathan Yonkee
- Date:
- Sun Jul 02 16:33:37 2017 -0600
- Parent:
- 24:3fda4fe39ac6
- Commit message:
- remove everything we can't use with seeed version
Changed in this revision
| MPR121.cpp | Show annotated file Show diff for this revision Revisions of this file |
| MPR121.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/MPR121.cpp Sun Jul 02 15:11:10 2017 -0600
+++ b/MPR121.cpp Sun Jul 02 16:33:37 2017 -0600
@@ -25,221 +25,27 @@
#define DEBUG 1
-MPR121::MPR121(I2C &i2c, InterruptIn &pin, MPR121_ADDR i2c_addr)
-{
- _i2c = &i2c;
- _irq = &pin;
- _i2c_addr = (i2c_addr << 1);
-
- return;
-}
-
-MPR121::MPR121(I2C &i2c)
-{
+MPR121::MPR121(I2C &i2c) {
_i2c = &i2c;
- _irq = NULL;
_i2c_addr = (0x1b << 1);
- char reg[1] = { 0x03 };
- int result=0;
- char data = 10;
- result = _i2c->write(_i2c_addr, reg, 1, true);
- if(result == 0 ) debug("result is 0");
- result = _i2c->read(_i2c_addr, &data, 1);
- if(result == 0 ) debug("result is 0");
-
- return;
}
-void MPR121::init(void)
-{
- // set the i2c speed
- /* _i2c->frequency(400000);
- */
- // irq is open-collector and active-low
- if(_irq != NULL) {
- _irq->mode(PullUp);
- }
- // setup and registers - start with POR values (must be in stop mode)
- MPR121::writeRegister(SRST, 0x63); //REG 0x80
-
- // Baseline Filtering Control Register (changes response sensitivity)
- // http://cache.freescale.com/files/sensors/doc/app_note/AN3891.pdf
- MPR121::writeRegister(MHDR, 0x1); //REG 0x2B
- MPR121::writeRegister(NHDR, 0x1); //REG 0x2C
- MPR121::writeRegister(NCLR, 0x0); //REG 0x2D
- MPR121::writeRegister(FDLR, 0x0); //REG 0x2E
- MPR121::writeRegister(MHDF, 0x1); //REG 0x2F
- MPR121::writeRegister(NHDF, 0x1); //REG 0x30
- MPR121::writeRegister(NCLF, 0xFF); //REG 0x31
- MPR121::writeRegister(FDLF, 0x2); //REG 0x32
-
- // Touch / Release Threshold
- // cache.freescale.com/files/sensors/doc/app_note/AN3892.pdf
- for(int i=0; i<(12*2); i+=2) { // touch
- MPR121::writeRegister(static_cast<MPR121_REGISTER>(E0TTH+i), 0x20); //REG 0x41...0x58 odd
- }
- for(int i=0; i<(12*2); i+=2) { // release
- MPR121::writeRegister(static_cast<MPR121_REGISTER>(E0RTH+i), 0x10); //REG 0x41...0x58 even
- }
-
- // Debounce Register DR=b6...4, DT=b2...0
- MPR121::writeRegister(DT_DR, 0x11); //REG 0x5B
-
- // Filter and Global CDC CDT Configuration (sample time, charge current)
- MPR121::writeRegister(CDC_CONFIG, 0x10); //REG 0x5C default 10
- MPR121::writeRegister(CDT_CONFIG, 0x20); //REG 0x5D default 24
-
- // Auto-Configuration Registers
- // http://cache.freescale.com/files/sensors/doc/app_note/AN3889.pdf
- MPR121::writeRegister(AUTO_CFG0, 0x33); // REG 0x7B
- MPR121::writeRegister(AUTO_CFG1, 0x07); // REG 0x7C
- MPR121::writeRegister(USL, 0xc9); // REG 0x7D((3.3-.07)/3.3) * 256
- MPR121::writeRegister(LSL, 0x83); // REG 0x7E((3.3-.07)/3.3) * 256 * 0.65f
- MPR121::writeRegister(TL, 0xb5); // REG 0x7F((3.3-.07)/3.3) * 256 * 0.9f
- // 255 > USL > TL > LSL > 0
-
- // Electrode Configuration Register - enable all 12 and start
- MPR121::writeRegister(ECR, 0x8f);
-
- return;
+bool MPR121::isPressed(void) {
+ bool result = buttonPressed() == 0 ? false : true;
+ return result;
}
-void MPR121::enable(void)
-{
- _button = 0;
- _button_has_changed = 0;
- // enable the 12 electrodes - allow disable to put device into
- // lower current consumption mode
- MPR121::writeRegister(ECR, 0x8f);
- // and attach the interrupt handler
- if(_irq != NULL) {
- _irq->fall(this, &MPR121::handler);
- }
-
- return;
-}
-
-void MPR121::disable(void)
-{
- // detach the interrupt handler
- _irq->fall(NULL);
- _button = 0;
- _button_has_changed = 0;
- // put the device in low current consumption mode - dont re-init registers
- MPR121::writeRegister(ECR, 0x0);
- MPR121::writeRegister(AUTO_CFG0, 0x0); // REG 0x7B
- MPR121::writeRegister(AUTO_CFG1, 0x0); // REG 0x7C
-
- return;
-}
-
-uint32_t MPR121::isPressed(void)
-{
-
+uint16_t MPR121::buttonPressed(void) {
char reg[1] = { 0x03 };
int result=0;
char data = -1;
result = _i2c->write(_i2c_addr, reg, 1, true);
- if(result == 0 ) debug("result is 0");
- result = _i2c->read(_i2c_addr, &data, 1);
- if(result == 0 ) debug("result is 0");
- if(data > 0) data = true;
- return data;
- /* return _button_has_changed;
- */
-}
-
-uint16_t MPR121::buttonPressed(void)
-{
- char reg[1] = { 0x03 };
- int result=0;
- char data = -1;
- result = _i2c->write(_i2c_addr, reg, 1, true);
- if(result == 0 ) debug("result is 0");
- result = _i2c->read(_i2c_addr, &data, 1);
- if(result == 0 ) debug("result is 0");
+ if(result == 0 ) debug("result is 0");
+ result = _i2c->read(_i2c_addr, &data, 1);
+ if(result == 0 ) debug("result is 0");
if(data == 4) data = 3;
if(data == 2) data = 2;
if(data == 1) data = 1;
return data;
}
-
-void MPR121::registerDump(Serial &obj) const
-{
- uint8_t reg_val = 0;
-
- for(int i=0; i<0x80; i++) {
- reg_val = MPR121::readRegister(static_cast<MPR121_REGISTER>(i));
- obj.printf("Reg 0x%02x: 0x%02x \n", i, reg_val);
- }
-
- return;
-}
-
-void MPR121::registerDump(void) const
-{
- uint8_t reg_val = 0;
-
- for(int i=0; i<0x80; i++) {
- reg_val = MPR121::readRegister(static_cast<MPR121_REGISTER>(i));
- printf("Reg 0x%02x: 0x%02x \n", i, reg_val);
- }
-
- return;
-}
-
-void MPR121::handler(void)
-{
- uint16_t reg_val = 0, oor_val = 0;
- // read register 0 and 1
- reg_val = MPR121::readRegister(ELE0_7_STAT);
- reg_val |= MPR121::readRegister(ELE8_11_STAT) << 8;
- // 2 and 3
- oor_val = MPR121::readRegister(ELE0_7_OOR_STAT);
- oor_val |= MPR121::readRegister(ELE8_11_OOR_STAT) << 8;
-
- // debugging stuff and errors - if OOR fails someone was touching the pad during auto-config
- // Just reboot until they're not doing this
- if((0 != oor_val) && DEBUG) {
- debug("MPR121 OOR failure - 0x%04x\n", oor_val);
- wait(0.1f);
- NVIC_SystemReset();
- }
-
- _button = reg_val;
- _button_has_changed = 1;
-
- return;
-}
-
-void MPR121::writeRegister(MPR121_REGISTER const reg, uint8_t const data) const
-{
- char buf[2] = {reg, data};
- uint8_t result = 0;
-
- result = _i2c->write(_i2c_addr, buf, 2);
- if(result && DEBUG)
- {
- debug("I2C write failed\n");
- }
-
- return;
-}
-
-uint8_t MPR121::readRegister(MPR121_REGISTER const reg) const
-{
- char buf[1] = {reg}, data = 0;
- uint8_t result = 1;
-
- result &= _i2c->write(_i2c_addr, buf, 1, true);
- result &= _i2c->read(_i2c_addr, &data, 1);
-
- if(result && DEBUG)
- {
- debug("I2C read failed\n");
- }
-
- return data;
-}
-
--- a/MPR121.h Sun Jul 02 15:11:10 2017 -0600
+++ b/MPR121.h Sun Jul 02 16:33:37 2017 -0600
@@ -78,129 +78,27 @@
private:
I2C *_i2c;
- InterruptIn *_irq;
uint8_t _i2c_addr;
- volatile uint16_t _button;
- volatile uint32_t _button_has_changed;
-
- /** The interrupt handler for the IRQ pin
- */
- void handler(void);
public:
- /**
- * @enum MPR121_ADDR
- * @brief Possible terminations for the ADDR pin
- */
- enum MPR121_ADDR
- {
- ADDR_VSS = 0x1B, /*!< ADDR connected to VSS */
- ADDR_VDD, /*!< ADDR connected to VDD */
- ADDR_SCL, /*!< ADDR connected to SDA */
- ADDR_SDA /*!< ADDR connected to SCL */
- };
-
- /**
- * @enum MPR121_REGISTER
- * @brief The device register map
- */
- enum MPR121_REGISTER
- {
- ELE0_7_STAT = 0x00,
- ELE8_11_STAT, ELE0_7_OOR_STAT, ELE8_11_OOR_STAT, EFD0LB, EFD0HB,
- EFD1LB, EFD1HB, EFD2LB, EFD2HB, EFD3LB, EFD3HB, EFD4LB, EFD4HB, EFD5LB, EFD5HB,
-
- EFD6LB = 0x10,
- EFD6HB, EFD7LB, EFD7HB, EFD8LB, EFD8HB, EFD9LB, EFD9HB, EFD10LB,
- EFD10HB, EFD11LB, EFD11HB, EFDPROXLB, EFDPROXHB, E0BV, E1BV,
-
- E2BV = 0x20,
- E3BV, E4BV, E5BV, E6BV, E7BV, E8BV, E9BV, E10BV, E11BV, EPROXBV,
- MHDR, NHDR, NCLR, FDLR, MHDF,
-
- NHDF = 0x30,
- NCLF, FDLF, NHDT, NCLT, FDLT, MHDPROXR, NHDPROXR, NCLPROXR,
- FDLPROXR, MHDPROXF, NHDPROXF, NCLPROXF, FDLPROXF, NHDPROXT, NCLPROXT,
-
- FDLPROXT = 0x40,
- E0TTH, E0RTH, E1TTH, E1RTH, E2TTH, E2RTH, E3TTH, E3RTH,
- E4TTH, E4RTH, E5TTH, E5RTH, E6TTH, E6RTH, E7TTH,
-
- E7RTH = 0x50,
- E8TTH, E8RTH, E9TTH, E9RTH, E10TTH, E10RTH, E11TTH, E11RTH,
- EPROXTTH, EPROXRTH, DT_DR, CDC_CONFIG, CDT_CONFIG, ECR, CDC0,
-
- CDC1 = 0x60,
- CDC2, CDC3, CDC4, CDC5, CDC6, CDC7, CDC8, CDC9, CDC10, CDC11, CDCPROX, CDT0_CDT1,
- CDT2_CDT3, CDT4_CDT5, CDT6_CDT7,
-
- CDT8_CDT9 = 0x70,
- CDT10_CDT11, CDTPROX, GPIO_CTRL0, GPIO_CTRL1, GPIO_DATA, GPIO_DIR, GPIO_EN, GPIO_SET,
- GPIO_CLR, GPIO_TOGGLE, AUTO_CFG0, AUTO_CFG1, USL, LSL, TL,
-
- SRST = 0x80
- };
-
- /** Create the MPR121 object
- * @param i2c - A defined I2C object
- * @param pin - A defined InterruptIn object
- * @param i2c_addr - Connection of the address line
- */
- MPR121(I2C &i2c, InterruptIn &pin, MPR121_ADDR i2c_addr);
-
/** Create the MPR121 object
* @param i2c - A defined I2C object
* @param i2c_addr - Connection of the address line
*/
MPR121(I2C &i2c);
- /** Clear state variables and initilize the dependant objects
- */
- void init(void);
-
- /** Allow the IC to run and collect user input
- */
- void enable(void);
-
- /** Stop the IC and put into low power mode
- */
- void disable(void);
-
/** Determine if a new button press event occured
* Upon calling the state is cleared until another press is detected
* @return 1 if a press has been detected since the last call, 0 otherwise
*/
- uint32_t isPressed(void);
+ bool isPressed(void);
/** Get the electrode status (ELE12 ... ELE0 -> b15 xxx b11 ... b0
* The buttons are bit mapped. ELE0 = b0 ... ELE11 = b11 b12 ... b15 undefined
* @return The state of all buttons
*/
uint16_t buttonPressed(void);
-
- /** print the register map and values to the console
- * @param obj - a Serial object that prints to a console
- */
- void registerDump(Serial &obj) const;
-
- /** print the register map and values to the console
- */
- void registerDump(void) const;
-
- /** Write to a register (exposed for debugging reasons)
- * Note: most writes are only valid in stop mode
- * @param reg - The register to be written
- * @param data - The data to be written
- */
- void writeRegister(MPR121_REGISTER const reg, uint8_t const data) const;
-
- /** Read from a register (exposed for debugging reasons)
- * @param reg - The register to read from
- * @return The register contents
- */
- uint8_t readRegister(MPR121_REGISTER const reg) const;
-
};
#endif
