Dependencies:   SX1276GenericLib USBDevice

Fork of PICO_LoRa_Module_developing by Walter Luu

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?

UserRevisionLine numberNew contents of line
walterluu 3:85fc843a9d7d 1
walterluu 3:85fc843a9d7d 2 #include "mbed.h"
walterluu 3:85fc843a9d7d 3 #include "MAX44009_lib.h"
walterluu 3:85fc843a9d7d 4
walterluu 3:85fc843a9d7d 5 // *****************************************************************************
walterluu 3:85fc843a9d7d 6 // MAX44009_write_register(char, char, char) writes single byte to MAX44009
walterluu 3:85fc843a9d7d 7 // char I2C address
walterluu 3:85fc843a9d7d 8 // char MAX44009 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 MAX44009_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); // why send 2 bytes?
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 // MAX44009_write_register(char, char, char *, int) writes multiple bytes to MAX44009
walterluu 3:85fc843a9d7d 26 // char I2C address
walterluu 3:85fc843a9d7d 27 // char MAX44009 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 MAX44009_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 // MAX44009_read_register(char, char, char *) reads single byte from MAX44009
walterluu 3:85fc843a9d7d 49 // char I2C address
walterluu 3:85fc843a9d7d 50 // char MAX44009 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 MAX44009_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,&reg_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 // *****************************************************************************
walterluu 3:85fc843a9d7d 66 // MAX44009_read_lux_register(char, char, char *, int) reads lux value bytes from MAX44009
walterluu 3:85fc843a9d7d 67 // char I2C address
walterluu 3:85fc843a9d7d 68 // char MAX44009 register address
walterluu 3:85fc843a9d7d 69 // char * data vector for read bytes to be stored in
walterluu 3:85fc843a9d7d 70 // returns 0 on success, 1 on fail
walterluu 3:85fc843a9d7d 71 // *****************************************************************************
walterluu 3:85fc843a9d7d 72
walterluu 3:85fc843a9d7d 73 int MAX44009_read_lux_register(I2C *i2c, char I2C_add, char reg_add, char *bytes){
walterluu 3:85fc843a9d7d 74 int error;
walterluu 3:85fc843a9d7d 75
walterluu 3:85fc843a9d7d 76 error = i2c->write(I2C_add, &reg_add, 1, 1);
walterluu 3:85fc843a9d7d 77 if(error)return error;
walterluu 3:85fc843a9d7d 78 error = i2c->read(I2C_add, bytes, 1, true);
walterluu 3:85fc843a9d7d 79 if(error)return error;
walterluu 3:85fc843a9d7d 80
walterluu 3:85fc843a9d7d 81 reg_add += 1; // increment register address
walterluu 3:85fc843a9d7d 82 error = i2c->write(I2C_add, &reg_add, 1, 1); //?
walterluu 3:85fc843a9d7d 83 if(error)return error;
walterluu 3:85fc843a9d7d 84 error = i2c->read(I2C_add, bytes + 1, 1); // bytes + 1; &bytes[1]
walterluu 3:85fc843a9d7d 85
walterluu 3:85fc843a9d7d 86 //if(DEBUG)db.printf("rr e[%d]\r\n",error);
walterluu 3:85fc843a9d7d 87 return error;
walterluu 3:85fc843a9d7d 88 }
walterluu 3:85fc843a9d7d 89
walterluu 3:85fc843a9d7d 90
walterluu 3:85fc843a9d7d 91 // *****************************************************************************
walterluu 3:85fc843a9d7d 92 // convert_temperature(char) sends convert command to MAX44009 device
walterluu 3:85fc843a9d7d 93 // char I2C address
walterluu 3:85fc843a9d7d 94 // *****************************************************************************
walterluu 3:85fc843a9d7d 95
walterluu 3:85fc843a9d7d 96 //void convert_temperature(I2C *i2c, char I2C_add){ // set convert bit to start conversion
walterluu 3:85fc843a9d7d 97 //
walterluu 3:85fc843a9d7d 98 // char data[2];
walterluu 3:85fc843a9d7d 99 //
walterluu 3:85fc843a9d7d 100 // //read ADC_SETUP register 0x14
walterluu 3:85fc843a9d7d 101 // MAX44009_read_register(i2c, I2C_add, MAX44009_ADC_SETUP,data,1);
walterluu 3:85fc843a9d7d 102 //
walterluu 3:85fc843a9d7d 103 // //mask convert register value with 0x01 and write back register 0x14
walterluu 3:85fc843a9d7d 104 // MAX44009_write_register(i2c, I2C_add, MAX44009_ADC_SETUP, data[0]|0x01);
walterluu 3:85fc843a9d7d 105 //}
walterluu 3:85fc843a9d7d 106
walterluu 3:85fc843a9d7d 107 //******************************************************************************
walterluu 3:85fc843a9d7d 108 // get_luxvalue(char) read lux value from MAX44009 device register
walterluu 3:85fc843a9d7d 109 // char I2C address
walterluu 3:85fc843a9d7d 110 // returns LuxResponse luxValue = light intensity in lux
walterluu 3:85fc843a9d7d 111 // status = register read result
walterluu 3:85fc843a9d7d 112 //******************************************************************************
walterluu 3:85fc843a9d7d 113
walterluu 3:85fc843a9d7d 114 LuxResponse get_luxvalue(I2C *i2c, char I2C_add){
walterluu 3:85fc843a9d7d 115 char data[2]; // 2 bytes of raw Lux Register
walterluu 3:85fc843a9d7d 116 double lux;
walterluu 3:85fc843a9d7d 117 // int count;
walterluu 3:85fc843a9d7d 118
walterluu 3:85fc843a9d7d 119 // Read lux value, 2 bytes
walterluu 3:85fc843a9d7d 120 int error = MAX44009_read_lux_register(i2c, I2C_add, MAX44009_LUX_HI, data);
walterluu 3:85fc843a9d7d 121
walterluu 3:85fc843a9d7d 122 //calculate lux from data
walterluu 3:85fc843a9d7d 123 // count = (int)(data[0]*256 + data[1]);
walterluu 3:85fc843a9d7d 124 // if (count >= 32768)count = count - 65536; // 2s comp
walterluu 3:85fc843a9d7d 125 // T = (double)count*0.005;
walterluu 3:85fc843a9d7d 126
walterluu 3:85fc843a9d7d 127 int exponent;
walterluu 3:85fc843a9d7d 128 int mantissa;
walterluu 3:85fc843a9d7d 129 exponent = int(data[0] >> 4);
walterluu 3:85fc843a9d7d 130 mantissa = int(data[0] << 4) + int(data[1]);
walterluu 3:85fc843a9d7d 131 lux = 0.045 * mantissa * pow((double)2, exponent);
walterluu 3:85fc843a9d7d 132
walterluu 3:85fc843a9d7d 133
walterluu 3:85fc843a9d7d 134 LuxResponse resp;
walterluu 3:85fc843a9d7d 135 resp.luxValue = lux;
walterluu 3:85fc843a9d7d 136 resp.status = error; // 1 for nack/error. 0 for ack/success
walterluu 3:85fc843a9d7d 137 return resp;
walterluu 3:85fc843a9d7d 138 }
walterluu 3:85fc843a9d7d 139