added init function from NXP Rapid ioT SDK, read_proximity_sensors function now works well.

Dependents:   rIoTwear-touch rIoTwear-snake

Committer:
batman52
Date:
Thu Dec 19 17:06:08 2019 +0000
Revision:
2:f88a77463a32
Parent:
1:aa30dc96dc77
added init function from NXP Rapid ioT SDK, read_proximity_sensors function now works well.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:d46a1b9267a3 1 #include "mbed.h"
dudmuck 0:d46a1b9267a3 2
dudmuck 0:d46a1b9267a3 3 #define SX9500_REG_IRQSRC 0x00
dudmuck 0:d46a1b9267a3 4 #define SX9500_REG_STAT 0x01
dudmuck 0:d46a1b9267a3 5 #define SX9500_REG_IRQMSK 0x03
dudmuck 0:d46a1b9267a3 6 #define SX9500_REG_PROXCTRL0 0x06
dudmuck 0:d46a1b9267a3 7 #define SX9500_REG_PROXCTRL1 0x07
dudmuck 0:d46a1b9267a3 8 #define SX9500_REG_PROXCTRL2 0x08
dudmuck 0:d46a1b9267a3 9 #define SX9500_REG_PROXCTRL3 0x09
dudmuck 0:d46a1b9267a3 10 #define SX9500_REG_PROXCTRL4 0x0A
dudmuck 0:d46a1b9267a3 11 #define SX9500_REG_PROXCTRL5 0x0B
dudmuck 0:d46a1b9267a3 12 #define SX9500_REG_PROXCTRL6 0x0C
dudmuck 0:d46a1b9267a3 13 #define SX9500_REG_PROXCTRL7 0x0D
dudmuck 0:d46a1b9267a3 14 #define SX9500_REG_PROXCTRL8 0x0E
dudmuck 0:d46a1b9267a3 15 #define SX9500_REG_SENSORSEL 0x20
dudmuck 0:d46a1b9267a3 16 #define SX9500_REG_USEMSB 0x21
dudmuck 0:d46a1b9267a3 17 #define SX9500_REG_USELSB 0x22
dudmuck 0:d46a1b9267a3 18 #define SX9500_REG_AVGMSB 0x23
dudmuck 0:d46a1b9267a3 19 #define SX9500_REG_AVGLSB 0x24
dudmuck 0:d46a1b9267a3 20 #define SX9500_REG_DIFFMSB 0x25
dudmuck 0:d46a1b9267a3 21 #define SX9500_REG_DIFFLSB 0x26
dudmuck 0:d46a1b9267a3 22 #define SX9500_REG_OFFSETMSB 0x27
dudmuck 0:d46a1b9267a3 23 #define SX9500_REG_OFFSETLSB 0x28
dudmuck 0:d46a1b9267a3 24 #define SX9500_REG_RESET 0x7F
dudmuck 0:d46a1b9267a3 25
dudmuck 0:d46a1b9267a3 26 #define SX9500_RESET_CMD 0xDE
dudmuck 0:d46a1b9267a3 27
batman52 2:f88a77463a32 28 /*
batman52 2:f88a77463a32 29 * Copyright (c) 2018 NXP
batman52 2:f88a77463a32 30 *
batman52 2:f88a77463a32 31 * Redistribution and use in source and binary forms, with or without modification,
batman52 2:f88a77463a32 32 * are permitted provided that the following conditions are met:
batman52 2:f88a77463a32 33 *
batman52 2:f88a77463a32 34 * o Redistributions of source code must retain the above copyright notice, this list
batman52 2:f88a77463a32 35 * of conditions and the following disclaimer.
batman52 2:f88a77463a32 36 *
batman52 2:f88a77463a32 37 * o Redistributions in binary form must reproduce the above copyright notice, this
batman52 2:f88a77463a32 38 * list of conditions and the following disclaimer in the documentation and/or
batman52 2:f88a77463a32 39 * other materials provided with the distribution.
batman52 2:f88a77463a32 40 *
batman52 2:f88a77463a32 41 * o Neither the name of the copyright holder nor the names of its
batman52 2:f88a77463a32 42 * contributors may be used to endorse or promote products derived from this
batman52 2:f88a77463a32 43 * software without specific prior written permission.
batman52 2:f88a77463a32 44 *
batman52 2:f88a77463a32 45 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
batman52 2:f88a77463a32 46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
batman52 2:f88a77463a32 47 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
batman52 2:f88a77463a32 48 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
batman52 2:f88a77463a32 49 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
batman52 2:f88a77463a32 50 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
batman52 2:f88a77463a32 51 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
batman52 2:f88a77463a32 52 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
batman52 2:f88a77463a32 53 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
batman52 2:f88a77463a32 54 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
batman52 2:f88a77463a32 55 */
batman52 2:f88a77463a32 56
batman52 2:f88a77463a32 57 /* Define registers that need to be initialized to values different than
batman52 2:f88a77463a32 58 * default
batman52 2:f88a77463a32 59 */
batman52 2:f88a77463a32 60 typedef struct smtc_reg_data {
batman52 2:f88a77463a32 61 unsigned char reg;
batman52 2:f88a77463a32 62 unsigned char val;
batman52 2:f88a77463a32 63 }smtc_reg_data_t;
batman52 2:f88a77463a32 64 static smtc_reg_data_t sx9500_i2c_reg_setup[] = {
batman52 2:f88a77463a32 65 {
batman52 2:f88a77463a32 66 .reg = SX9500_REG_IRQMSK,
batman52 2:f88a77463a32 67 .val = 0x60, /* CLOSEIRQEN[6]=1 (close interrupt is on), */
batman52 2:f88a77463a32 68 /* FARIRQEN[5]=1 (far interrupt is on), */
batman52 2:f88a77463a32 69 /* COMPDONEIRQEN[4]=0 (compensation interrupt is off), */
batman52 2:f88a77463a32 70 /* CONVDONEIRQEN[3]=0 (conversion interrupt is off) */
batman52 2:f88a77463a32 71 },
batman52 2:f88a77463a32 72 {
batman52 2:f88a77463a32 73 .reg = SX9500_REG_PROXCTRL1,
batman52 2:f88a77463a32 74 .val = 0x03, /* SHIELDEN[7:6]=0 (no shield), */
batman52 2:f88a77463a32 75 /* RANGE[1:0]=3 (small, +/-2.5pF Full Scale) */
batman52 2:f88a77463a32 76 },
batman52 2:f88a77463a32 77 {
batman52 2:f88a77463a32 78 .reg = SX9500_REG_PROXCTRL2,
batman52 2:f88a77463a32 79 .val = 0x27, /* GAIN[6:5]=1 (digital gain x2), */
batman52 2:f88a77463a32 80 /* FREQ[4:3]=0 (83kHz sampling frequency), */
batman52 2:f88a77463a32 81 /* RESOLUTION[2:0]=0 (finest resolution) */
batman52 2:f88a77463a32 82 },
batman52 2:f88a77463a32 83 {
batman52 2:f88a77463a32 84 .reg = SX9500_REG_PROXCTRL3,
batman52 2:f88a77463a32 85 .val = 0x41, /* DOZEEN[6]=1 (enables doze mode), */
batman52 2:f88a77463a32 86 /* DOZEPERIOD[5:4]=0 (2*scan period), */
batman52 2:f88a77463a32 87 /* RAWFILT[1:0]=1 (Low) */
batman52 2:f88a77463a32 88 },
batman52 2:f88a77463a32 89 {
batman52 2:f88a77463a32 90 .reg = SX9500_REG_PROXCTRL4,
batman52 2:f88a77463a32 91 .val = 0x80, /* AVGTHRESH[7:0]=0x80 (threshold triggering compensation = +/-128*value (typ between 16384 and 24576) */
batman52 2:f88a77463a32 92 },
batman52 2:f88a77463a32 93 {
batman52 2:f88a77463a32 94 .reg = SX9500_REG_PROXCTRL5,
batman52 2:f88a77463a32 95 .val = 0x0F, /* AVGDEB[7:6]=0 (debounce=off), */
batman52 2:f88a77463a32 96 /* AVGNEGFILT[5:3]=1 (lowest negative filter), */
batman52 2:f88a77463a32 97 /* AVGPOSFILT[2:0]=7 (highest positive filter) */
batman52 2:f88a77463a32 98 },
batman52 2:f88a77463a32 99 {
batman52 2:f88a77463a32 100 .reg = SX9500_REG_PROXCTRL6,
batman52 2:f88a77463a32 101 .val = 0x06, /* PROXTHRESH[4:0]=6 (sensitivity=120) */
batman52 2:f88a77463a32 102 },
batman52 2:f88a77463a32 103 {
batman52 2:f88a77463a32 104 .reg = SX9500_REG_PROXCTRL7,
batman52 2:f88a77463a32 105 .val = 0x00, /* AVGCOMPDIS[7]=0 (compensation enabled), */
batman52 2:f88a77463a32 106 /* COMPMETHOD[6]=0 (separate CSx compensation), */
batman52 2:f88a77463a32 107 /* HYST[5:4]=0 (hysteresis=32), */
batman52 2:f88a77463a32 108 /* CLOSEDEB[3:2]=0 (close debouncer=off), */
batman52 2:f88a77463a32 109 /* FARDEB[1:0]=0 (far debouncer=off) */
batman52 2:f88a77463a32 110 },
batman52 2:f88a77463a32 111 {
batman52 2:f88a77463a32 112 .reg = SX9500_REG_PROXCTRL8,
batman52 2:f88a77463a32 113 .val = 0x08, /* STUCK[7:4]=0 (stuck timeout=off), */
batman52 2:f88a77463a32 114 /* COMPPRD[3:0]=8 (periodic compensation every 8*128 samples) */
batman52 2:f88a77463a32 115 },
batman52 2:f88a77463a32 116 {
batman52 2:f88a77463a32 117 .reg = SX9500_REG_PROXCTRL0,
batman52 2:f88a77463a32 118 .val = 0x0F, /* SCANPERIOD[6:4]=0 (scan every 30ms), */
batman52 2:f88a77463a32 119 /* SENSOREN[3:0]=15 (enable all sensors) */
batman52 2:f88a77463a32 120 },
batman52 2:f88a77463a32 121 };
batman52 2:f88a77463a32 122
batman52 2:f88a77463a32 123 typedef enum
batman52 2:f88a77463a32 124 {
batman52 2:f88a77463a32 125 SX9500_SUCCESS,
batman52 2:f88a77463a32 126 SX9500_I2C_ERROR,
batman52 2:f88a77463a32 127 SX9500_INTERNAL_ERROR,
batman52 2:f88a77463a32 128 SX9500_NOINIT_ERROR
batman52 2:f88a77463a32 129 } SX9500_status;
batman52 2:f88a77463a32 130
batman52 2:f88a77463a32 131 typedef struct {
batman52 2:f88a77463a32 132 bool downPressed;
batman52 2:f88a77463a32 133 bool upPressed;
batman52 2:f88a77463a32 134 bool leftPressed;
batman52 2:f88a77463a32 135 bool rightPressed;
batman52 2:f88a77463a32 136 } SX9500_TouchState_t;
batman52 2:f88a77463a32 137
batman52 2:f88a77463a32 138 /*
batman52 2:f88a77463a32 139 * END Copyright (c) 2018 NXP
batman52 2:f88a77463a32 140 *
batman52 2:f88a77463a32 141 */
batman52 2:f88a77463a32 142
dudmuck 1:aa30dc96dc77 143 typedef union {
dudmuck 1:aa30dc96dc77 144 struct { // sx9500 register 0x09
dudmuck 1:aa30dc96dc77 145 uint8_t txen_stat : 1; // 0
dudmuck 1:aa30dc96dc77 146 uint8_t reserved : 2; // 1,2
dudmuck 1:aa30dc96dc77 147 uint8_t conv_done : 1; // 3
dudmuck 1:aa30dc96dc77 148 uint8_t comp_done : 1; // 4
dudmuck 1:aa30dc96dc77 149 uint8_t far : 1; // 5
dudmuck 1:aa30dc96dc77 150 uint8_t close : 1; // 6
dudmuck 1:aa30dc96dc77 151 uint8_t reset : 1; // 7
dudmuck 1:aa30dc96dc77 152 } bits;
dudmuck 1:aa30dc96dc77 153 uint8_t octet;
dudmuck 1:aa30dc96dc77 154 } RegIrqSrc_t;
dudmuck 1:aa30dc96dc77 155
dudmuck 1:aa30dc96dc77 156 typedef union {
dudmuck 1:aa30dc96dc77 157 struct { // sx9500 register 0x09
dudmuck 1:aa30dc96dc77 158 uint8_t compstat : 4; // 0,1,2,3
dudmuck 1:aa30dc96dc77 159 uint8_t proxstat0 : 1; // 4
dudmuck 1:aa30dc96dc77 160 uint8_t proxstat1 : 1; // 5
dudmuck 1:aa30dc96dc77 161 uint8_t proxstat2 : 1; // 6
dudmuck 1:aa30dc96dc77 162 uint8_t proxstat3 : 1; // 7
dudmuck 1:aa30dc96dc77 163 } bits;
dudmuck 1:aa30dc96dc77 164 uint8_t octet;
dudmuck 1:aa30dc96dc77 165 } RegStat_t;
dudmuck 1:aa30dc96dc77 166
dudmuck 1:aa30dc96dc77 167 typedef union {
dudmuck 1:aa30dc96dc77 168 struct { // sx9500 register 0x06
dudmuck 1:aa30dc96dc77 169 uint8_t sensor_en : 4; // 0,1,2,3
dudmuck 1:aa30dc96dc77 170 uint8_t scan_period : 3; // 4,5,6
dudmuck 1:aa30dc96dc77 171 uint8_t reserved : 1; // 7
dudmuck 1:aa30dc96dc77 172 } bits;
dudmuck 1:aa30dc96dc77 173 uint8_t octet;
dudmuck 1:aa30dc96dc77 174 } RegProxCtrl0_t;
dudmuck 1:aa30dc96dc77 175
dudmuck 1:aa30dc96dc77 176 typedef union {
dudmuck 1:aa30dc96dc77 177 struct { // sx9500 register 0x09
dudmuck 1:aa30dc96dc77 178 uint8_t raw_filt : 2; // 0,1
dudmuck 1:aa30dc96dc77 179 uint8_t reserved : 2; // 2,3
dudmuck 1:aa30dc96dc77 180 uint8_t doze_period : 2; // 4,5
dudmuck 1:aa30dc96dc77 181 uint8_t doze_en : 1; // 6
dudmuck 1:aa30dc96dc77 182 uint8_t res7 : 1; // 7
dudmuck 1:aa30dc96dc77 183 } bits;
dudmuck 1:aa30dc96dc77 184 uint8_t octet;
dudmuck 1:aa30dc96dc77 185 } RegProxCtrl3_t;
dudmuck 1:aa30dc96dc77 186
dudmuck 0:d46a1b9267a3 187 class SX9500 {
dudmuck 0:d46a1b9267a3 188 public:
dudmuck 1:aa30dc96dc77 189 SX9500(I2C& r, PinName en_pin, PinName nirq_pin);
dudmuck 0:d46a1b9267a3 190 ~SX9500();
dudmuck 0:d46a1b9267a3 191 //void try_read(void);
dudmuck 0:d46a1b9267a3 192 uint8_t read_single(uint8_t addr);
dudmuck 0:d46a1b9267a3 193 void read(uint8_t addr, uint8_t *dst_buf, int length);
dudmuck 0:d46a1b9267a3 194 void write(uint8_t addr, uint8_t data);
dudmuck 0:d46a1b9267a3 195 void reset(void);
dudmuck 1:aa30dc96dc77 196 //uint16_t get_sensor(char CSn);
dudmuck 1:aa30dc96dc77 197 void print_sensor(char CSn);
batman52 2:f88a77463a32 198 SX9500_TouchState_t read_proximity_sensors();
dudmuck 1:aa30dc96dc77 199 void set_active(bool);
dudmuck 1:aa30dc96dc77 200 bool get_active(void);
dudmuck 1:aa30dc96dc77 201 void service(void);
batman52 2:f88a77463a32 202 uint8_t init(void);
dudmuck 1:aa30dc96dc77 203
dudmuck 1:aa30dc96dc77 204 RegIrqSrc_t RegIrqSrc;
dudmuck 1:aa30dc96dc77 205 RegProxCtrl0_t RegProxCtrl0;
dudmuck 0:d46a1b9267a3 206
dudmuck 0:d46a1b9267a3 207 private:
dudmuck 0:d46a1b9267a3 208 I2C& m_i2c;
dudmuck 0:d46a1b9267a3 209 DigitalOut m_txen;
dudmuck 1:aa30dc96dc77 210 DigitalIn m_nirq; // polled irq pin, because i2c is shared
dudmuck 0:d46a1b9267a3 211 };
dudmuck 0:d46a1b9267a3 212