MAX32625PICO LP0 mode
Dependencies: SX1276GenericLib USBDevice
Fork of PICO_LP0 by
AO32Lib/AO32_lib.cpp@3:85fc843a9d7d, 2020-10-12 (annotated)
- Committer:
- walterluu
- Date:
- Mon Oct 12 21:55:22 2020 +0000
- Revision:
- 3:85fc843a9d7d
- Child:
- 5:9e751733a6f3
MAX20361 Demo Firmware version 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
walterluu | 3:85fc843a9d7d | 1 | |
walterluu | 3:85fc843a9d7d | 2 | #include "mbed.h" |
walterluu | 3:85fc843a9d7d | 3 | #include "AO32_lib.h" |
walterluu | 3:85fc843a9d7d | 4 | |
walterluu | 3:85fc843a9d7d | 5 | // ***************************************************************************** |
walterluu | 3:85fc843a9d7d | 6 | // AO32_write_register(char, char, char) writes single byte to AO32 |
walterluu | 3:85fc843a9d7d | 7 | // char I2C address |
walterluu | 3:85fc843a9d7d | 8 | // char AO32 register address |
walterluu | 3:85fc843a9d7d | 9 | // char data byte to be writen |
walterluu | 3:85fc843a9d7d | 10 | // returns 0 on success ACK, 1 on NACK |
walterluu | 3:85fc843a9d7d | 11 | // ***************************************************************************** |
walterluu | 3:85fc843a9d7d | 12 | |
walterluu | 3:85fc843a9d7d | 13 | int AO32_write_register(I2C *i2c, char I2C_add, char reg_add, char byte){ |
walterluu | 3:85fc843a9d7d | 14 | char data[2]; // char type ranges from 0 to 255 (8 bytes) |
walterluu | 3:85fc843a9d7d | 15 | int error; |
walterluu | 3:85fc843a9d7d | 16 | data[0] = reg_add; |
walterluu | 3:85fc843a9d7d | 17 | data[1] = byte; |
walterluu | 3:85fc843a9d7d | 18 | error = i2c->write(I2C_add,data,2); |
walterluu | 3:85fc843a9d7d | 19 | //if(DEBUG)db.printf("wr[%02X %02X %d]\r\n", data[0], data[1], error); |
walterluu | 3:85fc843a9d7d | 20 | return error; |
walterluu | 3:85fc843a9d7d | 21 | |
walterluu | 3:85fc843a9d7d | 22 | } |
walterluu | 3:85fc843a9d7d | 23 | |
walterluu | 3:85fc843a9d7d | 24 | /// **************************************************************************** |
walterluu | 3:85fc843a9d7d | 25 | // AO32_write_register(char, char, char *, int) writes multiple bytes to AO32 |
walterluu | 3:85fc843a9d7d | 26 | // char I2C address |
walterluu | 3:85fc843a9d7d | 27 | // char AO32 register address |
walterluu | 3:85fc843a9d7d | 28 | // char * data vector of bytes to be written |
walterluu | 3:85fc843a9d7d | 29 | // int number of bytes to write |
walterluu | 3:85fc843a9d7d | 30 | // returns 0 on success ACK, 1 on NACK |
walterluu | 3:85fc843a9d7d | 31 | // ***************************************************************************** |
walterluu | 3:85fc843a9d7d | 32 | |
walterluu | 3:85fc843a9d7d | 33 | int AO32_write_register(I2C *i2c, char I2C_add, char reg_add, char *bytes, int n){ |
walterluu | 3:85fc843a9d7d | 34 | int i; |
walterluu | 3:85fc843a9d7d | 35 | //set start address |
walterluu | 3:85fc843a9d7d | 36 | char data[16]; |
walterluu | 3:85fc843a9d7d | 37 | int error; |
walterluu | 3:85fc843a9d7d | 38 | data[0] = reg_add; |
walterluu | 3:85fc843a9d7d | 39 | for(i=1;i<=n;i++){ |
walterluu | 3:85fc843a9d7d | 40 | data[i] = bytes[i-1]; |
walterluu | 3:85fc843a9d7d | 41 | } |
walterluu | 3:85fc843a9d7d | 42 | error = i2c->write(I2C_add,data,n+1); // send n bytes of data |
walterluu | 3:85fc843a9d7d | 43 | |
walterluu | 3:85fc843a9d7d | 44 | return error; |
walterluu | 3:85fc843a9d7d | 45 | } |
walterluu | 3:85fc843a9d7d | 46 | |
walterluu | 3:85fc843a9d7d | 47 | // ***************************************************************************** |
walterluu | 3:85fc843a9d7d | 48 | // AO32_read_register(char, char, char *) reads single byte from AO32 |
walterluu | 3:85fc843a9d7d | 49 | // char I2C address |
walterluu | 3:85fc843a9d7d | 50 | // char AO32 register address |
walterluu | 3:85fc843a9d7d | 51 | // char * data vector for read bytes to be stored in |
walterluu | 3:85fc843a9d7d | 52 | // returns 0 on success, 1 on fail |
walterluu | 3:85fc843a9d7d | 53 | // ***************************************************************************** |
walterluu | 3:85fc843a9d7d | 54 | |
walterluu | 3:85fc843a9d7d | 55 | int AO32_read_register(I2C *i2c, char I2C_add, char reg_add, char *bytes){ |
walterluu | 3:85fc843a9d7d | 56 | int error; |
walterluu | 3:85fc843a9d7d | 57 | error = i2c->write(I2C_add,®_add,1,1); |
walterluu | 3:85fc843a9d7d | 58 | if(error)return error; |
walterluu | 3:85fc843a9d7d | 59 | error = i2c->read(I2C_add,bytes,1); |
walterluu | 3:85fc843a9d7d | 60 | //if(DEBUG)db.printf("rr e[%d]\r\n",error); |
walterluu | 3:85fc843a9d7d | 61 | return error; |
walterluu | 3:85fc843a9d7d | 62 | } |
walterluu | 3:85fc843a9d7d | 63 | |
walterluu | 3:85fc843a9d7d | 64 | // ***************************************************************************** |
walterluu | 3:85fc843a9d7d | 65 | // AO32_read_register(char, char, char *, int) reads byte(s) from AO32 |
walterluu | 3:85fc843a9d7d | 66 | // char I2C address |
walterluu | 3:85fc843a9d7d | 67 | // char OT07 register address |
walterluu | 3:85fc843a9d7d | 68 | // char * data vector for read bytes to be stored in |
walterluu | 3:85fc843a9d7d | 69 | // int number of bytes to read |
walterluu | 3:85fc843a9d7d | 70 | // returns 0 on success, 1 on fail |
walterluu | 3:85fc843a9d7d | 71 | // ***************************************************************************** |
walterluu | 3:85fc843a9d7d | 72 | |
walterluu | 3:85fc843a9d7d | 73 | int AO32_read_register(I2C *i2c, char I2C_add, char reg_add, char *bytes, int n){ |
walterluu | 3:85fc843a9d7d | 74 | int error; |
walterluu | 3:85fc843a9d7d | 75 | error = i2c->write(I2C_add,®_add,1,1); |
walterluu | 3:85fc843a9d7d | 76 | if(error)return error; |
walterluu | 3:85fc843a9d7d | 77 | error = i2c->read(I2C_add,bytes,n); |
walterluu | 3:85fc843a9d7d | 78 | //if(DEBUG)db.printf("rr e[%d]\r\n",error); |
walterluu | 3:85fc843a9d7d | 79 | return error; |
walterluu | 3:85fc843a9d7d | 80 | } |
walterluu | 3:85fc843a9d7d | 81 | |
walterluu | 3:85fc843a9d7d | 82 | //****************************************************************************** |
walterluu | 3:85fc843a9d7d | 83 | // get_OCV(char) read Open Circuit Voltage from AO32 device register |
walterluu | 3:85fc843a9d7d | 84 | // char I2C address |
walterluu | 3:85fc843a9d7d | 85 | // returns VOCMeas VOCvalue = Open-Circuit Voltage Measurement in Volt |
walterluu | 3:85fc843a9d7d | 86 | // status = Status of OCV read. 0 for success, 1 for error |
walterluu | 3:85fc843a9d7d | 87 | //****************************************************************************** |
walterluu | 3:85fc843a9d7d | 88 | VOCMeas get_OCV(I2C *i2c, char I2C_add) { |
walterluu | 3:85fc843a9d7d | 89 | |
walterluu | 3:85fc843a9d7d | 90 | char data[2]; // only needs 1 byte |
walterluu | 3:85fc843a9d7d | 91 | double voltage; |
walterluu | 3:85fc843a9d7d | 92 | |
walterluu | 3:85fc843a9d7d | 93 | // Read lux value, 2 bytes |
walterluu | 3:85fc843a9d7d | 94 | int error = AO32_read_register(i2c, I2C_add, AO32_VOC, data); |
walterluu | 3:85fc843a9d7d | 95 | |
walterluu | 3:85fc843a9d7d | 96 | // Calculate Open Circuit Voltage from data |
walterluu | 3:85fc843a9d7d | 97 | voltage = int(data[0]) / 100; |
walterluu | 3:85fc843a9d7d | 98 | |
walterluu | 3:85fc843a9d7d | 99 | VOCMeas resp; |
walterluu | 3:85fc843a9d7d | 100 | resp.VOCvalue = voltage; |
walterluu | 3:85fc843a9d7d | 101 | resp.status = error; // 1 for nack/error. 0 for ack/success |
walterluu | 3:85fc843a9d7d | 102 | return resp; |
walterluu | 3:85fc843a9d7d | 103 | } |
walterluu | 3:85fc843a9d7d | 104 | |
walterluu | 3:85fc843a9d7d | 105 | //****************************************************************************** |
walterluu | 3:85fc843a9d7d | 106 | // get_Harvest(char) read harvesting counts from AO32 device register |
walterluu | 3:85fc843a9d7d | 107 | // char I2C address |
walterluu | 3:85fc843a9d7d | 108 | // returns HarvCnt harvCount = Harvester Count "LX Pulses" in decimal |
walterluu | 3:85fc843a9d7d | 109 | // status = Status of harvesting count read. 0 for success, 1 for error |
walterluu | 3:85fc843a9d7d | 110 | //****************************************************************************** |
walterluu | 3:85fc843a9d7d | 111 | HarvCnt get_Harvest(I2C *i2c, char I2C_add) { |
walterluu | 3:85fc843a9d7d | 112 | |
walterluu | 3:85fc843a9d7d | 113 | char data[2]; |
walterluu | 3:85fc843a9d7d | 114 | int countHi; |
walterluu | 3:85fc843a9d7d | 115 | int countLo; |
walterluu | 3:85fc843a9d7d | 116 | int counts; |
walterluu | 3:85fc843a9d7d | 117 | |
walterluu | 3:85fc843a9d7d | 118 | // Read harvesting counts, 2 bytes |
walterluu | 3:85fc843a9d7d | 119 | int error = AO32_read_register(i2c, I2C_add, AO32_HARV_H, data, 2); // burst read AO32_HARV_H and AO32_HARV_L |
walterluu | 3:85fc843a9d7d | 120 | |
walterluu | 3:85fc843a9d7d | 121 | // Calculate harvesting counts from data |
walterluu | 3:85fc843a9d7d | 122 | countHi = int(data[0] << 8); // might cause trouble, * 256 instead? |
walterluu | 3:85fc843a9d7d | 123 | countLo = int(data[1]); |
walterluu | 3:85fc843a9d7d | 124 | counts = countHi + countLo; |
walterluu | 3:85fc843a9d7d | 125 | |
walterluu | 3:85fc843a9d7d | 126 | HarvCnt resp; |
walterluu | 3:85fc843a9d7d | 127 | resp.harvCount = counts; |
walterluu | 3:85fc843a9d7d | 128 | resp.status = error; // 1 for nack/error. 0 for ack/success |
walterluu | 3:85fc843a9d7d | 129 | return resp; |
walterluu | 3:85fc843a9d7d | 130 | } |
walterluu | 3:85fc843a9d7d | 131 | |
walterluu | 3:85fc843a9d7d | 132 | |
walterluu | 3:85fc843a9d7d | 133 | //****************************************************************************** |
walterluu | 3:85fc843a9d7d | 134 | // get_luxvalue(char) read lux value from AO32 device register |
walterluu | 3:85fc843a9d7d | 135 | // char I2C address |
walterluu | 3:85fc843a9d7d | 136 | // returns LuxResponse luxValue = light intensity in lux |
walterluu | 3:85fc843a9d7d | 137 | // status = register read result |
walterluu | 3:85fc843a9d7d | 138 | //****************************************************************************** |
walterluu | 3:85fc843a9d7d | 139 | |
walterluu | 3:85fc843a9d7d | 140 | //LuxResponse get_luxvalue(I2C *i2c, char I2C_add){ |
walterluu | 3:85fc843a9d7d | 141 | // char data[2]; // 2 bytes of raw Lux Register |
walterluu | 3:85fc843a9d7d | 142 | // double lux; |
walterluu | 3:85fc843a9d7d | 143 | //// int count; |
walterluu | 3:85fc843a9d7d | 144 | // |
walterluu | 3:85fc843a9d7d | 145 | // // Read lux value, 2 bytes |
walterluu | 3:85fc843a9d7d | 146 | // int error = AO32_read_lux_register(i2c, I2C_add, AO32_LUX_HI, data); |
walterluu | 3:85fc843a9d7d | 147 | // |
walterluu | 3:85fc843a9d7d | 148 | // //calculate lux from data |
walterluu | 3:85fc843a9d7d | 149 | //// count = (int)(data[0]*256 + data[1]); |
walterluu | 3:85fc843a9d7d | 150 | //// if (count >= 32768)count = count - 65536; // 2s comp |
walterluu | 3:85fc843a9d7d | 151 | //// T = (double)count*0.005; |
walterluu | 3:85fc843a9d7d | 152 | // |
walterluu | 3:85fc843a9d7d | 153 | // int exponent; |
walterluu | 3:85fc843a9d7d | 154 | // int mantissa; |
walterluu | 3:85fc843a9d7d | 155 | // exponent = data[0] >> 4; |
walterluu | 3:85fc843a9d7d | 156 | // mantissa = (data[0] << 4) + data[1]; |
walterluu | 3:85fc843a9d7d | 157 | // lux = 0.045 * mantissa * pow(2, exponent); |
walterluu | 3:85fc843a9d7d | 158 | // |
walterluu | 3:85fc843a9d7d | 159 | // LuxResponse resp; |
walterluu | 3:85fc843a9d7d | 160 | // resp.luxValue = lux; |
walterluu | 3:85fc843a9d7d | 161 | // resp.status = error; // 1 for nack/error. 0 for ack/success |
walterluu | 3:85fc843a9d7d | 162 | // return resp; |
walterluu | 3:85fc843a9d7d | 163 | //} |