Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem max32630fthr USBDevice
Fork of FTHR_SD_Demo by
Diff: main.cpp
- 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,®_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':
