added init function from NXP Rapid ioT SDK, read_proximity_sensors function now works well.
Dependents: rIoTwear-touch rIoTwear-snake
sx9500.h@3:b0a2ba594005, 2019-12-27 (annotated)
- Committer:
- batman52
- Date:
- Fri Dec 27 15:16:40 2019 +0000
- Revision:
- 3:b0a2ba594005
- Parent:
- 2:f88a77463a32
removed printf in service method
Who changed what in which revision?
User | Revision | Line number | New 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 |