PICO I2C FW
Dependencies: USBDevice
Diff: main.cpp
- Revision:
- 17:401a5bb8d403
- Parent:
- 16:2f373d3c8214
- Child:
- 18:d913ec9dd9c2
diff -r 2f373d3c8214 -r 401a5bb8d403 main.cpp --- a/main.cpp Tue Jul 10 20:29:10 2018 +0000 +++ b/main.cpp Fri Aug 31 19:28:28 2018 +0000 @@ -59,9 +59,9 @@ #define OT07_ALARM_HIGH_LSB 0x11 // OT07 Alarm High LSB #define OT07_ALARM_LOW_MSB 0x12 // OT07 Alarm Low MSB #define OT07_ALARM_LOW_LSB 0x13 // OT07 Alarm LOW LSB -#define OT07_ADC_BITS 0x14 // OT07 Temp Seneor Setup (ADC_RES[7:6]) +#define OT07_ADC_SETUP 0x14 // OT07 Temp Seneor Setup (ADC_RES[7:6]) & Convert Temperature [0] #define OT07_GPIO_SETUP 0x20 // OT07 GPIO Setup, sets GPIO modes -#define Ot07_GPIO_CTRL 0x21 // OT07 GPIO control +#define OT07_GPIO_CTRL 0x21 // OT07 GPIO control #define OT07_ROM_ID 0x30 // OT07 ROM_ID address of LSB? @@ -72,6 +72,11 @@ #define BS 8 // ASCII Back Space #define CR 13 // ASCII Carriage Return +struct OT07_struct { + char rom_id[ID_LENGTH]; // device 8 byte ROM ID + char I2C_address; // I2C addess, based on GPIO0 and GPIO1 at power up +}; + const char* settings_file = "/sd/settings.txt"; const char* log_file = "/sd/MAX30207Log.csv"; @@ -440,6 +445,139 @@ }// end search_rom() // ***************************************************************************** +// OT07_write_register(char, char, char) writes single byte to OT07 +// char I2C address +// char OT07 register address +// char data byte to be writen +// returns 0 on success ACK, 1 on NACK +// ***************************************************************************** + +int OT07_write_register(char I2C_add, char reg_add, char byte){ + char data[2]; + int error; + data[0] = reg_add; + data[1] = byte; + error = i2c.write(I2C_add,data,2); + //if(DEBUG)db.printf("wr[%02X %02X %d]\r\n", data[0], data[1], error); + return error; + +} + +/// **************************************************************************** +// OT07_write_register(char, char, char *, int) writes multiple bytes to OT07 +// char I2C address +// char OT07 register address +// char * data vector of bytes to be written +// int number of bytes to write +// returns 0 on success ACK, 1 on NACK +// ***************************************************************************** + +int OT07_write_register(char I2C_add, char reg_add, char *bytes, int n){ + int i; + //set start address + char data[16]; + int error; + data[0] = reg_add; + for(i=1;i<=n;i++){ + data[i] = bytes[i-1]; + } + error = i2c.write(I2C_add,data,n+1); // send n bytes of data + + return error; +} + +// ***************************************************************************** +// OT07_read_register(char, char, char *, int) writes single byte to OT07 +// char I2C address +// char OT07 register address +// char * data vector for read bytes to be stored in +// int number of bytes to read +// returns 0 on success, 1 on fail +// ***************************************************************************** + +int OT07_read_register(char I2C_add, char reg_add, char *bytes, int n){ + int error; + error = i2c.write(I2C_add,®_add,1,1); + if(error)return error; + error = i2c.read(I2C_add,bytes,n); + //if(DEBUG)db.printf("rr e[%d]\r\n",error); + return error; +} + +// ***************************************************************************** +// search_I2C_bus(OT07_struct *) searches I2C address 0xA0, 0xA2, 0xA4 and 0xA6 +// OT07_struct * structure array to holds I2C address and rom_ids +// returns number of devices found +// ***************************************************************************** + +int search_I2C_bus(OT07_struct OT07[]){ + char data[16]; + char I2C_add; + //char GPIO; + int error; + int device_count = 0; + int i; + int j; + for(i = 0;i<4;i++){ + I2C_add = 0xA0 + i*2; + error = OT07_read_register(I2C_add,0xff,data,1); + + if(error == 0){ + if(data[0] == 0x30){ + + OT07[device_count].I2C_address = I2C_add; + + OT07_read_register(I2C_add,OT07_ROM_ID,data,8); + for(j=7;j>=0;j--){ + OT07[device_count].rom_id[j] = data[j]; + + } + device_count++; + } + } + + } + return device_count; +} + +// ***************************************************************************** +// convert_temperature(char) sends convert command to OT07 device +// char I2C address +// ***************************************************************************** + +void convert_temperature(char I2C_add){ // set convert bit to start conversion + + char data[2]; + + //read ADC_SETUP register 0x14 + OT07_read_register(I2C_add, OT07_ADC_SETUP,data,1); + + //mask convert register value with 0x01 and write back register 0x14 + OT07_write_register(I2C_add, OT07_ADC_SETUP, data[0]|0x01); +} + +//****************************************************************************** +// get_temperature(char) read temperature from OT07 device FIFO register +// char I2C address +// returns double temperature in oC +//****************************************************************************** + +double get_temperature(char I2C_add){ + char data[2]; + double T; + int count; + + OT07_read_register(I2C_add,OT07_FIFO_DATA,data,2); // Read temperature from FIFO, 2 bytes + //if(DEBUG)db.printf("get_temperature -- FIFO[%02X %02X]\r\n",data[0],data[1]); + //calculate temperture from data + count = (int)(data[0]*256 + data[1]); + if (count >= 32768)count = count - 65536; // 2s comp + T = (double)count*0.005; + + return T; +} + +// ***************************************************************************** // alarm_search(char *) pointer to start of 2D array rom_id_list // returns number of devices found with alarm triggered // ***************************************************************************** @@ -1009,7 +1147,7 @@ int main() { - + OT07_struct OT07[4]; // structure that holds I2C address and ROM_ID char data[130]; int device_count = 0; // number of OW devices found by search_rom() int i; @@ -1057,21 +1195,22 @@ // reset DS2484 - data[0] = 0xE1; - data[1] = 0xF0; - i2c.write(DS2484_ADD,data,1,1); - i2c.read(DS2484_ADD,data,1); + //data[0] = 0xE1; + //data[1] = 0xF0; + //i2c.write(DS2484_ADD,data,1,1); + //i2c.read(DS2484_ADD,data,1); // ****************** search for all OW devices on bus ***************** - device_count = search_rom(rom_id_list); + //device_count = search_rom(rom_id_list); + device_count = search_I2C_bus(OT07); - for(j=0;j<device_count;j++){ + /*for(j=0;j<device_count;j++){ for(k=0;k<8;k++){ device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list } set_test_mode(device_id); - } + }*/ rx_index = 0; //character buffer index for input from PC @@ -1106,6 +1245,21 @@ FILE *fp = fopen(log_file, "a"); if (fp != NULL) { + fprintf(fp,"Device List\r\n"); + fprintf(fp,"Device Number, ROM Code\r\n"); + for(j=0;j<device_count;j++) + { + if(device_logged[j]) + { + fprintf(fp,"%d,0x",j); + for(i=7;i>=0;i--) + { + fprintf(fp,"%02X",rom_id_list[j][i]); + } + fprintf(fp,"\r\n"); + } + } + fprintf(fp, "Time(s)"); for(j=0;j<device_count;j++) @@ -1154,7 +1308,7 @@ case 'a': case 'A': // alarm search // ****************** search for all OW devices with alarm triggered on bus ***************** - + /* device_count = alarm_search(rom_id_list); pc.printf("%d devices:\r\n", device_count); @@ -1164,7 +1318,7 @@ pc.printf("%02X",rom_id_list[j][i]); } pc.printf("]\r\n"); - } + } */ break; case 'c': case 'C': @@ -1197,20 +1351,6 @@ pc.printf("y\r\n"); else pc.printf("n\r\n"); - /*apply_settings_file(device_logged, log_interval); - pc.printf("Interval: %d\r\n", log_interval); - bool no_devices = true; - for(i = 0; i < MAX_DEVICES; i ++) - { - if(device_logged[i]) - { - pc.printf("Device %d is being logged.\r\n", i); - no_devices = false; - } - - } - if(no_devices) - pc.printf("No devices being logged.\r\n", i);*/ break; case 'g': case 'G': @@ -1242,7 +1382,10 @@ write_settings_file(log_interval, device_logged); break; case 'l': - case 'L': // Toggle logging + case 'L': + + /* + // Toggle logging if(log_flag == false){ //start logging if(SDDetect)//if SD card not detected @@ -1276,11 +1419,11 @@ }else{ //pc.printf("<stop logging>\r\n"); log_flag = false; - } + }*/ break; case 'P': case 'p': // power down One Wire buss - if(n == 2){ + /*if(n == 2){ if (device == 0){ // power down mode ON. data[0] = WDC; // 0xD2 Write Device Config data[1] = 0xD2; // 1101 0010 set 1WS = 0, SPU = 0, PDN = 1, APU = 0 @@ -1292,44 +1435,39 @@ i2c.write(DS2484_ADD,data,2,0); pc.printf("<Power up DQ>\r\n"); } - } + }*/ break; case 'r': - case 'R': //read register "r device radd.start radd.end" - for(k=0;k<8;k++){ - device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list - } + case 'R': + //read register "r device radd.start radd.end" if(n==3){ //read single register from selected device - read_OW_register(device_id,arg1,1,data); - pc.printf("device[%02X] add[%02X] data[%02X] crc[%02X %02X]\r\n",device,arg1,data[0],data[1],data[2]); + OT07_read_register(OT07[device].I2C_address,arg1,data,1); + pc.printf("device[%02X] add[%02X] data[%02X] crc[FF FF]\r\n",device,arg1,data[0]); } if(n==4){ //read a range of regesters from selected device num_bytes = arg2-arg1 + 1; // calculate number of bytes to read if (num_bytes < 1) num_bytes = 1; // if arg2 <= arg 1 just read arg1 address. - read_OW_register(device_id,arg1,num_bytes,data); + OT07_read_register(OT07[device].I2C_address,arg1,data,num_bytes); for(i=0;i<num_bytes;i++){ pc.printf("\r\ndevice[%02X] add[%02X] data[%02X]",device,arg1+i,data[i]); - } - pc.printf(" crc[%02X %02X]\r\n",data[i],data[i+1]); + } } break; case 's': case 'S': // search rom - // ****************** search for all OW devices on bus ***************** - - device_count = search_rom(rom_id_list); - - // print out rom codes found - //pc.printf("\r\nsearch rom\r\n"); + // ****************** search for I2C devices on bus ***************** + //NOTE: MUST ADD I2C ADDRESS TODO + device_count = search_I2C_bus(OT07); pc.printf("%d devices:\r\n", device_count); for(j=0;j<device_count;j++){ pc.printf("device[%02X] rom id[",j); for(i=7;i>=0;i--){ - pc.printf("%02X",rom_id_list[j][i]); + pc.printf("%02X",OT07[j].rom_id[i]); } pc.printf("]\r\n"); } + break; case 'T': @@ -1354,21 +1492,39 @@ pc.printf("device[%02X] temperature[%.3f]\r\n",j,get_temperature(device_id)); } } + + + if(n == 2){//get temperatures from selected device + + convert_temperature(OT07[device].I2C_address); //send OW convert selected device + wait(0.02); //wait 20 ms for convert temperature to complete + T[device] = get_temperature(OT07[device].I2C_address); + pc.printf("device[%02X] temperature[%.3f]\r\n",device,T[device]); + } + + if(n == 3){ // "t 1 3" get temperature for devices 1 thru 3 + //sprintf(str,"%x",arg1); //convert arg1 input as hex to decimal i.e. 0x10 becomes 10 dec + //sscanf(str,"%d",&arg1); + //IS THIS NEEDED? ^^^ + + for(j=device;j<=arg1;j++){ + convert_temperature(OT07[j].I2C_address); //send convert to all devices + wait(0.02); //wait 20ms for convert temperature to complete + T[j] = get_temperature(OT07[j].I2C_address); + } + + for(j=device;j<=arg1;j++){ + pc.printf("device[%02X] temperature[%.3f]\r\n",j,T[j]); + } + } + break; case 'w': - case 'W': //write register "w device w.addr data" - for(k=0;k<8;k++){ - device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list - } - data[0] = arg2; - write_OW_register(device_id, arg1, 1, data); + case 'W': //write register "w device w.addr data" - pc.printf("write -- device[%02X] add[%02X] data[%02X] ",device,arg1,arg2); - - // get CRC - pc.printf("crc[%02X %02X]\r\n",data[0],data[1]); - + OT07_write_register(OT07[device].I2C_address,arg1, arg2); + pc.printf("write -- device[%02X] add[%02X] data[%02X] crc[FF FF]\r\n",device,arg1,arg2); break; case 'x':