added init function from NXP Rapid ioT SDK, read_proximity_sensors function now works well.
Dependents: rIoTwear-touch rIoTwear-snake
Diff: sx9500.cpp
- Revision:
- 1:aa30dc96dc77
- Parent:
- 0:d46a1b9267a3
- Child:
- 2:f88a77463a32
diff -r d46a1b9267a3 -r aa30dc96dc77 sx9500.cpp --- a/sx9500.cpp Wed Mar 18 00:57:23 2015 +0000 +++ b/sx9500.cpp Fri May 08 01:32:54 2015 +0000 @@ -2,8 +2,11 @@ #define SX9500_I2C_ADDRESS 0x50 //0x28 -SX9500::SX9500(I2C& r, PinName en_pin) : m_i2c(r), m_txen(en_pin) + +SX9500::SX9500(I2C& r, PinName en_pin, PinName nirq_pin) : m_i2c(r), m_txen(en_pin), m_nirq(nirq_pin) { + m_nirq.mode(PullUp); // no pullup on board? + RegProxCtrl0.octet = read_single(SX9500_REG_PROXCTRL0); } SX9500::~SX9500() @@ -15,25 +18,20 @@ write(SX9500_REG_RESET, SX9500_RESET_CMD); } -uint16_t SX9500::get_sensor() +void SX9500::print_sensor(char CSn) { - //uint16_t offset; - uint8_t status; uint8_t buf[2]; - - m_txen = 1; - - write(SX9500_REG_IRQMSK, 0x10); - write(SX9500_REG_IRQSRC, 0x10); - - do { - status = read_single(SX9500_REG_IRQSRC); - } while (!(status & 0x10)); - - read(SX9500_REG_OFFSETMSB, buf, 2); - /*printf("MSB:%x\n", read_single(SX9500_REG_OFFSETMSB)); - printf("LSB:%x\n", read_single(SX9500_REG_OFFSETLSB));*/ - return (buf[0] << 8) + buf[1]; + + write(SX9500_REG_SENSORSEL, CSn); + + read(SX9500_REG_USEMSB, buf, 2); + printf("%d useful:0x%02x%02x\r\n", CSn, buf[0], buf[1]); + + read(SX9500_REG_AVGMSB, buf, 2); + printf("%d avg:0x%02x%02x\r\n", CSn, buf[0], buf[1]); + + read(SX9500_REG_DIFFMSB, buf, 2); + printf("%d diff:0x%02x%02x\r\n", CSn, buf[0], buf[1]); } void SX9500::write(uint8_t addr, uint8_t data) @@ -70,10 +68,55 @@ return cmd[0]; } - -void SX9500::standby(void) + +bool SX9500::get_active() { - m_txen = 0; - write(SX9500_REG_PROXCTRL0, 0); // turn off all sensor pins + if (m_txen.read()) + return true; + else + return false; +} + +void SX9500::set_active(bool en) +{ + if (en) { + m_txen = 1; + } else { + /* lowest power (non)operation */ + m_txen = 0; + write(SX9500_REG_PROXCTRL0, 0); // turn off all sensor pins + } } +void SX9500::service() +{ + if (m_nirq.read()) + return; + + RegIrqSrc.octet = read_single(SX9500_REG_IRQSRC); + printf("95irq:"); + if (RegIrqSrc.bits.conv_done) { + printf("conv_done:\r\n"); + print_sensor(0); + print_sensor(1); + } + if (RegIrqSrc.bits.comp_done) { + printf("comp_done "); + } + if (RegIrqSrc.bits.far || RegIrqSrc.bits.close) { + RegStat_t stat; + printf("stat "); + stat.octet = read_single(SX9500_REG_STAT); + if (stat.bits.proxstat0) + printf("cs0 "); + if (stat.bits.proxstat1) + printf("cs1 "); + } + + if (RegIrqSrc.bits.reset) { + printf("reset "); + } + + printf("\r\n"); +} +