sx9500 driver

Dependents:   Senet NAMote scpi_sx127x NAMote72_Utility scpi_sx127x_firstTest

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sx9500.cpp Source File

sx9500.cpp

00001 #include "sx9500.h"
00002 
00003 #define SX9500_I2C_ADDRESS                          0x50    //0x28
00004 
00005 
00006 SX9500::SX9500(I2C& r, PinName en_pin, PinName nirq_pin) : m_i2c(r), m_txen(en_pin), m_nirq(nirq_pin)
00007 {
00008     m_nirq.mode(PullUp);    // no pullup on board?
00009     RegProxCtrl0.octet = read_single(SX9500_REG_PROXCTRL0);
00010 }
00011 
00012 SX9500::~SX9500()
00013 {
00014 }
00015 
00016 void SX9500::reset()
00017 {
00018     write(SX9500_REG_RESET, SX9500_RESET_CMD);
00019 }
00020 
00021 void SX9500::print_sensor(char CSn)
00022 {
00023     uint8_t buf[2];
00024     
00025     write(SX9500_REG_SENSORSEL, CSn);
00026     
00027     read(SX9500_REG_USEMSB, buf, 2);
00028     printf("%d useful:0x%02x%02x\r\n", CSn, buf[0], buf[1]);
00029     
00030     read(SX9500_REG_AVGMSB, buf, 2);
00031     printf("%d   avg:0x%02x%02x\r\n", CSn, buf[0], buf[1]);
00032     
00033     read(SX9500_REG_DIFFMSB, buf, 2);
00034     printf("%d  diff:0x%02x%02x\r\n", CSn, buf[0], buf[1]);    
00035 }
00036 
00037 void SX9500::write(uint8_t addr, uint8_t data)
00038 {
00039     uint8_t cmd[2];
00040     
00041     cmd[0] = addr;
00042     cmd[1] = data;
00043 
00044     if (m_i2c.write(SX9500_I2C_ADDRESS, (char *)cmd, 2))
00045         printf("SX9500 write-fail\n");
00046 }
00047 
00048 void SX9500::read(uint8_t addr, uint8_t *dst_buf, int length)
00049 {
00050     char cmd[2];
00051 
00052     cmd[0] = addr;
00053     if (m_i2c.write(SX9500_I2C_ADDRESS, cmd, 1, true))
00054         printf("SX9500 write-fail\n");
00055     if (m_i2c.read(SX9500_I2C_ADDRESS, (char *)dst_buf, length))
00056         printf("SX9500 read-fail\n");
00057 }
00058 
00059 uint8_t SX9500::read_single(uint8_t addr)
00060 {
00061     char cmd[2];
00062 
00063     cmd[0] = addr;
00064     if (m_i2c.write(SX9500_I2C_ADDRESS, cmd, 1, true))
00065         printf("SX9500 write-fail\n");
00066     if (m_i2c.read(SX9500_I2C_ADDRESS, cmd, 1))
00067         printf("SX9500 read-fail\n");
00068 
00069     return cmd[0];
00070 }
00071 
00072 bool SX9500::get_active()
00073 {
00074     if (m_txen.read())
00075         return true;
00076     else
00077         return false;
00078 }
00079     
00080 void SX9500::set_active(bool en)
00081 {
00082     if (en) {
00083         m_txen = 1;
00084     } else {
00085         /* lowest power (non)operation */
00086         m_txen = 0;
00087         write(SX9500_REG_PROXCTRL0, 0);  // turn off all sensor pins
00088     }
00089 }
00090 
00091 void SX9500::service()
00092 {
00093     if (m_nirq.read())
00094         return;
00095         
00096     RegIrqSrc.octet = read_single(SX9500_REG_IRQSRC);
00097     printf("95irq:");
00098     if (RegIrqSrc.bits.conv_done) {
00099         printf("conv_done:\r\n");
00100         print_sensor(0);
00101         print_sensor(1);
00102     }
00103     if (RegIrqSrc.bits.comp_done) {
00104         printf("comp_done ");
00105     }
00106     if (RegIrqSrc.bits.far || RegIrqSrc.bits.close) {
00107         RegStat_t stat;
00108         printf("stat ");
00109         stat.octet = read_single(SX9500_REG_STAT);
00110         if (stat.bits.proxstat0)
00111             printf("cs0 ");
00112         if (stat.bits.proxstat1)
00113             printf("cs1 ");
00114     }
00115 
00116     if (RegIrqSrc.bits.reset) {
00117         printf("reset ");
00118     }
00119     
00120     printf("\r\n");
00121 }
00122