sx9500 driver

Dependents:   Senet NAMote scpi_sx127x NAMote72_Utility scpi_sx127x_firstTest

Revision:
1:aa30dc96dc77
Parent:
0:d46a1b9267a3
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");
+}
+