PICO I2C FW

Dependencies:   USBDevice

Revision:
17:401a5bb8d403
Parent:
16:2f373d3c8214
Child:
18:d913ec9dd9c2
--- 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,&reg_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':