Start of a microbit mpr121 library
Dependents: microbitmpr121-example
MicroBitMpr121.cpp
- Committer:
- owenbrotherwood
- Date:
- 2017-01-16
- Revision:
- 1:f6fed00a3ff2
- Parent:
- 0:fb4572fc4901
- Child:
- 2:4e130924a398
File content as of revision 1:f6fed00a3ff2:
#include "MicroBit.h" #include "MicroBitI2C.h" #include "MicroBitMpr121.h" #define DEBUG 1 //MicroBitMpr121::MicroBitMpr121(PinName sda, PinName scl, PinName irq, MPR121_ADDR addr) MicroBitMpr121::MicroBitMpr121() { MicroBitI2C _i2c = i2c(I2C_SDA0, I2C_SCL0); // PinName _irq = irq; //TODO :: use uint8_t _i2c_addr = (addr << 1); // To get 8bit address ...? return; } void MicroBitMpr121::init(void) { P16.setPull(PullUp); //TODO use _irq and not hard code MicroBitI2C::write(SRST, 0x63); MicroBitI2C::write(MHDR, 0x1); MicroBitI2C::write(NHDR, 0x1); MicroBitI2C::write(NCLR, 0x0); MicroBitI2C::write(FDLR, 0x0); MicroBitI2C::write(MHDF, 0x1); MicroBitI2C::write(NHDF, 0x1); MicroBitI2C::write(NCLF, 0xFF); MicroBitI2C::write(FDLF, 0x2); for(int i=0; i<(12*2); i+=2) { MicroBitI2C::write(static_cast<MPR121_REGISTER>(E0TTH+i), 0x20); } for(int i=0; i<(12*2); i+=2) { MicroBitI2C::write(static_cast<MPR121_REGISTER>(E0RTH+i), 0x10); } MicroBitI2C::write(DT_DR, 0x11); MicroBitI2C::write(CDC_CONFIG, 0x10); MicroBitI2C::write(CDT_CONFIG, 0x20); MicroBitI2C::write(AUTO_CFG0, 0x33); MicroBitI2C::write(AUTO_CFG1, 0x07); MicroBitI2C::write(USL, 0xc9); MicroBitI2C::write(LSL, 0x83); MicroBitI2C::write(TL, 0xb5); MicroBitI2C::write(ECR, 0x8f); return; } void MicroBitMpr121::enable(void) { _button = 0; _button_has_changed = 0; MicroBitI2C::write(ECR, 0x8f); _irq->fall(this, &MicroBitMpr121::handler); return; } void MicroBitMpr121::disable(void) { _irq->fall(NULL); _button = 0; _button_has_changed = 0; MicroBitI2C::write(ECR, 0x0); MicroBitI2C::write(AUTO_CFG0, 0x0); MicroBitI2C::write(AUTO_CFG1, 0x0); return; } uint32_t MicroBitMpr121::isPressed(void) { return _button_has_changed; } uint16_t MicroBitMpr121::buttonPressed(void) { _button_has_changed = 0; return _button; } void MicroBitMpr121::registerDump() const { uint8_t reg_val = 0; for(int i=0; i<0x80; i++) { reg_val = MicroBitMpr121::read(static_cast<MPR121_REGISTER>(i)); printf("Reg 0x%02x: 0x%02x \n", i, reg_val); } return; } void MicroBitMpr121::handler(void) { uint16_t reg_val = 0, oor_val = 0; reg_val = MicroBitMpr121::read(ELE0_7_STAT); reg_val |= MicroBitMpr121::read(ELE8_11_STAT) << 8; oor_val = MicroBitMpr121::read(ELE0_7_OOR_STAT); oor_val |= MicroBitMpr121::read(ELE8_11_OOR_STAT) << 8; if((0 != oor_val) && DEBUG) { printf("MPR121 OOR failure - 0x%04x\n", oor_val); wait(0.1f); NVIC_SystemReset(); } _button = reg_val; _button_has_changed = 1; return; } void MicroBitI2C::write(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) { printf("I2c write failed\n"); } return; } uint8_t MicroBitMpr121::read(MPR121_REGISTER const reg) const { char buf[1] = {reg}, data = 0; uint8_t result = 1; result &= _i2c->write(_i2c_addr, buf, 1, true); //TODO: Correct with true? result &= _i2c->read(_i2c_addr, &data, 1); if(result && DEBUG) { printf("I2c read failed\n"); } return data; }