PICO I2C FW

Dependencies:   USBDevice

Committer:
cyberjoey
Date:
Fri Jun 29 17:44:11 2018 +0000
Revision:
9:36ba3626aab7
Parent:
6:96d8d823e292
Child:
10:148da21c297e
flash logging working but without settings.txt interface

Who changed what in which revision?

UserRevisionLine numberNew contents of line
switches 0:60a522ae2e35 1 #include "mbed.h"
switches 1:90313362ec11 2 #include "SDFileSystem.h"
cyberjoey 9:36ba3626aab7 3 #include "max32630fthr.h"
cyberjoey 9:36ba3626aab7 4 #include "USBSerial.h"
switches 0:60a522ae2e35 5
cyberjoey 9:36ba3626aab7 6
cyberjoey 9:36ba3626aab7 7 #define I2C_ADDRESS 0x30 // DS2484 I2C address
cyberjoey 9:36ba3626aab7 8 #define DS2484_ADD 0x30 // DS2484 I2C write address
cyberjoey 9:36ba3626aab7 9
cyberjoey 9:36ba3626aab7 10
cyberjoey 9:36ba3626aab7 11 #define PERIOD 10 // Logging period in seconds
cyberjoey 9:36ba3626aab7 12
cyberjoey 9:36ba3626aab7 13 //DS2484 Status register bits
cyberjoey 9:36ba3626aab7 14 #define OWB 0x01 // status reg, One Wire Busy
cyberjoey 9:36ba3626aab7 15 #define PPD 0x02 // status reg, Presence Pulse Detected
cyberjoey 9:36ba3626aab7 16 #define SD 0x04 // status reg, Short Detected
cyberjoey 9:36ba3626aab7 17 #define LL 0x08 // status reg, Logic Level
cyberjoey 9:36ba3626aab7 18 #define RST 0x10 // status reg, Device Reset (DS2484 Reset)
cyberjoey 9:36ba3626aab7 19 #define SBR 0x20 // status reg, Single Bit Result
cyberjoey 9:36ba3626aab7 20 #define TSB 0x40 // status reg, Triplet Second Bit
cyberjoey 9:36ba3626aab7 21 #define DIR 0x80 // status reg, Branch Direction Taken
cyberjoey 9:36ba3626aab7 22 //DS2484 Command bytes
cyberjoey 9:36ba3626aab7 23 #define RESET 0xF0 // DS2484 Reset
cyberjoey 9:36ba3626aab7 24 #define SRP 0xE1 // DS2484 Set Read Pointer
cyberjoey 9:36ba3626aab7 25 #define WDC 0xD2 // DS2484 Write Device Configuration
cyberjoey 9:36ba3626aab7 26 #define ACP 0xC3 // DS2484 Adjust one wire Control Port
cyberjoey 9:36ba3626aab7 27 #define OW_RESET 0xB4 // DS2484 One Wire Reset
cyberjoey 9:36ba3626aab7 28 #define OW_SB 0x87 // One Wire Single Bit (write or read)
cyberjoey 9:36ba3626aab7 29 #define OWWB 0xA5 // One Wire Write Byte
cyberjoey 9:36ba3626aab7 30 #define OWRB 0x96 // One Wire Read Byte
cyberjoey 9:36ba3626aab7 31 #define OWT 0x78 // One Wire Triplet (read 2 bits, write 1 bit)
cyberjoey 9:36ba3626aab7 32 //One Wire Commands
cyberjoey 9:36ba3626aab7 33 #define OW_SEARCH 0xF0 // Search Rom
cyberjoey 9:36ba3626aab7 34 #define OW_READ 0x33 // Read Rom
cyberjoey 9:36ba3626aab7 35 #define OW_MATCH 0x55 // Match Rom
cyberjoey 9:36ba3626aab7 36 #define OW_SKIP 0xCC // Skip Rom
cyberjoey 9:36ba3626aab7 37 #define OW_OD_MATCH 0x69 // Match Rom
cyberjoey 9:36ba3626aab7 38 #define OW_OD_SKIP 0x3C // Skip Rom
cyberjoey 9:36ba3626aab7 39 #define OW_ALARM 0xEC // Alarm Search
cyberjoey 9:36ba3626aab7 40 // OT07 OW commands
cyberjoey 9:36ba3626aab7 41 #define OT07_OW_CONVERT 0x44 //OT07 OW convert temperature command
cyberjoey 9:36ba3626aab7 42 #define OT07_OW_WRITE 0xCC // OT07 OW Write Register command
cyberjoey 9:36ba3626aab7 43 #define OT07_OW_READ 0x33 // OT07 OW Read Register command
cyberjoey 9:36ba3626aab7 44 #define OT07_OW_RESET 0x82 // OT07 OW Soft Reset command
switches 3:247c750f9f3d 45
cyberjoey 9:36ba3626aab7 46 //OT07 Registers
cyberjoey 9:36ba3626aab7 47 #define OT07_STATUS 0x00 // OT07 status regiter
cyberjoey 9:36ba3626aab7 48 #define OT07_INT_EN 0x01 // OT07 Interrupt Enable
cyberjoey 9:36ba3626aab7 49 #define OT07_FIFO_W 0x04 // OT07 FIFO Write Pointer
cyberjoey 9:36ba3626aab7 50 #define OT07_FIFO_R 0x05 // OT07 FIFO Read Pointer
cyberjoey 9:36ba3626aab7 51 #define OT07_FIFO_OF 0x06 // OT07 FIFO Overflow Counter
cyberjoey 9:36ba3626aab7 52 #define OT07_FIFO_COUNT 0x07 // OT07 FIFO Data Count
cyberjoey 9:36ba3626aab7 53 #define OT07_FIFO_DATA 0x08 // OT07 FIFO Data
cyberjoey 9:36ba3626aab7 54 #define OT07_FIFO_CNFG1 0x09 // OT07 FIFO Configuration 1 (FIFO_A_FULL)
cyberjoey 9:36ba3626aab7 55 #define OT07_FIFO_CNFG2 0x0A // OT07 FIFO Configuration 2
cyberjoey 9:36ba3626aab7 56 #define OT07_SYS 0x0C // OT07 System Configuration
cyberjoey 9:36ba3626aab7 57 #define OT07_ALARM_HIGH_MSB 0x10 // OT07 Alarm High MSB
cyberjoey 9:36ba3626aab7 58 #define OT07_ALARM_HIGH_LSB 0x11 // OT07 Alarm High LSB
cyberjoey 9:36ba3626aab7 59 #define OT07_ALARM_LOW_MSB 0x12 // OT07 Alarm Low MSB
cyberjoey 9:36ba3626aab7 60 #define OT07_ALARM_LOW_LSB 0x13 // OT07 Alarm LOW LSB
cyberjoey 9:36ba3626aab7 61 #define OT07_ADC_BITS 0x14 // OT07 Temp Seneor Setup (ADC_RES[7:6])
cyberjoey 9:36ba3626aab7 62 #define OT07_GPIO_SETUP 0x20 // OT07 GPIO Setup, sets GPIO modes
cyberjoey 9:36ba3626aab7 63 #define Ot07_GPIO_CTRL 0x21 // OT07 GPIO control
cyberjoey 9:36ba3626aab7 64 #define OT07_ROM_ID 0x30 // OT07 ROM_ID address of LSB?
cyberjoey 9:36ba3626aab7 65
cyberjoey 9:36ba3626aab7 66
cyberjoey 9:36ba3626aab7 67 #define MAX_DEVICES 64 // Maximum number of rom devices allowed
cyberjoey 9:36ba3626aab7 68 #define ID_LENGTH 8 // Rom ID length in bytes
cyberjoey 9:36ba3626aab7 69
cyberjoey 9:36ba3626aab7 70
cyberjoey 9:36ba3626aab7 71 #define BS 8 // ASCII Back Space
cyberjoey 9:36ba3626aab7 72 #define CR 13 // ASCII Carriage Return
cyberjoey 9:36ba3626aab7 73
cyberjoey 9:36ba3626aab7 74 //global variable
cyberjoey 9:36ba3626aab7 75
cyberjoey 9:36ba3626aab7 76 //******************** init Feather Boared Hardware ***********************
cyberjoey 9:36ba3626aab7 77
cyberjoey 9:36ba3626aab7 78 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
cyberjoey 9:36ba3626aab7 79
cyberjoey 9:36ba3626aab7 80 //microSD logging file system setup
cyberjoey 9:36ba3626aab7 81 SDFileSystem sd(P0_5, P0_6, P0_4, P0_7, "sd"); // mosi, miso, sclk, cs
cyberjoey 9:36ba3626aab7 82
cyberjoey 9:36ba3626aab7 83 //SD card insertion detection pin
cyberjoey 9:36ba3626aab7 84 DigitalIn SDDetect(P2_2, PullUp);
cyberjoey 9:36ba3626aab7 85
cyberjoey 9:36ba3626aab7 86
cyberjoey 9:36ba3626aab7 87 // Virtual serial port over USB
cyberjoey 9:36ba3626aab7 88 //USBSerial pc;
cyberjoey 9:36ba3626aab7 89 USBSerial pc(0x0B6A, 0x0042, 0x0001, true);
cyberjoey 9:36ba3626aab7 90
cyberjoey 9:36ba3626aab7 91 // I2C setup
cyberjoey 9:36ba3626aab7 92 I2C i2c(P3_4,P3_5); // P3_4 -> I2C1_SDA, P3_5-> I2C1_SCL
cyberjoey 9:36ba3626aab7 93
cyberjoey 9:36ba3626aab7 94 //Timer setup
cyberjoey 9:36ba3626aab7 95 Ticker timer_1; // timer for blinking led heartbeat
cyberjoey 9:36ba3626aab7 96
cyberjoey 9:36ba3626aab7 97 bool tick_flag; // used for counting seconds
cyberjoey 9:36ba3626aab7 98 bool log_flag = false;
cyberjoey 9:36ba3626aab7 99 bool led_toggle_flag = false;
cyberjoey 9:36ba3626aab7 100 bool button_flag = false;
cyberjoey 9:36ba3626aab7 101 bool error_flag;
cyberjoey 9:36ba3626aab7 102 int error_ticks;
cyberjoey 9:36ba3626aab7 103
cyberjoey 9:36ba3626aab7 104 //LED blink setup
switches 1:90313362ec11 105 DigitalOut rLED(LED1);
switches 1:90313362ec11 106 DigitalOut gLED(LED2);
cyberjoey 9:36ba3626aab7 107 DigitalOut bLED(LED3);
switches 0:60a522ae2e35 108
cyberjoey 9:36ba3626aab7 109 InterruptIn button(SW1);
cyberjoey 9:36ba3626aab7 110
cyberjoey 9:36ba3626aab7 111
cyberjoey 9:36ba3626aab7 112 void LED_blink_callback(){ // LED Heart beat
cyberjoey 9:36ba3626aab7 113
cyberjoey 9:36ba3626aab7 114 led_toggle_flag = !led_toggle_flag;
cyberjoey 9:36ba3626aab7 115
cyberjoey 9:36ba3626aab7 116 if(log_flag) //if logging
cyberjoey 9:36ba3626aab7 117 {
cyberjoey 9:36ba3626aab7 118
cyberjoey 9:36ba3626aab7 119 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 120 {
cyberjoey 9:36ba3626aab7 121 //toggle red led
cyberjoey 9:36ba3626aab7 122 rLED = LED_ON;
cyberjoey 9:36ba3626aab7 123 }
cyberjoey 9:36ba3626aab7 124 else
cyberjoey 9:36ba3626aab7 125 {
cyberjoey 9:36ba3626aab7 126 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 127 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 128 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 129 }
cyberjoey 9:36ba3626aab7 130 }
cyberjoey 9:36ba3626aab7 131 else if(error_flag) //if error (no sd card)
cyberjoey 9:36ba3626aab7 132 {
cyberjoey 9:36ba3626aab7 133 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 134 {
cyberjoey 9:36ba3626aab7 135 //toggle red led
cyberjoey 9:36ba3626aab7 136 rLED = LED_ON;
cyberjoey 9:36ba3626aab7 137 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 138 }
cyberjoey 9:36ba3626aab7 139 else
cyberjoey 9:36ba3626aab7 140 {
cyberjoey 9:36ba3626aab7 141 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 142 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 143 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 144 }
cyberjoey 9:36ba3626aab7 145 error_ticks--;
cyberjoey 9:36ba3626aab7 146 if(error_ticks <= 0)
cyberjoey 9:36ba3626aab7 147 error_flag = false;
cyberjoey 9:36ba3626aab7 148 }
cyberjoey 9:36ba3626aab7 149 else
cyberjoey 9:36ba3626aab7 150 {
cyberjoey 9:36ba3626aab7 151 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 152 {
cyberjoey 9:36ba3626aab7 153 //toggle teal leds
cyberjoey 9:36ba3626aab7 154 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 155 bLED = LED_ON;
cyberjoey 9:36ba3626aab7 156 }
cyberjoey 9:36ba3626aab7 157 else
cyberjoey 9:36ba3626aab7 158 {
cyberjoey 9:36ba3626aab7 159 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 160 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 161 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 162 }
cyberjoey 9:36ba3626aab7 163 }
cyberjoey 9:36ba3626aab7 164
cyberjoey 9:36ba3626aab7 165 tick_flag = true;
cyberjoey 9:36ba3626aab7 166 }
cyberjoey 9:36ba3626aab7 167
cyberjoey 9:36ba3626aab7 168 void btn_pressed() //button pressed isr
cyberjoey 9:36ba3626aab7 169 {
cyberjoey 9:36ba3626aab7 170 button_flag = true;
cyberjoey 9:36ba3626aab7 171 }
cyberjoey 9:36ba3626aab7 172
cyberjoey 9:36ba3626aab7 173 /*
cyberjoey 9:36ba3626aab7 174 void take_data_flag_callback(){ // set data sample time flag
cyberjoey 9:36ba3626aab7 175
cyberjoey 9:36ba3626aab7 176 take_data_flag = true;
cyberjoey 9:36ba3626aab7 177 }
cyberjoey 9:36ba3626aab7 178 */
cyberjoey 9:36ba3626aab7 179
cyberjoey 9:36ba3626aab7 180 // *****************************************************************************
cyberjoey 9:36ba3626aab7 181 // Define CRC-8 Table
cyberjoey 9:36ba3626aab7 182 // *****************************************************************************
cyberjoey 9:36ba3626aab7 183
cyberjoey 9:36ba3626aab7 184 static unsigned char crc_table[] = {
cyberjoey 9:36ba3626aab7 185 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
cyberjoey 9:36ba3626aab7 186 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
cyberjoey 9:36ba3626aab7 187 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
cyberjoey 9:36ba3626aab7 188 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
cyberjoey 9:36ba3626aab7 189 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
cyberjoey 9:36ba3626aab7 190 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
cyberjoey 9:36ba3626aab7 191 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
cyberjoey 9:36ba3626aab7 192 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
cyberjoey 9:36ba3626aab7 193 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
cyberjoey 9:36ba3626aab7 194 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
cyberjoey 9:36ba3626aab7 195 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
cyberjoey 9:36ba3626aab7 196 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
cyberjoey 9:36ba3626aab7 197 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
cyberjoey 9:36ba3626aab7 198 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
cyberjoey 9:36ba3626aab7 199 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
cyberjoey 9:36ba3626aab7 200 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
cyberjoey 9:36ba3626aab7 201
cyberjoey 9:36ba3626aab7 202
cyberjoey 9:36ba3626aab7 203
cyberjoey 9:36ba3626aab7 204 // -----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 205 // Calculate the CRC8 of the byte value provided with the current total
cyberjoey 9:36ba3626aab7 206 // calc_crc8(unsigned char, unsigned char) crc8 total, byte to add
cyberjoey 9:36ba3626aab7 207 // pass crc8 total = 0 to start new crc sum.
cyberjoey 9:36ba3626aab7 208
cyberjoey 9:36ba3626aab7 209 // Returns new crc8 total
cyberjoey 9:36ba3626aab7 210 // -----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 211
cyberjoey 9:36ba3626aab7 212 unsigned char calc_crc8(unsigned char crc8, unsigned char value){
cyberjoey 9:36ba3626aab7 213
cyberjoey 9:36ba3626aab7 214 return crc_table[crc8 ^ value];
cyberjoey 9:36ba3626aab7 215 }
cyberjoey 9:36ba3626aab7 216
cyberjoey 9:36ba3626aab7 217 // *****************************************************************************
cyberjoey 9:36ba3626aab7 218 // OW_reset()
cyberjoey 9:36ba3626aab7 219 // returns 0 no device present, 1 device present
cyberjoey 9:36ba3626aab7 220 // *****************************************************************************
cyberjoey 9:36ba3626aab7 221
cyberjoey 9:36ba3626aab7 222 int OW_reset(){
cyberjoey 9:36ba3626aab7 223 char data[2]; // define as minimun array size so 'data' is a pointer
cyberjoey 9:36ba3626aab7 224 data[0] = OW_RESET; // One Wire Reset 0xB4
cyberjoey 9:36ba3626aab7 225 i2c.write(DS2484_ADD,data,1,0); // write reset command to DS2484
cyberjoey 9:36ba3626aab7 226 wait_ms(1);
cyberjoey 9:36ba3626aab7 227 do{ // poll OW-busy
cyberjoey 9:36ba3626aab7 228 i2c.read(DS2484_ADD,data,1); // read back status byte from DS2484
cyberjoey 9:36ba3626aab7 229 }while(OWB & data[0]);
cyberjoey 9:36ba3626aab7 230 if(PPD & data[0])return 1; // Presence Pulse Detected bit true?
cyberjoey 9:36ba3626aab7 231 return 0; // else
cyberjoey 9:36ba3626aab7 232 } // end OW_reset()
cyberjoey 9:36ba3626aab7 233
cyberjoey 9:36ba3626aab7 234 // *****************************************************************************
cyberjoey 9:36ba3626aab7 235 // OW_write_byte(char) takes char to send over one wire
cyberjoey 9:36ba3626aab7 236 // returns DS2484 status byte
cyberjoey 9:36ba3626aab7 237 // *****************************************************************************
cyberjoey 9:36ba3626aab7 238
cyberjoey 9:36ba3626aab7 239 char OW_write_byte(char byte){
cyberjoey 9:36ba3626aab7 240
cyberjoey 9:36ba3626aab7 241 char data[2];
cyberjoey 9:36ba3626aab7 242 data[0] = 0xA5;
cyberjoey 9:36ba3626aab7 243 data[1] = byte;
cyberjoey 9:36ba3626aab7 244 i2c.write(DS2484_ADD,data,2,1);
cyberjoey 9:36ba3626aab7 245 i2c.read(DS2484_ADD,data,1); // read status byte
cyberjoey 9:36ba3626aab7 246
cyberjoey 9:36ba3626aab7 247 // db.printf("[%02X]",byte);
cyberjoey 9:36ba3626aab7 248 wait_us(700); // assumes normal speed OW write
cyberjoey 9:36ba3626aab7 249 return data[0]; // return DS2484 Status byte
cyberjoey 9:36ba3626aab7 250
cyberjoey 9:36ba3626aab7 251 }// end OW_write_byte()
cyberjoey 9:36ba3626aab7 252
cyberjoey 9:36ba3626aab7 253
cyberjoey 9:36ba3626aab7 254 // *****************************************************************************
cyberjoey 9:36ba3626aab7 255 // OW_read_byte(char *, int) char* (save data pointer)
cyberjoey 9:36ba3626aab7 256 // int (number of bytes to read)
cyberjoey 9:36ba3626aab7 257 // returns 0x00
cyberjoey 9:36ba3626aab7 258 //
cyberjoey 9:36ba3626aab7 259 // assumes OW_reset, OW_match rom, and OW device register read address already sent.
cyberjoey 9:36ba3626aab7 260 //
cyberjoey 9:36ba3626aab7 261 // *****************************************************************************
cyberjoey 9:36ba3626aab7 262
cyberjoey 9:36ba3626aab7 263 char OW_read_byte(char* a, int n){
cyberjoey 9:36ba3626aab7 264
cyberjoey 9:36ba3626aab7 265 char data[2];
cyberjoey 9:36ba3626aab7 266 int i;
cyberjoey 9:36ba3626aab7 267
cyberjoey 9:36ba3626aab7 268 //read n bytes of data
cyberjoey 9:36ba3626aab7 269 i=0;
cyberjoey 9:36ba3626aab7 270 do{
cyberjoey 9:36ba3626aab7 271 data[0] = OWRB; // send 0x96; DS2484 command, OW read byte
cyberjoey 9:36ba3626aab7 272 i2c.write(DS2484_ADD,data,1,0);
cyberjoey 9:36ba3626aab7 273 wait_us(600);
cyberjoey 9:36ba3626aab7 274 do{
cyberjoey 9:36ba3626aab7 275 i2c.read(DS2484_ADD,data,1); // read status byte and test OW-busy?
cyberjoey 9:36ba3626aab7 276 }while(data[0]&0x01 == 1); // status bit[0] set --> OW busy
cyberjoey 9:36ba3626aab7 277
cyberjoey 9:36ba3626aab7 278 //get byte from DS2484
cyberjoey 9:36ba3626aab7 279 data[0] = SRP; // send 0xE1, set read pointer
cyberjoey 9:36ba3626aab7 280 data[1] = 0xE1; // set read pointer address 0xE1 read OW data
cyberjoey 9:36ba3626aab7 281 i2c.write(DS2484_ADD,data,2,1);
cyberjoey 9:36ba3626aab7 282 i2c.read(DS2484_ADD,data,1); // read bytes from OW register
cyberjoey 9:36ba3626aab7 283
cyberjoey 9:36ba3626aab7 284 a[i] = data[0];
cyberjoey 9:36ba3626aab7 285
cyberjoey 9:36ba3626aab7 286 i++;
cyberjoey 9:36ba3626aab7 287 //pc.printf("[%02X] ",data[0]);
cyberjoey 9:36ba3626aab7 288 }while(i<n);
cyberjoey 9:36ba3626aab7 289 //for(i=0;i<n;i++) db.printf("OW_read_byte - [%2d][%02X]\r\n",i,a[i]);
cyberjoey 9:36ba3626aab7 290 return 0x00;
cyberjoey 9:36ba3626aab7 291 }// end OW_read_byte()
cyberjoey 9:36ba3626aab7 292
cyberjoey 9:36ba3626aab7 293
cyberjoey 9:36ba3626aab7 294
cyberjoey 9:36ba3626aab7 295 // *****************************************************************************
cyberjoey 9:36ba3626aab7 296 // OW_match_rom(char *) pointer to device_id byte array
cyberjoey 9:36ba3626aab7 297 // returns 0x00
cyberjoey 9:36ba3626aab7 298 // assumes OW_reset alread sent
cyberjoey 9:36ba3626aab7 299 // *****************************************************************************
cyberjoey 9:36ba3626aab7 300
cyberjoey 9:36ba3626aab7 301 char OW_match_rom(char *device_id){
cyberjoey 9:36ba3626aab7 302
cyberjoey 9:36ba3626aab7 303 int i;
cyberjoey 9:36ba3626aab7 304 //Match rom
cyberjoey 9:36ba3626aab7 305 OW_write_byte(OW_MATCH); // send 0x55, match rom command
cyberjoey 9:36ba3626aab7 306 //send rom code for device
cyberjoey 9:36ba3626aab7 307 for(i=0;i<8;i++){
cyberjoey 9:36ba3626aab7 308 OW_write_byte(device_id[i]); //I2C write ow byte
cyberjoey 9:36ba3626aab7 309 }
cyberjoey 9:36ba3626aab7 310 return 0x00;
cyberjoey 9:36ba3626aab7 311
cyberjoey 9:36ba3626aab7 312 }// end OW_macth_rom
cyberjoey 9:36ba3626aab7 313
cyberjoey 9:36ba3626aab7 314
cyberjoey 9:36ba3626aab7 315 // *****************************************************************************
cyberjoey 9:36ba3626aab7 316 // search_rom(char *) pointer to start of 2D array rom_id_list
cyberjoey 9:36ba3626aab7 317 // returns number of devices found
cyberjoey 9:36ba3626aab7 318 // *****************************************************************************
cyberjoey 9:36ba3626aab7 319
cyberjoey 9:36ba3626aab7 320
cyberjoey 9:36ba3626aab7 321 int search_rom(char rom_id_list[MAX_DEVICES][ID_LENGTH]){ // searches for all device on OW bus, returns # found
cyberjoey 9:36ba3626aab7 322
cyberjoey 9:36ba3626aab7 323 int bit_num;
cyberjoey 9:36ba3626aab7 324 int byte_num;
cyberjoey 9:36ba3626aab7 325 int last_zero;
cyberjoey 9:36ba3626aab7 326 int last_discrep;
cyberjoey 9:36ba3626aab7 327 int search_dir;
cyberjoey 9:36ba3626aab7 328 int rom_count;
cyberjoey 9:36ba3626aab7 329 char byte_mask;
cyberjoey 9:36ba3626aab7 330 int last_device;
cyberjoey 9:36ba3626aab7 331 int i;
cyberjoey 9:36ba3626aab7 332
cyberjoey 9:36ba3626aab7 333 char rom_id[8]; //used in rom search
cyberjoey 9:36ba3626aab7 334 char data[8];
cyberjoey 9:36ba3626aab7 335 char crc;
cyberjoey 9:36ba3626aab7 336
cyberjoey 9:36ba3626aab7 337 //init for first search only
cyberjoey 9:36ba3626aab7 338 last_device = 0;
cyberjoey 9:36ba3626aab7 339 last_discrep = 0;
cyberjoey 9:36ba3626aab7 340 rom_count = 0;
cyberjoey 9:36ba3626aab7 341
cyberjoey 9:36ba3626aab7 342 for(i=0;i<8;i++)rom_id[i] = 0x00; //clear rom_id
cyberjoey 9:36ba3626aab7 343
cyberjoey 9:36ba3626aab7 344 do{ // loop for each rom search (end when last_device = 1)
cyberjoey 9:36ba3626aab7 345 //db.printf("\r\nsearch next rom [%2d]",rom_count);
cyberjoey 9:36ba3626aab7 346
cyberjoey 9:36ba3626aab7 347 //init variable for each search
cyberjoey 9:36ba3626aab7 348 bit_num = 1;
cyberjoey 9:36ba3626aab7 349 byte_num = 0;
cyberjoey 9:36ba3626aab7 350 byte_mask = 1;
cyberjoey 9:36ba3626aab7 351 last_zero = 0;
cyberjoey 9:36ba3626aab7 352
cyberjoey 9:36ba3626aab7 353
cyberjoey 9:36ba3626aab7 354 //OW reset
cyberjoey 9:36ba3626aab7 355 if(OW_reset()){ //returns 1 if at least one device present
cyberjoey 9:36ba3626aab7 356 //test if last device found
cyberjoey 9:36ba3626aab7 357 if(last_device!=1){ // more devices to find
cyberjoey 9:36ba3626aab7 358 search_dir = 0;
cyberjoey 9:36ba3626aab7 359 OW_write_byte(OW_SEARCH); //send 0xF0 over one wire to init search rom
cyberjoey 9:36ba3626aab7 360
cyberjoey 9:36ba3626aab7 361 do{
cyberjoey 9:36ba3626aab7 362 //determine search direction
cyberjoey 9:36ba3626aab7 363 if(bit_num < last_discrep){ //before last discrepancy
cyberjoey 9:36ba3626aab7 364 if((rom_id[byte_num] & byte_mask) > 0){// use last rom path
cyberjoey 9:36ba3626aab7 365 search_dir = 1; // last path was 1
cyberjoey 9:36ba3626aab7 366 }else{
cyberjoey 9:36ba3626aab7 367 search_dir = 0; // last path was 0
cyberjoey 9:36ba3626aab7 368 }
cyberjoey 9:36ba3626aab7 369 }else{ // at or past last discrepancy
cyberjoey 9:36ba3626aab7 370 if(bit_num == last_discrep){ // at last discrepancy
cyberjoey 9:36ba3626aab7 371 search_dir = 1; //been here before so use 1
cyberjoey 9:36ba3626aab7 372 }else{
cyberjoey 9:36ba3626aab7 373 search_dir = 0; //past last discrepancy so use 0
cyberjoey 9:36ba3626aab7 374 }
cyberjoey 9:36ba3626aab7 375 }
cyberjoey 9:36ba3626aab7 376
cyberjoey 9:36ba3626aab7 377 //write direction bit and get reply
cyberjoey 9:36ba3626aab7 378 data[0] = 0x78;
cyberjoey 9:36ba3626aab7 379 data[1] = search_dir << 7; //sets bit 7 of status reg to search_dir
cyberjoey 9:36ba3626aab7 380 i2c.write(DS2484_ADD,data,2,1);
cyberjoey 9:36ba3626aab7 381
cyberjoey 9:36ba3626aab7 382 wait_us(250);
cyberjoey 9:36ba3626aab7 383
cyberjoey 9:36ba3626aab7 384 //read in rom_id bits
cyberjoey 9:36ba3626aab7 385 i2c.read(DS2484_ADD,data,1); // read status byte
cyberjoey 9:36ba3626aab7 386
cyberjoey 9:36ba3626aab7 387 //(todo) check for no device error here
cyberjoey 9:36ba3626aab7 388
cyberjoey 9:36ba3626aab7 389 //get search direction used by triplet command
cyberjoey 9:36ba3626aab7 390
cyberjoey 9:36ba3626aab7 391 if(data[0]&0x80){ //true --> DIR bit = 1
cyberjoey 9:36ba3626aab7 392 search_dir = 1;
cyberjoey 9:36ba3626aab7 393 }else{
cyberjoey 9:36ba3626aab7 394 search_dir = 0;
cyberjoey 9:36ba3626aab7 395 }
cyberjoey 9:36ba3626aab7 396
cyberjoey 9:36ba3626aab7 397 //test for discrepancy (both 0 and 1 present at current bit number)(TSB = 0 (1's present) and SBR = 0 (0's present))
cyberjoey 9:36ba3626aab7 398 if(!(data[0] & 0x60)){ // true --> discrepancy exist, both TSB and SBR = 0
cyberjoey 9:36ba3626aab7 399 if(search_dir == 0)last_zero = bit_num;
cyberjoey 9:36ba3626aab7 400 }
cyberjoey 9:36ba3626aab7 401 if(search_dir == 1){ // write search dir to rom bit
cyberjoey 9:36ba3626aab7 402 rom_id[byte_num] |= byte_mask;
cyberjoey 9:36ba3626aab7 403 }else{
cyberjoey 9:36ba3626aab7 404 rom_id[byte_num] &= ~byte_mask;
cyberjoey 9:36ba3626aab7 405 }
cyberjoey 9:36ba3626aab7 406
cyberjoey 9:36ba3626aab7 407 //increment bit_num and byte_num if needed
cyberjoey 9:36ba3626aab7 408 bit_num++;
cyberjoey 9:36ba3626aab7 409 byte_mask <<= 1; //rotate 1 bit left
cyberjoey 9:36ba3626aab7 410 if(byte_mask == 0){ //if bit shifts out of byte set byte to 1
cyberjoey 9:36ba3626aab7 411 byte_num++; //also increnent byt num
cyberjoey 9:36ba3626aab7 412 byte_mask = 1;
cyberjoey 9:36ba3626aab7 413 }
cyberjoey 9:36ba3626aab7 414 // pc.printf("sdx[%d] lz[%2d] byte[%d] mask[%02X] bn[%d] ROM[%02X %02X %02X]\n\r",search_dir,last_zero,byte_num,byte_mask, byte_num, rom_id[2], rom_id[1], rom_id[0]);
cyberjoey 9:36ba3626aab7 415
cyberjoey 9:36ba3626aab7 416
cyberjoey 9:36ba3626aab7 417 }while(bit_num<65); //bit nun started at 1 so end after 64
cyberjoey 9:36ba3626aab7 418 last_discrep = last_zero;
cyberjoey 9:36ba3626aab7 419 if(last_discrep == 0)last_device = 1;
cyberjoey 9:36ba3626aab7 420 //copy rom_id into rom_id_list and calc crc of first 7 bytes
cyberjoey 9:36ba3626aab7 421 crc = 0x00; // reset crc8 total to 0
cyberjoey 9:36ba3626aab7 422 //db.printf(" -- rom id[ ");
cyberjoey 9:36ba3626aab7 423 for(i=7;i>=0;i--){
cyberjoey 9:36ba3626aab7 424 rom_id_list[rom_count][i] = rom_id[i] ;
cyberjoey 9:36ba3626aab7 425 //db.printf("%02X ",rom_id[i]);
cyberjoey 9:36ba3626aab7 426 }
cyberjoey 9:36ba3626aab7 427 //db.printf("]\r\n");
cyberjoey 9:36ba3626aab7 428 //db.printf("last_device[%2d]\r\n",last_device);
cyberjoey 9:36ba3626aab7 429 //db.printf("last_zero[%2d]\r\n",last_zero);
cyberjoey 9:36ba3626aab7 430 //db.printf("last_discrep[%2d]\r\n",last_discrep);
cyberjoey 9:36ba3626aab7 431
cyberjoey 9:36ba3626aab7 432 //clac_crc of rom ID
cyberjoey 9:36ba3626aab7 433 for (i=0;i<7;i++){
cyberjoey 9:36ba3626aab7 434 crc = calc_crc8(crc, rom_id[i]);
cyberjoey 9:36ba3626aab7 435 }
cyberjoey 9:36ba3626aab7 436 //db.printf("crc8 = [%02X]\r\n",crc);
cyberjoey 9:36ba3626aab7 437
cyberjoey 9:36ba3626aab7 438
cyberjoey 9:36ba3626aab7 439 rom_count++;
cyberjoey 9:36ba3626aab7 440 }//if(last_device..)
cyberjoey 9:36ba3626aab7 441 }else{//if prescent -- if no device present rom count is 0
cyberjoey 9:36ba3626aab7 442 return 0;
cyberjoey 9:36ba3626aab7 443 }
cyberjoey 9:36ba3626aab7 444 }while(last_device == 0);
cyberjoey 9:36ba3626aab7 445 return rom_count;
cyberjoey 9:36ba3626aab7 446 }// end search_rom()
cyberjoey 9:36ba3626aab7 447
cyberjoey 9:36ba3626aab7 448 // *****************************************************************************
cyberjoey 9:36ba3626aab7 449 // alarm_search(char *) pointer to start of 2D array rom_id_list
cyberjoey 9:36ba3626aab7 450 // returns number of devices found with alarm triggered
cyberjoey 9:36ba3626aab7 451 // *****************************************************************************
cyberjoey 9:36ba3626aab7 452
cyberjoey 9:36ba3626aab7 453 int alarm_search(char rom_id_list[MAX_DEVICES][ID_LENGTH]){ // searches for all devices with alarm triggered on OW bus, returns # found
switches 0:60a522ae2e35 454
cyberjoey 9:36ba3626aab7 455 int bit_num;
cyberjoey 9:36ba3626aab7 456 int byte_num;
cyberjoey 9:36ba3626aab7 457 int last_zero;
cyberjoey 9:36ba3626aab7 458 int last_discrep;
cyberjoey 9:36ba3626aab7 459 int search_dir;
cyberjoey 9:36ba3626aab7 460 int rom_count;
cyberjoey 9:36ba3626aab7 461 char byte_mask;
cyberjoey 9:36ba3626aab7 462 int last_device;
cyberjoey 9:36ba3626aab7 463 int i;
cyberjoey 9:36ba3626aab7 464
cyberjoey 9:36ba3626aab7 465 char rom_id[8]; //used in rom search
cyberjoey 9:36ba3626aab7 466 char data[8];
cyberjoey 9:36ba3626aab7 467 char crc;
cyberjoey 9:36ba3626aab7 468
cyberjoey 9:36ba3626aab7 469 //init for first search only
cyberjoey 9:36ba3626aab7 470 last_device = 0;
cyberjoey 9:36ba3626aab7 471 last_discrep = 0;
cyberjoey 9:36ba3626aab7 472 rom_count = 0;
cyberjoey 9:36ba3626aab7 473
cyberjoey 9:36ba3626aab7 474 for(i=0;i<8;i++)rom_id[i] = 0x00; //clear rom_id
cyberjoey 9:36ba3626aab7 475
cyberjoey 9:36ba3626aab7 476 do{ // loop for each rom search (end when last_device = 1)
cyberjoey 9:36ba3626aab7 477
cyberjoey 9:36ba3626aab7 478 //init variable for each search
cyberjoey 9:36ba3626aab7 479 bit_num = 1;
cyberjoey 9:36ba3626aab7 480 byte_num = 0;
cyberjoey 9:36ba3626aab7 481 byte_mask = 1;
cyberjoey 9:36ba3626aab7 482 last_zero = 0;
cyberjoey 9:36ba3626aab7 483
cyberjoey 9:36ba3626aab7 484
cyberjoey 9:36ba3626aab7 485 //OW reset
cyberjoey 9:36ba3626aab7 486 if(OW_reset()){ //returns 1 if at least one device present
cyberjoey 9:36ba3626aab7 487 //test if last device found
cyberjoey 9:36ba3626aab7 488 if(last_device!=1){ // more devices to find
cyberjoey 9:36ba3626aab7 489 search_dir = 0;
cyberjoey 9:36ba3626aab7 490 OW_write_byte(OW_ALARM); //send 0xEC over one wire to init alarm search
cyberjoey 9:36ba3626aab7 491
cyberjoey 9:36ba3626aab7 492 do{
cyberjoey 9:36ba3626aab7 493 //determine search direction
cyberjoey 9:36ba3626aab7 494 if(bit_num < last_discrep){ //before last discrepancy
cyberjoey 9:36ba3626aab7 495 if((rom_id[byte_num] & byte_mask) > 0){// use last rom path
cyberjoey 9:36ba3626aab7 496 search_dir = 1; // last path was 1
cyberjoey 9:36ba3626aab7 497 }else{
cyberjoey 9:36ba3626aab7 498 search_dir = 0; // last path was 0
cyberjoey 9:36ba3626aab7 499 }
cyberjoey 9:36ba3626aab7 500 }else{ // at or past last discrepancy
cyberjoey 9:36ba3626aab7 501 if(bit_num == last_discrep){ // at last discrepancy
cyberjoey 9:36ba3626aab7 502 search_dir = 1; //been here before so use 1
cyberjoey 9:36ba3626aab7 503 }else{
cyberjoey 9:36ba3626aab7 504 search_dir = 0; //past last discrepancy so use 0
cyberjoey 9:36ba3626aab7 505 }
cyberjoey 9:36ba3626aab7 506 }
cyberjoey 9:36ba3626aab7 507
cyberjoey 9:36ba3626aab7 508 //write direction bit and get reply
cyberjoey 9:36ba3626aab7 509 data[0] = 0x78;
cyberjoey 9:36ba3626aab7 510 data[1] = search_dir << 7; //sets bit 7 of status reg to search_dir
cyberjoey 9:36ba3626aab7 511 i2c.write(DS2484_ADD,data,2,1);
cyberjoey 9:36ba3626aab7 512
cyberjoey 9:36ba3626aab7 513 wait_us(250);
cyberjoey 9:36ba3626aab7 514
cyberjoey 9:36ba3626aab7 515 //read in rom_id bits
cyberjoey 9:36ba3626aab7 516 i2c.read(DS2484_ADD,data,1); // read status byte
cyberjoey 9:36ba3626aab7 517
cyberjoey 9:36ba3626aab7 518 //(todo) check for no device error here
cyberjoey 9:36ba3626aab7 519
cyberjoey 9:36ba3626aab7 520 //get search direction used by triplet command
cyberjoey 9:36ba3626aab7 521
cyberjoey 9:36ba3626aab7 522 if(data[0]&0x80){ //true --> DIR bit = 1
cyberjoey 9:36ba3626aab7 523 search_dir = 1;
cyberjoey 9:36ba3626aab7 524 }else{
cyberjoey 9:36ba3626aab7 525 search_dir = 0;
cyberjoey 9:36ba3626aab7 526 }
cyberjoey 9:36ba3626aab7 527
cyberjoey 9:36ba3626aab7 528 //test for discrepancy (both 0 and 1 present at current bit number)(TSB = 0 (1's present) and SBR = 0 (0's present))
cyberjoey 9:36ba3626aab7 529 if(!(data[0] & 0x60)){ // true --> discrepancy exist, both TSB and SBR = 0
cyberjoey 9:36ba3626aab7 530 if(search_dir == 0)last_zero = bit_num;
cyberjoey 9:36ba3626aab7 531 }
cyberjoey 9:36ba3626aab7 532 if(search_dir == 1){ // write search dir to rom bit
cyberjoey 9:36ba3626aab7 533 rom_id[byte_num] |= byte_mask;
cyberjoey 9:36ba3626aab7 534 }else{
cyberjoey 9:36ba3626aab7 535 rom_id[byte_num] &= ~byte_mask;
cyberjoey 9:36ba3626aab7 536 }
cyberjoey 9:36ba3626aab7 537
cyberjoey 9:36ba3626aab7 538 //increment bit_num and byte_num if needed
cyberjoey 9:36ba3626aab7 539 bit_num++;
cyberjoey 9:36ba3626aab7 540 byte_mask <<= 1; //rotate 1 bit left
cyberjoey 9:36ba3626aab7 541 if(byte_mask == 0){ //if bit shifts out of byte set byte to 1
cyberjoey 9:36ba3626aab7 542 byte_num++; //also increnent byt num
cyberjoey 9:36ba3626aab7 543 byte_mask = 1;
cyberjoey 9:36ba3626aab7 544 }
cyberjoey 9:36ba3626aab7 545
cyberjoey 9:36ba3626aab7 546
cyberjoey 9:36ba3626aab7 547 }while(bit_num<65); //bit nun started at 1 so end after 64
cyberjoey 9:36ba3626aab7 548 last_discrep = last_zero;
cyberjoey 9:36ba3626aab7 549 if(last_discrep == 0)last_device = 1;
cyberjoey 9:36ba3626aab7 550 //copy rom_id into rom_id_list and calc crc of first 7 bytes
cyberjoey 9:36ba3626aab7 551 crc = 0x00; // reset crc8 total to 0
cyberjoey 9:36ba3626aab7 552 //db.printf(" -- rom id[ ");
cyberjoey 9:36ba3626aab7 553 for(i=7;i>=0;i--){
cyberjoey 9:36ba3626aab7 554 rom_id_list[rom_count][i] = rom_id[i];
cyberjoey 9:36ba3626aab7 555 }
cyberjoey 9:36ba3626aab7 556
cyberjoey 9:36ba3626aab7 557 //clac_crc of rom ID
cyberjoey 9:36ba3626aab7 558 for (i=0;i<7;i++){
cyberjoey 9:36ba3626aab7 559 crc = calc_crc8(crc, rom_id[i]);
cyberjoey 9:36ba3626aab7 560 }
cyberjoey 9:36ba3626aab7 561
cyberjoey 9:36ba3626aab7 562 rom_count++;
cyberjoey 9:36ba3626aab7 563 }//if(last_device..)
cyberjoey 9:36ba3626aab7 564 }else{//if prescent -- if no device present rom count is 0
cyberjoey 9:36ba3626aab7 565 return 0;
cyberjoey 9:36ba3626aab7 566 }
cyberjoey 9:36ba3626aab7 567 }while(last_device == 0);
cyberjoey 9:36ba3626aab7 568
cyberjoey 9:36ba3626aab7 569 //check if rom_id from alarm search is all 1s (this means there was a presence pulse but no alarm is triggered)
cyberjoey 9:36ba3626aab7 570 bool bad_rom_id = true;
cyberjoey 9:36ba3626aab7 571 for(int i = 0; i < 7; i++)
cyberjoey 9:36ba3626aab7 572 {
cyberjoey 9:36ba3626aab7 573 if(rom_id_list[0][i] != 0xFF)
cyberjoey 9:36ba3626aab7 574 bad_rom_id = false; //found a byte in the rom id that isn't all 1s
cyberjoey 9:36ba3626aab7 575 }
cyberjoey 9:36ba3626aab7 576 if(bad_rom_id)
cyberjoey 9:36ba3626aab7 577 return 0;
cyberjoey 9:36ba3626aab7 578
cyberjoey 9:36ba3626aab7 579 return rom_count;
cyberjoey 9:36ba3626aab7 580 }// end alarm_search()
cyberjoey 9:36ba3626aab7 581
cyberjoey 9:36ba3626aab7 582
cyberjoey 9:36ba3626aab7 583 // ******************** write_OW_register() ********************************
cyberjoey 9:36ba3626aab7 584 // write_OW_register(char*, int, int, char*)
cyberjoey 9:36ba3626aab7 585 // char* pointer to rom_id
cyberjoey 9:36ba3626aab7 586 // int start address
cyberjoey 9:36ba3626aab7 587 // int number of bytes to write
cyberjoey 9:36ba3626aab7 588 // char* pointer to write data location
cyberjoey 9:36ba3626aab7 589 // returns 0 if CRC match data
cyberjoey 9:36ba3626aab7 590 // returns -1 if CRC does not match data
cyberjoey 9:36ba3626aab7 591 //
cyberjoey 9:36ba3626aab7 592 // *****************************************************************************
cyberjoey 9:36ba3626aab7 593
cyberjoey 9:36ba3626aab7 594
cyberjoey 9:36ba3626aab7 595
cyberjoey 9:36ba3626aab7 596 int write_OW_register(char *device_ID, int start_add, int n, char *data){
cyberjoey 9:36ba3626aab7 597 int i;
cyberjoey 9:36ba3626aab7 598 //select device
cyberjoey 9:36ba3626aab7 599 OW_reset();
cyberjoey 9:36ba3626aab7 600 OW_match_rom(device_ID);
cyberjoey 9:36ba3626aab7 601 //set start address
cyberjoey 9:36ba3626aab7 602 OW_write_byte(OT07_OW_WRITE); // send 0xCC, OW write register command for OT07
cyberjoey 9:36ba3626aab7 603 OW_write_byte(start_add); // send write register start address
cyberjoey 9:36ba3626aab7 604 OW_write_byte(n-1); // send length of bytes to write (00-> one byte)
cyberjoey 9:36ba3626aab7 605 for(i=0;i<n;i++){ // send n bytes of data
cyberjoey 9:36ba3626aab7 606 OW_write_byte(data[i]);
cyberjoey 9:36ba3626aab7 607 }
cyberjoey 9:36ba3626aab7 608 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 609
cyberjoey 9:36ba3626aab7 610 // --- todo ----
cyberjoey 9:36ba3626aab7 611 // calculate CRC of
cyberjoey 9:36ba3626aab7 612 // Command + length + n bytes sent
cyberjoey 9:36ba3626aab7 613 // compare with 2 bytes read
cyberjoey 9:36ba3626aab7 614
cyberjoey 9:36ba3626aab7 615 return 0;
cyberjoey 9:36ba3626aab7 616
cyberjoey 9:36ba3626aab7 617 }//end write_OW_register
cyberjoey 9:36ba3626aab7 618
cyberjoey 9:36ba3626aab7 619
cyberjoey 9:36ba3626aab7 620
cyberjoey 9:36ba3626aab7 621
cyberjoey 9:36ba3626aab7 622 // ******************** read_OW_register() ********************************
cyberjoey 9:36ba3626aab7 623 // read_OW_register(char*, int, int, char*)
cyberjoey 9:36ba3626aab7 624 // char* pointer to rom_id
cyberjoey 9:36ba3626aab7 625 // int start address
cyberjoey 9:36ba3626aab7 626 // int number of bytes to read, not including CRC bytes
cyberjoey 9:36ba3626aab7 627 // char* pointer to save data location
cyberjoey 9:36ba3626aab7 628 // returns 0 if CRC match data
cyberjoey 9:36ba3626aab7 629 // returns -1 if CRC does not match data
cyberjoey 9:36ba3626aab7 630 //
cyberjoey 9:36ba3626aab7 631 // *****************************************************************************
cyberjoey 9:36ba3626aab7 632
cyberjoey 9:36ba3626aab7 633
cyberjoey 9:36ba3626aab7 634
cyberjoey 9:36ba3626aab7 635 int read_OW_register(char *device_ID, int start_add, int n, char *data){
cyberjoey 9:36ba3626aab7 636
cyberjoey 9:36ba3626aab7 637 //int i;
cyberjoey 9:36ba3626aab7 638 //select device
cyberjoey 9:36ba3626aab7 639 OW_reset();
cyberjoey 9:36ba3626aab7 640 OW_match_rom(device_ID);
cyberjoey 9:36ba3626aab7 641 //set start address
cyberjoey 9:36ba3626aab7 642 OW_write_byte(OT07_OW_READ); // send 0x33, OW read register command for OT07
cyberjoey 9:36ba3626aab7 643 OW_write_byte(start_add); // send read register start address
cyberjoey 9:36ba3626aab7 644 OW_write_byte(n-1); // send length of bytes to read (0 -> 1 byte)
cyberjoey 9:36ba3626aab7 645 OW_read_byte(data,n+2); // read n bytes plus 2 byte CRC
cyberjoey 9:36ba3626aab7 646
cyberjoey 9:36ba3626aab7 647 // debug output
cyberjoey 9:36ba3626aab7 648 //for(i=0;i<n+2;i++) db.printf("read_OW_register - [%2d][%02X]\r\n",i,data[i]);
cyberjoey 9:36ba3626aab7 649
cyberjoey 9:36ba3626aab7 650
cyberjoey 9:36ba3626aab7 651 // --- todo ----
cyberjoey 9:36ba3626aab7 652 // calculate CRC of
cyberjoey 9:36ba3626aab7 653 // Command + length + n bytes
cyberjoey 9:36ba3626aab7 654 // compare with last 2 bytes read
cyberjoey 9:36ba3626aab7 655 return 0;
cyberjoey 9:36ba3626aab7 656
cyberjoey 9:36ba3626aab7 657 }//end read_OW_register
cyberjoey 9:36ba3626aab7 658
cyberjoey 9:36ba3626aab7 659 int set_test_mode(char *device_id){
cyberjoey 9:36ba3626aab7 660 char data[4];
cyberjoey 9:36ba3626aab7 661
cyberjoey 9:36ba3626aab7 662 // enter test mode
cyberjoey 9:36ba3626aab7 663 OW_reset();
cyberjoey 9:36ba3626aab7 664 OW_match_rom(device_id); // match ROM
cyberjoey 9:36ba3626aab7 665 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 666 OW_write_byte(0xFF); // device register address
cyberjoey 9:36ba3626aab7 667 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 668 OW_write_byte(0x54); // first half of test mode pass code
cyberjoey 9:36ba3626aab7 669 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 670
cyberjoey 9:36ba3626aab7 671 OW_reset();
cyberjoey 9:36ba3626aab7 672 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 673 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 674 OW_write_byte(0xFF); // device register address
cyberjoey 9:36ba3626aab7 675 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 676 OW_write_byte(0x4D); // second half of test mode pass code
cyberjoey 9:36ba3626aab7 677 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 678
cyberjoey 9:36ba3626aab7 679 // set ADC_ENABLED
cyberjoey 9:36ba3626aab7 680 OW_reset();
cyberjoey 9:36ba3626aab7 681 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 682 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 683 OW_write_byte(0x81); // device register address
cyberjoey 9:36ba3626aab7 684 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 685 OW_write_byte(0x04); // ADC_ENABLED code
cyberjoey 9:36ba3626aab7 686 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 687
cyberjoey 9:36ba3626aab7 688 OW_reset();
cyberjoey 9:36ba3626aab7 689 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 690 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 691 OW_write_byte(0x98); // device register address
cyberjoey 9:36ba3626aab7 692 OW_write_byte(0x05); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 693 OW_write_byte(0x40); // add 98 data 40
cyberjoey 9:36ba3626aab7 694 OW_write_byte(0xD4); // add 99 data D4
cyberjoey 9:36ba3626aab7 695 OW_write_byte(0xE0); // add 9A data E0
cyberjoey 9:36ba3626aab7 696 OW_write_byte(0xB3); // add 9B data B3
cyberjoey 9:36ba3626aab7 697 OW_write_byte(0x09); // add 9C data 09
cyberjoey 9:36ba3626aab7 698 OW_write_byte(0xBA); // add 9D data BA
cyberjoey 9:36ba3626aab7 699 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 700
cyberjoey 9:36ba3626aab7 701
cyberjoey 9:36ba3626aab7 702 //OTP copy
cyberjoey 9:36ba3626aab7 703 OW_reset();
cyberjoey 9:36ba3626aab7 704 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 705 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 706 OW_write_byte(0x80); // device register address
cyberjoey 9:36ba3626aab7 707 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 708 OW_write_byte(0x82); //
cyberjoey 9:36ba3626aab7 709 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 710
cyberjoey 9:36ba3626aab7 711 OW_reset();
cyberjoey 9:36ba3626aab7 712 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 713 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 714 OW_write_byte(0x80); // device register address
cyberjoey 9:36ba3626aab7 715 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 716 OW_write_byte(0x02); //
cyberjoey 9:36ba3626aab7 717 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 718
cyberjoey 9:36ba3626aab7 719
cyberjoey 9:36ba3626aab7 720 OW_reset();
cyberjoey 9:36ba3626aab7 721 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 722 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 723 OW_write_byte(0xFF); // device register address
cyberjoey 9:36ba3626aab7 724 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 725 OW_write_byte(0x00); // exit Test mode
cyberjoey 9:36ba3626aab7 726 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 727 return 0;
cyberjoey 9:36ba3626aab7 728 }// end set_test_mode()
cyberjoey 9:36ba3626aab7 729
cyberjoey 9:36ba3626aab7 730
cyberjoey 9:36ba3626aab7 731
cyberjoey 9:36ba3626aab7 732 // ******************** convert_temperature() ********************************
cyberjoey 9:36ba3626aab7 733 // convert_temperature()
cyberjoey 9:36ba3626aab7 734 // returns 0
cyberjoey 9:36ba3626aab7 735 // dose not block for 0.75 seconds.
cyberjoey 9:36ba3626aab7 736 // *****************************************************************************
cyberjoey 9:36ba3626aab7 737
cyberjoey 9:36ba3626aab7 738 int convert_temperature(){ // convert sent to all OW devices
cyberjoey 9:36ba3626aab7 739
cyberjoey 9:36ba3626aab7 740 char data[8];
cyberjoey 9:36ba3626aab7 741 OW_reset();
cyberjoey 9:36ba3626aab7 742
cyberjoey 9:36ba3626aab7 743 OW_write_byte(OW_SKIP); // send 0xCC, skip rom command
cyberjoey 9:36ba3626aab7 744
cyberjoey 9:36ba3626aab7 745 // activate strong pullup
cyberjoey 9:36ba3626aab7 746 data[0] = WDC; // send 0xD2 Write Device Configuration
cyberjoey 9:36ba3626aab7 747 data[1] = 0xA5; // 1010 0101 b strong and active pullup on
cyberjoey 9:36ba3626aab7 748 i2c.write(DS2484_ADD,data,2,0);
cyberjoey 9:36ba3626aab7 749
cyberjoey 9:36ba3626aab7 750 //convert command
cyberjoey 9:36ba3626aab7 751 OW_write_byte(OT07_OW_CONVERT); // send 0x44, Convert Temperature
cyberjoey 9:36ba3626aab7 752 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 753 return 0;
cyberjoey 9:36ba3626aab7 754 }
cyberjoey 9:36ba3626aab7 755
cyberjoey 9:36ba3626aab7 756
cyberjoey 9:36ba3626aab7 757 // ******************** convert_temperature() ********************************
cyberjoey 9:36ba3626aab7 758 // convert_temperature(char *) takes 8 byte rom_id as input
cyberjoey 9:36ba3626aab7 759 // returns 0
cyberjoey 9:36ba3626aab7 760 // dose not block for 0.75 seconds.
cyberjoey 9:36ba3626aab7 761 // *****************************************************************************
cyberjoey 9:36ba3626aab7 762
cyberjoey 9:36ba3626aab7 763 int convert_temperature(char *device_id){
cyberjoey 9:36ba3626aab7 764
cyberjoey 9:36ba3626aab7 765 char data[8];
cyberjoey 9:36ba3626aab7 766 OW_reset();
cyberjoey 9:36ba3626aab7 767 OW_match_rom(device_id); // send device id
cyberjoey 9:36ba3626aab7 768
cyberjoey 9:36ba3626aab7 769 // activate strong pullup
cyberjoey 9:36ba3626aab7 770 data[0] = WDC; // send 0xD2 Write Device Configuration
cyberjoey 9:36ba3626aab7 771 data[1] = 0xA5; // 1010 0101 b strong and active pullup on
cyberjoey 9:36ba3626aab7 772 i2c.write(DS2484_ADD,data,2,0);
cyberjoey 9:36ba3626aab7 773
cyberjoey 9:36ba3626aab7 774 //convert command
cyberjoey 9:36ba3626aab7 775 OW_write_byte(OT07_OW_CONVERT); // send 0x44, Convert Temperature
cyberjoey 9:36ba3626aab7 776 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 777 return 0;
cyberjoey 9:36ba3626aab7 778 }
cyberjoey 9:36ba3626aab7 779
cyberjoey 9:36ba3626aab7 780 //************************ get_temperature() *********************************
cyberjoey 9:36ba3626aab7 781 // get_temperature(char *) takes 8 byte rom_id as input
cyberjoey 9:36ba3626aab7 782 // returns double temperature in oC
cyberjoey 9:36ba3626aab7 783 //******************************************************************************
cyberjoey 9:36ba3626aab7 784
cyberjoey 9:36ba3626aab7 785 double get_temperature(char *device_id){
cyberjoey 9:36ba3626aab7 786
cyberjoey 9:36ba3626aab7 787 char t[4];
cyberjoey 9:36ba3626aab7 788 double T;
cyberjoey 9:36ba3626aab7 789 int count;
cyberjoey 9:36ba3626aab7 790 // char data[2];
cyberjoey 9:36ba3626aab7 791
cyberjoey 9:36ba3626aab7 792 read_OW_register(device_id,OT07_FIFO_DATA,0x02,t); // Read temperature from FIFO, 2 bytes
cyberjoey 9:36ba3626aab7 793 //db.printf("get_temperature -- FIFO[%02X %02X] CRC[%02X %02X]\r\n",t[0],t[1],t[2],t[3]);
cyberjoey 9:36ba3626aab7 794 //calculate temperture from data
cyberjoey 9:36ba3626aab7 795 count = (int)(t[0]*256 + t[1]);
cyberjoey 9:36ba3626aab7 796 if (count >= 32768)count = count - 65536; // 2s comp
cyberjoey 9:36ba3626aab7 797 T = (double)count*0.005;
cyberjoey 9:36ba3626aab7 798
cyberjoey 9:36ba3626aab7 799 //db.printf("T = %f count[%5d]\r\n", T,count);
cyberjoey 9:36ba3626aab7 800 return T;
cyberjoey 9:36ba3626aab7 801 }// end get_temperature()
cyberjoey 9:36ba3626aab7 802
cyberjoey 9:36ba3626aab7 803
cyberjoey 9:36ba3626aab7 804 //******************************************************************************
cyberjoey 9:36ba3626aab7 805 // main()
cyberjoey 9:36ba3626aab7 806 //******************************************************************************
cyberjoey 9:36ba3626aab7 807
cyberjoey 9:36ba3626aab7 808
switches 0:60a522ae2e35 809 int main()
switches 0:60a522ae2e35 810 {
cyberjoey 9:36ba3626aab7 811
cyberjoey 9:36ba3626aab7 812 char data[130];
cyberjoey 9:36ba3626aab7 813 int device_count = 0; // number of OW devices found by search_rom()
cyberjoey 9:36ba3626aab7 814 int i;
cyberjoey 9:36ba3626aab7 815 int j;
cyberjoey 9:36ba3626aab7 816 int k;
cyberjoey 9:36ba3626aab7 817
cyberjoey 9:36ba3626aab7 818
cyberjoey 9:36ba3626aab7 819 char device_id[ID_LENGTH]; //8 byte rom id of current slected device
cyberjoey 9:36ba3626aab7 820 char rom_id_list[MAX_DEVICES][ID_LENGTH]; //List of rom id for each device on OW bus
cyberjoey 9:36ba3626aab7 821
cyberjoey 9:36ba3626aab7 822 double T[MAX_DEVICES];
cyberjoey 9:36ba3626aab7 823
cyberjoey 9:36ba3626aab7 824 // i/o variables
cyberjoey 9:36ba3626aab7 825 char rx_buff[128]; // comport input buffer
cyberjoey 9:36ba3626aab7 826 int rx_index; // rx_buffer pointer
cyberjoey 9:36ba3626aab7 827 char c; // command type character
cyberjoey 9:36ba3626aab7 828 int n; // argument count
cyberjoey 9:36ba3626aab7 829 int arg1; // argumnet 1
cyberjoey 9:36ba3626aab7 830 int arg2; // argument 2
cyberjoey 9:36ba3626aab7 831 int device; // device argument
cyberjoey 9:36ba3626aab7 832 int num_bytes;
cyberjoey 9:36ba3626aab7 833
cyberjoey 9:36ba3626aab7 834 int time_count;
cyberjoey 9:36ba3626aab7 835 int log_interval = PERIOD;
cyberjoey 9:36ba3626aab7 836 int time_to_sample;
cyberjoey 9:36ba3626aab7 837
cyberjoey 9:36ba3626aab7 838 //************* init ticker timer callbacks ****************
cyberjoey 9:36ba3626aab7 839 timer_1.attach(&LED_blink_callback,1.0); //start ticker, once per sec.
cyberjoey 9:36ba3626aab7 840
cyberjoey 9:36ba3626aab7 841
cyberjoey 9:36ba3626aab7 842 i2c.frequency(400000); //set I2C clock to 100kHz
cyberjoey 9:36ba3626aab7 843
cyberjoey 9:36ba3626aab7 844 //wait(1); //wait 1 sec for USB serial port to init.
cyberjoey 9:36ba3626aab7 845
cyberjoey 9:36ba3626aab7 846 //db.printf("--- OT07 - Base Logger Firmware uisng DS2484 bridge V0.2 ---\r\ndaplink serial port\r\n");
cyberjoey 9:36ba3626aab7 847 //pc.printf("--- OT07 - Base Logger Firmware uisng DS2484 bridge V0.2 ---\r\nmicro USB serial port\r\n");
cyberjoey 9:36ba3626aab7 848
cyberjoey 9:36ba3626aab7 849 rLED = LED_OFF;
switches 6:96d8d823e292 850 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 851 bLED = LED_ON;
cyberjoey 9:36ba3626aab7 852
cyberjoey 9:36ba3626aab7 853
cyberjoey 9:36ba3626aab7 854 // reset DS2484
cyberjoey 9:36ba3626aab7 855 data[0] = 0xE1;
cyberjoey 9:36ba3626aab7 856 data[1] = 0xF0;
cyberjoey 9:36ba3626aab7 857 i2c.write(DS2484_ADD,data,1,1);
cyberjoey 9:36ba3626aab7 858 i2c.read(DS2484_ADD,data,1);
cyberjoey 9:36ba3626aab7 859
cyberjoey 9:36ba3626aab7 860 //db.printf("DS2484 Reset --> status[%02X]\r\n",data[0]);
cyberjoey 9:36ba3626aab7 861
cyberjoey 9:36ba3626aab7 862 // ****************** search for all OW devices on bus *****************
cyberjoey 9:36ba3626aab7 863
cyberjoey 9:36ba3626aab7 864 device_count = search_rom(rom_id_list);
cyberjoey 9:36ba3626aab7 865
cyberjoey 9:36ba3626aab7 866 // print out rom codes found
cyberjoey 9:36ba3626aab7 867 /*pc.printf("\r\nsearch rom\r\n");
cyberjoey 9:36ba3626aab7 868 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 869 //pc.printf("device[%02X] rom id[ ",j);
cyberjoey 9:36ba3626aab7 870 for(i=7;i>=0;i--){
cyberjoey 9:36ba3626aab7 871 pc.printf("%02X",rom_id_list[j][i]);
cyberjoey 9:36ba3626aab7 872 }
cyberjoey 9:36ba3626aab7 873 pc.printf("]\r\n");
cyberjoey 9:36ba3626aab7 874 }
cyberjoey 9:36ba3626aab7 875 pc.printf("\r\n");*/
cyberjoey 9:36ba3626aab7 876
cyberjoey 9:36ba3626aab7 877 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 878 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 879 device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 880 }
cyberjoey 9:36ba3626aab7 881 set_test_mode(device_id);
cyberjoey 9:36ba3626aab7 882 //db.printf("device[%2X] in test mode\r\n",j);
cyberjoey 9:36ba3626aab7 883 }
cyberjoey 9:36ba3626aab7 884
cyberjoey 9:36ba3626aab7 885
cyberjoey 9:36ba3626aab7 886 rx_index = 0; //character buffer index for input from PC
cyberjoey 9:36ba3626aab7 887
cyberjoey 9:36ba3626aab7 888 button.fall(&btn_pressed);
cyberjoey 9:36ba3626aab7 889
cyberjoey 9:36ba3626aab7 890 //db.printf("start Main loop\r\n");
cyberjoey 9:36ba3626aab7 891 //db.printf("tf[%d]\r\n",tick_flag);
cyberjoey 9:36ba3626aab7 892 while(1) { // start main loop, take data if logging, check for input, repeat
cyberjoey 9:36ba3626aab7 893
cyberjoey 9:36ba3626aab7 894 if(button_flag == true)
cyberjoey 9:36ba3626aab7 895 {
cyberjoey 9:36ba3626aab7 896 if(log_flag == false){ //start logging
cyberjoey 9:36ba3626aab7 897
cyberjoey 9:36ba3626aab7 898 if(SDDetect)//if SD card not detected
cyberjoey 9:36ba3626aab7 899 {
cyberjoey 9:36ba3626aab7 900 error_flag = true;
cyberjoey 9:36ba3626aab7 901 error_ticks = 6;
cyberjoey 9:36ba3626aab7 902 log_flag = false;
cyberjoey 9:36ba3626aab7 903 }
cyberjoey 9:36ba3626aab7 904 else
cyberjoey 9:36ba3626aab7 905 {
cyberjoey 9:36ba3626aab7 906 FILE *fp = fopen("/sd/MAX30207Log.csv", "a");
cyberjoey 9:36ba3626aab7 907 if (fp != NULL)
cyberjoey 9:36ba3626aab7 908 {
cyberjoey 9:36ba3626aab7 909 fprintf(fp, "Time(s)");
cyberjoey 9:36ba3626aab7 910
cyberjoey 9:36ba3626aab7 911 for(j=0;j<device_count;j++)
cyberjoey 9:36ba3626aab7 912 {
cyberjoey 9:36ba3626aab7 913 fprintf(fp,", Device %d Temperature (C)",j);
cyberjoey 9:36ba3626aab7 914 }
cyberjoey 9:36ba3626aab7 915 fprintf(fp,"\r\n");
cyberjoey 9:36ba3626aab7 916
cyberjoey 9:36ba3626aab7 917 fclose(fp);
cyberjoey 9:36ba3626aab7 918 }
cyberjoey 9:36ba3626aab7 919
cyberjoey 9:36ba3626aab7 920 time_count = 0;
cyberjoey 9:36ba3626aab7 921
cyberjoey 9:36ba3626aab7 922 time_to_sample = 0; // force sample at time = 0;
cyberjoey 9:36ba3626aab7 923 tick_flag = true; // force sample at time = 0;
cyberjoey 9:36ba3626aab7 924 log_flag = true;
cyberjoey 9:36ba3626aab7 925 }
cyberjoey 9:36ba3626aab7 926 }else{
cyberjoey 9:36ba3626aab7 927 //pc.printf("<stop logging>\r\n");
cyberjoey 9:36ba3626aab7 928 log_flag = false;
cyberjoey 9:36ba3626aab7 929 }
cyberjoey 9:36ba3626aab7 930 button_flag = false;
cyberjoey 9:36ba3626aab7 931 }
switches 1:90313362ec11 932
cyberjoey 9:36ba3626aab7 933 while(tick_flag == false){ //check for input while waiting for next tick
cyberjoey 9:36ba3626aab7 934
cyberjoey 9:36ba3626aab7 935 // ----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 936 // test for charater input for USB com port
cyberjoey 9:36ba3626aab7 937 // ----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 938
cyberjoey 9:36ba3626aab7 939 //test if PC sent some charaters
cyberjoey 9:36ba3626aab7 940 while(pc.readable()){ //characters in buffer, get them
cyberjoey 9:36ba3626aab7 941 rx_buff[rx_index] = pc.getc();
cyberjoey 9:36ba3626aab7 942 //pc.putc(rx_buff[rx_index]); //echo character
cyberjoey 9:36ba3626aab7 943 //pc.printf("<[%02x] %c i[%d]>",rx_buff[i],rx_buff[i],i); //echo charater
cyberjoey 9:36ba3626aab7 944
cyberjoey 9:36ba3626aab7 945
cyberjoey 9:36ba3626aab7 946 if(rx_buff[rx_index] == CR){
cyberjoey 9:36ba3626aab7 947 //db.printf("\r\n");
cyberjoey 9:36ba3626aab7 948 pc.printf("\r\n");
cyberjoey 9:36ba3626aab7 949 rx_buff[++rx_index] = 0;
cyberjoey 9:36ba3626aab7 950 //db.printf("%s\r\n",rx_buff);
cyberjoey 9:36ba3626aab7 951 //pc.printf("%s\r\n",rx_buff);
cyberjoey 9:36ba3626aab7 952 rx_index = -1; // because i++ at end of while give i=0 on next loop
cyberjoey 9:36ba3626aab7 953 device = 0;
cyberjoey 9:36ba3626aab7 954 arg1 = 0;
cyberjoey 9:36ba3626aab7 955 arg2 = 0;
cyberjoey 9:36ba3626aab7 956
cyberjoey 9:36ba3626aab7 957 n = sscanf(rx_buff, " %c %d %x %x", &c, & device, &arg1, &arg2);
cyberjoey 9:36ba3626aab7 958
cyberjoey 9:36ba3626aab7 959 //db.printf("c[%c] d[%d] a1[%x] a2[%x] n[%d]\r\n",c,device,arg1,arg2,n); //echo values read in
cyberjoey 9:36ba3626aab7 960 //process input
cyberjoey 9:36ba3626aab7 961 if(n > 0){//got input so process it
cyberjoey 9:36ba3626aab7 962 switch(c){
cyberjoey 9:36ba3626aab7 963 case 'a':
cyberjoey 9:36ba3626aab7 964 case 'A': // alarm search
cyberjoey 9:36ba3626aab7 965 // ****************** search for all OW devices with alarm triggered on bus *****************
cyberjoey 9:36ba3626aab7 966
cyberjoey 9:36ba3626aab7 967 device_count = alarm_search(rom_id_list);
cyberjoey 9:36ba3626aab7 968
cyberjoey 9:36ba3626aab7 969 pc.printf("%d devices:\r\n", device_count);
cyberjoey 9:36ba3626aab7 970 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 971 pc.printf("device[%02X] rom id[",j);
cyberjoey 9:36ba3626aab7 972 for(i=7;i>=0;i--){
cyberjoey 9:36ba3626aab7 973 pc.printf("%02X",rom_id_list[j][i]);
cyberjoey 9:36ba3626aab7 974 }
cyberjoey 9:36ba3626aab7 975 pc.printf("]\r\n");
cyberjoey 9:36ba3626aab7 976 }
cyberjoey 9:36ba3626aab7 977 break;
cyberjoey 9:36ba3626aab7 978 case 'f':
cyberjoey 9:36ba3626aab7 979 case 'F': //f is for "flash" for microSD
cyberjoey 9:36ba3626aab7 980 if(!SDDetect)
cyberjoey 9:36ba3626aab7 981 pc.printf("y\r\n");
cyberjoey 9:36ba3626aab7 982 else
cyberjoey 9:36ba3626aab7 983 pc.printf("n\r\n");
cyberjoey 9:36ba3626aab7 984 break;
cyberjoey 9:36ba3626aab7 985 case 'i':
cyberjoey 9:36ba3626aab7 986 case 'I': //Set Logging sample intreval in seconds
cyberjoey 9:36ba3626aab7 987
cyberjoey 9:36ba3626aab7 988 log_interval = device;
cyberjoey 9:36ba3626aab7 989 if(log_interval < 1)log_interval = 1;
cyberjoey 9:36ba3626aab7 990 if(log_interval > 60)log_interval = 60;
cyberjoey 9:36ba3626aab7 991 break;
cyberjoey 9:36ba3626aab7 992 case 'l':
cyberjoey 9:36ba3626aab7 993 case 'L': // Toggle logging
cyberjoey 9:36ba3626aab7 994
cyberjoey 9:36ba3626aab7 995 if(log_flag == false){ //start logging
cyberjoey 9:36ba3626aab7 996 if(SDDetect)//if SD card not detected
cyberjoey 9:36ba3626aab7 997 {
cyberjoey 9:36ba3626aab7 998 error_flag = true;
cyberjoey 9:36ba3626aab7 999 error_ticks = 6;
cyberjoey 9:36ba3626aab7 1000 log_flag = false;
cyberjoey 9:36ba3626aab7 1001 }
cyberjoey 9:36ba3626aab7 1002 else
cyberjoey 9:36ba3626aab7 1003 {
cyberjoey 9:36ba3626aab7 1004 FILE *fp = fopen("/sd/MAX30207Log.csv", "a");
cyberjoey 9:36ba3626aab7 1005 if (fp != NULL)
cyberjoey 9:36ba3626aab7 1006 {
cyberjoey 9:36ba3626aab7 1007 fprintf(fp, "Time(s)");
cyberjoey 9:36ba3626aab7 1008
cyberjoey 9:36ba3626aab7 1009 for(j=0;j<device_count;j++)
cyberjoey 9:36ba3626aab7 1010 {
cyberjoey 9:36ba3626aab7 1011 fprintf(fp,", Device %d Temperature (C)",j);
cyberjoey 9:36ba3626aab7 1012 }
cyberjoey 9:36ba3626aab7 1013 fprintf(fp,"\r\n");
cyberjoey 9:36ba3626aab7 1014
cyberjoey 9:36ba3626aab7 1015 fclose(fp);
cyberjoey 9:36ba3626aab7 1016 }
cyberjoey 9:36ba3626aab7 1017
cyberjoey 9:36ba3626aab7 1018 time_count = 0;
cyberjoey 9:36ba3626aab7 1019
cyberjoey 9:36ba3626aab7 1020 time_to_sample = 0; // force sample at time = 0;
cyberjoey 9:36ba3626aab7 1021 tick_flag = true; // force sample at time = 0;
cyberjoey 9:36ba3626aab7 1022 log_flag = true;
cyberjoey 9:36ba3626aab7 1023 }
cyberjoey 9:36ba3626aab7 1024 }else{
cyberjoey 9:36ba3626aab7 1025 //pc.printf("<stop logging>\r\n");
cyberjoey 9:36ba3626aab7 1026 log_flag = false;
cyberjoey 9:36ba3626aab7 1027 }
cyberjoey 9:36ba3626aab7 1028 break;
cyberjoey 9:36ba3626aab7 1029 case 'P':
cyberjoey 9:36ba3626aab7 1030 case 'p': // power down One Wire buss
cyberjoey 9:36ba3626aab7 1031 if(n == 2){
cyberjoey 9:36ba3626aab7 1032 if (device == 0){ // power down mode ON.
cyberjoey 9:36ba3626aab7 1033 data[0] = WDC; // 0xD2 Write Device Config
cyberjoey 9:36ba3626aab7 1034 data[1] = 0xD2; // 1101 0010 set 1WS = 0, SPU = 0, PDN = 1, APU = 0
cyberjoey 9:36ba3626aab7 1035 i2c.write(DS2484_ADD,data,2,0);
cyberjoey 9:36ba3626aab7 1036 pc.printf("<Power down DQ>\r\n");
cyberjoey 9:36ba3626aab7 1037 }else{ // power down mode OFF
cyberjoey 9:36ba3626aab7 1038 data[0] = WDC; // 0xD2 Write Device Config
cyberjoey 9:36ba3626aab7 1039 data[1] = 0xE1; // 1110 0001 set 1WS = 0, SPU = 0, PDN = 0, APU = 1
cyberjoey 9:36ba3626aab7 1040 i2c.write(DS2484_ADD,data,2,0);
cyberjoey 9:36ba3626aab7 1041 pc.printf("<Power up DQ>\r\n");
cyberjoey 9:36ba3626aab7 1042 }
cyberjoey 9:36ba3626aab7 1043 }
cyberjoey 9:36ba3626aab7 1044 break;
cyberjoey 9:36ba3626aab7 1045 case 'r':
cyberjoey 9:36ba3626aab7 1046 case 'R': //read register "r device radd.start radd.end"
cyberjoey 9:36ba3626aab7 1047 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1048 device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1049 }
cyberjoey 9:36ba3626aab7 1050 if(n==3){ //read single register from selected device
cyberjoey 9:36ba3626aab7 1051 read_OW_register(device_id,arg1,1,data);
cyberjoey 9:36ba3626aab7 1052 pc.printf("device[%02X] add[%02X] data[%02X] crc[%02X %02X]\r\n",device,arg1,data[0],data[1],data[2]);
cyberjoey 9:36ba3626aab7 1053 }
cyberjoey 9:36ba3626aab7 1054 if(n==4){ //read a range of regesters from selected device
cyberjoey 9:36ba3626aab7 1055 num_bytes = arg2-arg1 + 1; // calculate number of bytes to read
cyberjoey 9:36ba3626aab7 1056 if (num_bytes < 1) num_bytes = 1; // if arg2 <= arg 1 just read arg1 address.
cyberjoey 9:36ba3626aab7 1057 read_OW_register(device_id,arg1,num_bytes,data);
cyberjoey 9:36ba3626aab7 1058 for(i=0;i<num_bytes;i++){
cyberjoey 9:36ba3626aab7 1059 pc.printf("\r\ndevice[%02X] add[%02X] data[%02X]",device,arg1+i,data[i]);
cyberjoey 9:36ba3626aab7 1060 }
cyberjoey 9:36ba3626aab7 1061 pc.printf(" crc[%02X %02X]\r\n",data[i],data[i+1]);
cyberjoey 9:36ba3626aab7 1062 }
cyberjoey 9:36ba3626aab7 1063 break;
cyberjoey 9:36ba3626aab7 1064
cyberjoey 9:36ba3626aab7 1065 case 's':
cyberjoey 9:36ba3626aab7 1066 case 'S': // search rom
cyberjoey 9:36ba3626aab7 1067 // ****************** search for all OW devices on bus *****************
cyberjoey 9:36ba3626aab7 1068
cyberjoey 9:36ba3626aab7 1069 device_count = search_rom(rom_id_list);
cyberjoey 9:36ba3626aab7 1070
cyberjoey 9:36ba3626aab7 1071 // print out rom codes found
cyberjoey 9:36ba3626aab7 1072 //pc.printf("\r\nsearch rom\r\n");
cyberjoey 9:36ba3626aab7 1073 pc.printf("%d devices:\r\n", device_count);
cyberjoey 9:36ba3626aab7 1074 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1075 pc.printf("device[%02X] rom id[",j);
cyberjoey 9:36ba3626aab7 1076 for(i=7;i>=0;i--){
cyberjoey 9:36ba3626aab7 1077 pc.printf("%02X",rom_id_list[j][i]);
cyberjoey 9:36ba3626aab7 1078 }
cyberjoey 9:36ba3626aab7 1079 pc.printf("]\r\n");
cyberjoey 9:36ba3626aab7 1080 }
cyberjoey 9:36ba3626aab7 1081 //pc.printf("\r\n");
cyberjoey 9:36ba3626aab7 1082 break;
cyberjoey 9:36ba3626aab7 1083
cyberjoey 9:36ba3626aab7 1084 case 'T':
cyberjoey 9:36ba3626aab7 1085 case 't':
cyberjoey 9:36ba3626aab7 1086 if(n == 2){//get temperatures from selected device
cyberjoey 9:36ba3626aab7 1087 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1088 device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1089 }
cyberjoey 9:36ba3626aab7 1090 convert_temperature(device_id); //send OW convert selected device
cyberjoey 9:36ba3626aab7 1091 wait(0.02); //wait 20 ms for convert temperature to complete
cyberjoey 9:36ba3626aab7 1092 T[0] = get_temperature(device_id);
cyberjoey 9:36ba3626aab7 1093 pc.printf("device[%02X] temperature[%.3f]\r\n",device,T[0]);
cyberjoey 9:36ba3626aab7 1094 //pc.printf("\r\n");
cyberjoey 9:36ba3626aab7 1095 }
cyberjoey 9:36ba3626aab7 1096 if(n == 3){ // "t 1 5" get temperature for devices 1 thru 5
cyberjoey 9:36ba3626aab7 1097
cyberjoey 9:36ba3626aab7 1098 convert_temperature(); //send OW convert to all devices
cyberjoey 9:36ba3626aab7 1099 wait(0.02); //wait 750 ms for convert temperature to complete
cyberjoey 9:36ba3626aab7 1100 for(j=device;j<=arg1;j++){
cyberjoey 9:36ba3626aab7 1101 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1102 device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1103 }
cyberjoey 9:36ba3626aab7 1104 pc.printf("device[%02X] temperature[%.3f]\r\n",j,get_temperature(device_id));
cyberjoey 9:36ba3626aab7 1105 }
cyberjoey 9:36ba3626aab7 1106 //pc.printf("\r\n");
cyberjoey 9:36ba3626aab7 1107 }
cyberjoey 9:36ba3626aab7 1108 break;
cyberjoey 9:36ba3626aab7 1109
cyberjoey 9:36ba3626aab7 1110 case 'w':
cyberjoey 9:36ba3626aab7 1111 case 'W': //write register "w device w.addr data"
cyberjoey 9:36ba3626aab7 1112 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1113 device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1114 }
cyberjoey 9:36ba3626aab7 1115 data[0] = arg2;
cyberjoey 9:36ba3626aab7 1116 write_OW_register(device_id, arg1, 1, data);
cyberjoey 9:36ba3626aab7 1117
cyberjoey 9:36ba3626aab7 1118 pc.printf("write -- device[%02X] add[%02X] data[%02X] ",device,arg1,arg2);
cyberjoey 9:36ba3626aab7 1119
cyberjoey 9:36ba3626aab7 1120 // get CRC
cyberjoey 9:36ba3626aab7 1121 //OW_read_byte(data,2);
cyberjoey 9:36ba3626aab7 1122 pc.printf("crc[%02X %02X]\r\n",data[0],data[1]);
cyberjoey 9:36ba3626aab7 1123
cyberjoey 9:36ba3626aab7 1124 break;
cyberjoey 9:36ba3626aab7 1125
cyberjoey 9:36ba3626aab7 1126 case 'x':
cyberjoey 9:36ba3626aab7 1127 case 'X': // experimental modes
cyberjoey 9:36ba3626aab7 1128 // ****************** set up ADC enabled in test mode*****************
cyberjoey 9:36ba3626aab7 1129 pc.printf("<set ADC_ENABLED in test mode>\r\n");
cyberjoey 9:36ba3626aab7 1130
cyberjoey 9:36ba3626aab7 1131 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1132 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1133 device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1134 }
cyberjoey 9:36ba3626aab7 1135 set_test_mode(device_id);
cyberjoey 9:36ba3626aab7 1136 //db.printf("device[%2X] in test mode\r\n",j);
cyberjoey 9:36ba3626aab7 1137 }
cyberjoey 9:36ba3626aab7 1138 break;
cyberjoey 9:36ba3626aab7 1139
cyberjoey 9:36ba3626aab7 1140
cyberjoey 9:36ba3626aab7 1141 }//end switch(c)
cyberjoey 9:36ba3626aab7 1142 }//if(n>0)
cyberjoey 9:36ba3626aab7 1143 }//end if(CR)
cyberjoey 9:36ba3626aab7 1144 if(rx_buff[rx_index] == BS){//backspace received, back up buffer pointer
cyberjoey 9:36ba3626aab7 1145 if(rx_index>0)rx_index--;//remove last char from buffer if not at start.
cyberjoey 9:36ba3626aab7 1146 }else rx_index++;
cyberjoey 9:36ba3626aab7 1147 }//end while(pc.redable())
cyberjoey 9:36ba3626aab7 1148 wait(0.1); // slow down polling
switches 0:60a522ae2e35 1149
cyberjoey 9:36ba3626aab7 1150 }// end (while tick == false)
cyberjoey 9:36ba3626aab7 1151 tick_flag = false; // set to false for next time
cyberjoey 9:36ba3626aab7 1152
cyberjoey 9:36ba3626aab7 1153 // only reached when tick_flag = true otherwise stuck in pc.readable() loop
cyberjoey 9:36ba3626aab7 1154 if(log_flag == true){
cyberjoey 9:36ba3626aab7 1155 //pc.printf("tc{%5d] tts[%5d]\n\r",time_count,time_to_sample);
cyberjoey 9:36ba3626aab7 1156 if(time_count >= time_to_sample){ //take next sample
cyberjoey 9:36ba3626aab7 1157 time_to_sample += log_interval; // calculate time for next sample
cyberjoey 9:36ba3626aab7 1158
cyberjoey 9:36ba3626aab7 1159 // start conversion
cyberjoey 9:36ba3626aab7 1160 convert_temperature();
cyberjoey 9:36ba3626aab7 1161 wait(0.02); //wait 20ms for convert to complete
cyberjoey 9:36ba3626aab7 1162 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1163 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1164 device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1165 }
cyberjoey 9:36ba3626aab7 1166 T[j] = get_temperature(device_id);
cyberjoey 9:36ba3626aab7 1167 }
cyberjoey 9:36ba3626aab7 1168 /*
cyberjoey 9:36ba3626aab7 1169 // print out time count and temperatures
cyberjoey 9:36ba3626aab7 1170 pc.printf("%5d",time_count);
cyberjoey 9:36ba3626aab7 1171 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1172 pc.printf(", %7.3f",T[j]);
cyberjoey 9:36ba3626aab7 1173 }
cyberjoey 9:36ba3626aab7 1174 pc.printf("\r\n");
cyberjoey 9:36ba3626aab7 1175 */
cyberjoey 9:36ba3626aab7 1176 FILE *fp = fopen("/sd/MAX30207Log.csv", "a");
cyberjoey 9:36ba3626aab7 1177 if (fp != NULL)
cyberjoey 9:36ba3626aab7 1178 {
cyberjoey 9:36ba3626aab7 1179 //fprintf(fp, "\n");
cyberjoey 9:36ba3626aab7 1180 fprintf(fp, "%5d",time_count);
cyberjoey 9:36ba3626aab7 1181 for(j=0;j<device_count;j++)
cyberjoey 9:36ba3626aab7 1182 {
cyberjoey 9:36ba3626aab7 1183 fprintf(fp,", %7.3f",T[j]);
cyberjoey 9:36ba3626aab7 1184 }
cyberjoey 9:36ba3626aab7 1185 fprintf(fp,"\r\n");
cyberjoey 9:36ba3626aab7 1186
cyberjoey 9:36ba3626aab7 1187 fclose(fp);
cyberjoey 9:36ba3626aab7 1188 }
cyberjoey 9:36ba3626aab7 1189 }// end if(time_count >= time_to_sample)
cyberjoey 9:36ba3626aab7 1190 time_count ++; //
cyberjoey 9:36ba3626aab7 1191
cyberjoey 9:36ba3626aab7 1192 }// end if(log_flag)
cyberjoey 9:36ba3626aab7 1193
cyberjoey 9:36ba3626aab7 1194 }//end while(1)
switches 0:60a522ae2e35 1195 }
switches 0:60a522ae2e35 1196