PICO I2C FW
Dependencies: USBDevice
Diff: main.cpp
- Revision:
- 18:d913ec9dd9c2
- Parent:
- 17:401a5bb8d403
- Child:
- 19:7081d6f6288b
diff -r 401a5bb8d403 -r d913ec9dd9c2 main.cpp --- a/main.cpp Fri Aug 31 19:28:28 2018 +0000 +++ b/main.cpp Fri Aug 31 19:47:40 2018 +0000 @@ -4,46 +4,8 @@ #include "USBSerial.h" #include <ctype.h> - -#define I2C_ADDRESS 0x30 // DS2484 I2C address -#define DS2484_ADD 0x30 // DS2484 I2C write address - - #define PERIOD 10 // Logging period in seconds -//DS2484 Status register bits -#define OWB 0x01 // status reg, One Wire Busy -#define PPD 0x02 // status reg, Presence Pulse Detected -#define SD 0x04 // status reg, Short Detected -#define LL 0x08 // status reg, Logic Level -#define RST 0x10 // status reg, Device Reset (DS2484 Reset) -#define SBR 0x20 // status reg, Single Bit Result -#define TSB 0x40 // status reg, Triplet Second Bit -#define DIR 0x80 // status reg, Branch Direction Taken -//DS2484 Command bytes -#define RESET 0xF0 // DS2484 Reset -#define SRP 0xE1 // DS2484 Set Read Pointer -#define WDC 0xD2 // DS2484 Write Device Configuration -#define ACP 0xC3 // DS2484 Adjust one wire Control Port -#define OW_RESET 0xB4 // DS2484 One Wire Reset -#define OW_SB 0x87 // One Wire Single Bit (write or read) -#define OWWB 0xA5 // One Wire Write Byte -#define OWRB 0x96 // One Wire Read Byte -#define OWT 0x78 // One Wire Triplet (read 2 bits, write 1 bit) -//One Wire Commands -#define OW_SEARCH 0xF0 // Search Rom -#define OW_READ 0x33 // Read Rom -#define OW_MATCH 0x55 // Match Rom -#define OW_SKIP 0xCC // Skip Rom -#define OW_OD_MATCH 0x69 // Match Rom -#define OW_OD_SKIP 0x3C // Skip Rom -#define OW_ALARM 0xEC // Alarm Search -// OT07 OW commands -#define OT07_OW_CONVERT 0x44 //OT07 OW convert temperature command -#define OT07_OW_WRITE 0xCC // OT07 OW Write Register command -#define OT07_OW_READ 0x33 // OT07 OW Read Register command -#define OT07_OW_RESET 0x82 // OT07 OW Soft Reset command - //OT07 Registers #define OT07_STATUS 0x00 // OT07 status regiter #define OT07_INT_EN 0x01 // OT07 Interrupt Enable @@ -224,227 +186,6 @@ } // ***************************************************************************** -// OW_reset() -// returns 0 no device present, 1 device present -// ***************************************************************************** - -int OW_reset(){ - char data[2]; // define as minimun array size so 'data' is a pointer - data[0] = OW_RESET; // One Wire Reset 0xB4 - i2c.write(DS2484_ADD,data,1,0); // write reset command to DS2484 - wait_ms(1); - do{ // poll OW-busy - i2c.read(DS2484_ADD,data,1); // read back status byte from DS2484 - }while(OWB & data[0]); - if(PPD & data[0])return 1; // Presence Pulse Detected bit true? - return 0; // else -} // end OW_reset() - -// ***************************************************************************** -// OW_write_byte(char) takes char to send over one wire -// returns DS2484 status byte -// ***************************************************************************** - -char OW_write_byte(char byte){ - - char data[2]; - data[0] = 0xA5; - data[1] = byte; - i2c.write(DS2484_ADD,data,2,1); - i2c.read(DS2484_ADD,data,1); // read status byte - - // db.printf("[%02X]",byte); - wait_us(700); // assumes normal speed OW write - return data[0]; // return DS2484 Status byte - -}// end OW_write_byte() - - -// ***************************************************************************** -// OW_read_byte(char *, int) char* (save data pointer) -// int (number of bytes to read) -// returns 0x00 -// -// assumes OW_reset, OW_match rom, and OW device register read address already sent. -// -// ***************************************************************************** - -char OW_read_byte(char* a, int n){ - - char data[2]; - int i; - - //read n bytes of data - i=0; - do{ - data[0] = OWRB; // send 0x96; DS2484 command, OW read byte - i2c.write(DS2484_ADD,data,1,0); - wait_us(600); - do{ - i2c.read(DS2484_ADD,data,1); // read status byte and test OW-busy? - }while(data[0]&0x01 == 1); // status bit[0] set --> OW busy - - //get byte from DS2484 - data[0] = SRP; // send 0xE1, set read pointer - data[1] = 0xE1; // set read pointer address 0xE1 read OW data - i2c.write(DS2484_ADD,data,2,1); - i2c.read(DS2484_ADD,data,1); // read bytes from OW register - - a[i] = data[0]; - - i++; - //pc.printf("[%02X] ",data[0]); - }while(i<n); - //for(i=0;i<n;i++) db.printf("OW_read_byte - [%2d][%02X]\r\n",i,a[i]); - return 0x00; -}// end OW_read_byte() - - - -// ***************************************************************************** -// OW_match_rom(char *) pointer to device_id byte array -// returns 0x00 -// assumes OW_reset alread sent -// ***************************************************************************** - -char OW_match_rom(char *device_id){ - - int i; - //Match rom - OW_write_byte(OW_MATCH); // send 0x55, match rom command - //send rom code for device - for(i=0;i<8;i++){ - OW_write_byte(device_id[i]); //I2C write ow byte - } - return 0x00; - -}// end OW_macth_rom - - -// ***************************************************************************** -// search_rom(char *) pointer to start of 2D array rom_id_list -// returns number of devices found -// ***************************************************************************** - - -int search_rom(char rom_id_list[MAX_DEVICES][ID_LENGTH]){ // searches for all device on OW bus, returns # found - - int bit_num; - int byte_num; - int last_zero; - int last_discrep; - int search_dir; - int rom_count; - char byte_mask; - int last_device; - int i; - - char rom_id[8]; //used in rom search - char data[8]; - char crc; - - //init for first search only - last_device = 0; - last_discrep = 0; - rom_count = 0; - - for(i=0;i<8;i++)rom_id[i] = 0x00; //clear rom_id - - do{ // loop for each rom search (end when last_device = 1) - - //init variable for each search - bit_num = 1; - byte_num = 0; - byte_mask = 1; - last_zero = 0; - - - //OW reset - if(OW_reset()){ //returns 1 if at least one device present - //test if last device found - if(last_device!=1){ // more devices to find - search_dir = 0; - OW_write_byte(OW_SEARCH); //send 0xF0 over one wire to init search rom - - do{ - //determine search direction - if(bit_num < last_discrep){ //before last discrepancy - if((rom_id[byte_num] & byte_mask) > 0){// use last rom path - search_dir = 1; // last path was 1 - }else{ - search_dir = 0; // last path was 0 - } - }else{ // at or past last discrepancy - if(bit_num == last_discrep){ // at last discrepancy - search_dir = 1; //been here before so use 1 - }else{ - search_dir = 0; //past last discrepancy so use 0 - } - } - - //write direction bit and get reply - data[0] = 0x78; - data[1] = search_dir << 7; //sets bit 7 of status reg to search_dir - i2c.write(DS2484_ADD,data,2,1); - - wait_us(250); - - //read in rom_id bits - i2c.read(DS2484_ADD,data,1); // read status byte - - //(todo) check for no device error here - - //get search direction used by triplet command - - if(data[0]&0x80){ //true --> DIR bit = 1 - search_dir = 1; - }else{ - search_dir = 0; - } - - //test for discrepancy (both 0 and 1 present at current bit number)(TSB = 0 (1's present) and SBR = 0 (0's present)) - if(!(data[0] & 0x60)){ // true --> discrepancy exist, both TSB and SBR = 0 - if(search_dir == 0)last_zero = bit_num; - } - if(search_dir == 1){ // write search dir to rom bit - rom_id[byte_num] |= byte_mask; - }else{ - rom_id[byte_num] &= ~byte_mask; - } - - //increment bit_num and byte_num if needed - bit_num++; - byte_mask <<= 1; //rotate 1 bit left - if(byte_mask == 0){ //if bit shifts out of byte set byte to 1 - byte_num++; //also increnent byt num - byte_mask = 1; - } - - - }while(bit_num<65); //bit nun started at 1 so end after 64 - last_discrep = last_zero; - if(last_discrep == 0)last_device = 1; - //copy rom_id into rom_id_list and calc crc of first 7 bytes - crc = 0x00; // reset crc8 total to 0 - for(i=7;i>=0;i--){ - rom_id_list[rom_count][i] = rom_id[i]; - } - - //clac_crc of rom ID - for (i=0;i<7;i++){ - crc = calc_crc8(crc, rom_id[i]); - } - - rom_count++; - }//if(last_device..) - }else{//if prescent -- if no device present rom count is 0 - return 0; - } - }while(last_device == 0); - return rom_count; -}// end search_rom() - -// ***************************************************************************** // OT07_write_register(char, char, char) writes single byte to OT07 // char I2C address // char OT07 register address @@ -577,354 +318,6 @@ return T; } -// ***************************************************************************** -// alarm_search(char *) pointer to start of 2D array rom_id_list -// returns number of devices found with alarm triggered -// ***************************************************************************** - -int alarm_search(char rom_id_list[MAX_DEVICES][ID_LENGTH]){ // searches for all devices with alarm triggered on OW bus, returns # found - - int bit_num; - int byte_num; - int last_zero; - int last_discrep; - int search_dir; - int rom_count; - char byte_mask; - int last_device; - int i; - - char rom_id[8]; //used in rom search - char data[8]; - char crc; - - //init for first search only - last_device = 0; - last_discrep = 0; - rom_count = 0; - - for(i=0;i<8;i++)rom_id[i] = 0x00; //clear rom_id - - do{ // loop for each rom search (end when last_device = 1) - - //init variable for each search - bit_num = 1; - byte_num = 0; - byte_mask = 1; - last_zero = 0; - - - //OW reset - if(OW_reset()){ //returns 1 if at least one device present - //test if last device found - if(last_device!=1){ // more devices to find - search_dir = 0; - OW_write_byte(OW_ALARM); //send 0xEC over one wire to init alarm search - - do{ - //determine search direction - if(bit_num < last_discrep){ //before last discrepancy - if((rom_id[byte_num] & byte_mask) > 0){// use last rom path - search_dir = 1; // last path was 1 - }else{ - search_dir = 0; // last path was 0 - } - }else{ // at or past last discrepancy - if(bit_num == last_discrep){ // at last discrepancy - search_dir = 1; //been here before so use 1 - }else{ - search_dir = 0; //past last discrepancy so use 0 - } - } - - //write direction bit and get reply - data[0] = 0x78; - data[1] = search_dir << 7; //sets bit 7 of status reg to search_dir - i2c.write(DS2484_ADD,data,2,1); - - wait_us(250); - - //read in rom_id bits - i2c.read(DS2484_ADD,data,1); // read status byte - - //(todo) check for no device error here - - //get search direction used by triplet command - - if(data[0]&0x80){ //true --> DIR bit = 1 - search_dir = 1; - }else{ - search_dir = 0; - } - - //test for discrepancy (both 0 and 1 present at current bit number)(TSB = 0 (1's present) and SBR = 0 (0's present)) - if(!(data[0] & 0x60)){ // true --> discrepancy exist, both TSB and SBR = 0 - if(search_dir == 0)last_zero = bit_num; - } - if(search_dir == 1){ // write search dir to rom bit - rom_id[byte_num] |= byte_mask; - }else{ - rom_id[byte_num] &= ~byte_mask; - } - - //increment bit_num and byte_num if needed - bit_num++; - byte_mask <<= 1; //rotate 1 bit left - if(byte_mask == 0){ //if bit shifts out of byte set byte to 1 - byte_num++; //also increnent byt num - byte_mask = 1; - } - - - }while(bit_num<65); //bit nun started at 1 so end after 64 - last_discrep = last_zero; - if(last_discrep == 0)last_device = 1; - //copy rom_id into rom_id_list and calc crc of first 7 bytes - crc = 0x00; // reset crc8 total to 0 - for(i=7;i>=0;i--){ - rom_id_list[rom_count][i] = rom_id[i]; - } - - //clac_crc of rom ID - for (i=0;i<7;i++){ - crc = calc_crc8(crc, rom_id[i]); - } - - rom_count++; - }//if(last_device..) - }else{//if prescent -- if no device present rom count is 0 - return 0; - } - }while(last_device == 0); - - //check if rom_id from alarm search is all 1s (this means there was a presence pulse but no alarm is triggered) - bool bad_rom_id = true; - for(int i = 0; i < 7; i++) - { - if(rom_id_list[0][i] != 0xFF) - bad_rom_id = false; //found a byte in the rom id that isn't all 1s - } - if(bad_rom_id) - return 0; - - return rom_count; -}// end alarm_search() - - -// ******************** write_OW_register() ******************************** -// write_OW_register(char*, int, int, char*) -// char* pointer to rom_id -// int start address -// int number of bytes to write -// char* pointer to write data location -// returns 0 if CRC match data -// returns -1 if CRC does not match data -// -// ***************************************************************************** - - - -int write_OW_register(char *device_ID, int start_add, int n, char *data){ - int i; - //select device - OW_reset(); - OW_match_rom(device_ID); - //set start address - OW_write_byte(OT07_OW_WRITE); // send 0xCC, OW write register command for OT07 - OW_write_byte(start_add); // send write register start address - OW_write_byte(n-1); // send length of bytes to write (00-> one byte) - for(i=0;i<n;i++){ // send n bytes of data - OW_write_byte(data[i]); - } - OW_read_byte(data,2); // read 2 byte CRC - - // --- todo ---- - // calculate CRC of - // Command + length + n bytes sent - // compare with 2 bytes read - - return 0; - -}//end write_OW_register - - - - -// ******************** read_OW_register() ******************************** -// read_OW_register(char*, int, int, char*) -// char* pointer to rom_id -// int start address -// int number of bytes to read, not including CRC bytes -// char* pointer to save data location -// returns 0 if CRC match data -// returns -1 if CRC does not match data -// -// ***************************************************************************** - - - -int read_OW_register(char *device_ID, int start_add, int n, char *data){ - - //int i; - //select device - OW_reset(); - OW_match_rom(device_ID); - //set start address - OW_write_byte(OT07_OW_READ); // send 0x33, OW read register command for OT07 - OW_write_byte(start_add); // send read register start address - OW_write_byte(n-1); // send length of bytes to read (0 -> 1 byte) - OW_read_byte(data,n+2); // read n bytes plus 2 byte CRC - - // --- todo ---- - // calculate CRC of - // Command + length + n bytes - // compare with last 2 bytes read - return 0; - -}//end read_OW_register - -int set_test_mode(char *device_id){ - char data[4]; - - // enter test mode - OW_reset(); - OW_match_rom(device_id); // match ROM - OW_write_byte(OT07_OW_WRITE); // device write register command - OW_write_byte(0xFF); // device register address - OW_write_byte(0x00); // number of bytes to write -1 - OW_write_byte(0x54); // first half of test mode pass code - OW_read_byte(data,2); // read 2 byte CRC - - OW_reset(); - OW_match_rom(device_id); - OW_write_byte(OT07_OW_WRITE); // device write register command - OW_write_byte(0xFF); // device register address - OW_write_byte(0x00); // number of bytes to write -1 - OW_write_byte(0x4D); // second half of test mode pass code - OW_read_byte(data,2); // read 2 byte CRC - - // set ADC_ENABLED - OW_reset(); - OW_match_rom(device_id); - OW_write_byte(OT07_OW_WRITE); // device write register command - OW_write_byte(0x81); // device register address - OW_write_byte(0x00); // number of bytes to write -1 - OW_write_byte(0x04); // ADC_ENABLED code - OW_read_byte(data,2); // read 2 byte CRC - - OW_reset(); - OW_match_rom(device_id); - OW_write_byte(OT07_OW_WRITE); // device write register command - OW_write_byte(0x98); // device register address - OW_write_byte(0x05); // number of bytes to write -1 - OW_write_byte(0x40); // add 98 data 40 - OW_write_byte(0xD4); // add 99 data D4 - OW_write_byte(0xE0); // add 9A data E0 - OW_write_byte(0xB3); // add 9B data B3 - OW_write_byte(0x09); // add 9C data 09 - OW_write_byte(0xBA); // add 9D data BA - OW_read_byte(data,2); // read 2 byte CRC - - - //OTP copy - OW_reset(); - OW_match_rom(device_id); - OW_write_byte(OT07_OW_WRITE); // device write register command - OW_write_byte(0x80); // device register address - OW_write_byte(0x00); // number of bytes to write -1 - OW_write_byte(0x82); // - OW_read_byte(data,2); // read 2 byte CRC - - OW_reset(); - OW_match_rom(device_id); - OW_write_byte(OT07_OW_WRITE); // device write register command - OW_write_byte(0x80); // device register address - OW_write_byte(0x00); // number of bytes to write -1 - OW_write_byte(0x02); // - OW_read_byte(data,2); // read 2 byte CRC - - - OW_reset(); - OW_match_rom(device_id); - OW_write_byte(OT07_OW_WRITE); // device write register command - OW_write_byte(0xFF); // device register address - OW_write_byte(0x00); // number of bytes to write -1 - OW_write_byte(0x00); // exit Test mode - OW_read_byte(data,2); // read 2 byte CRC - return 0; -}// end set_test_mode() - - - -// ******************** convert_temperature() ******************************** -// convert_temperature() -// returns 0 -// dose not block for 0.75 seconds. -// ***************************************************************************** - -int convert_temperature(){ // convert sent to all OW devices - - char data[8]; - OW_reset(); - - OW_write_byte(OW_SKIP); // send 0xCC, skip rom command - - // activate strong pullup - data[0] = WDC; // send 0xD2 Write Device Configuration - data[1] = 0xA5; // 1010 0101 b strong and active pullup on - i2c.write(DS2484_ADD,data,2,0); - - //convert command - OW_write_byte(OT07_OW_CONVERT); // send 0x44, Convert Temperature - OW_read_byte(data,2); // read 2 byte CRC - return 0; -} - - -// ******************** convert_temperature() ******************************** -// convert_temperature(char *) takes 8 byte rom_id as input -// returns 0 -// dose not block for 0.75 seconds. -// ***************************************************************************** - -int convert_temperature(char *device_id){ - - char data[8]; - OW_reset(); - OW_match_rom(device_id); // send device id - - // activate strong pullup - data[0] = WDC; // send 0xD2 Write Device Configuration - data[1] = 0xA5; // 1010 0101 b strong and active pullup on - i2c.write(DS2484_ADD,data,2,0); - - //convert command - OW_write_byte(OT07_OW_CONVERT); // send 0x44, Convert Temperature - OW_read_byte(data,2); // read 2 byte CRC - return 0; -} - -//************************ get_temperature() ********************************* -// get_temperature(char *) takes 8 byte rom_id as input -// returns double temperature in oC -//****************************************************************************** - -double get_temperature(char *device_id){ - - char t[4]; - double T; - int count; - // char data[2]; - - read_OW_register(device_id,OT07_FIFO_DATA,0x02,t); // Read temperature from FIFO, 2 bytes - //calculate temperture from data - count = (int)(t[0]*256 + t[1]); - if (count >= 32768)count = count - 65536; // 2s comp - T = (double)count*0.005; - - return T; -}// end get_temperature() - void write_settings_file(int interval, bool device_logged[MAX_DEVICES]) { @@ -1472,27 +865,6 @@ case 'T': case 't': - if(n == 2){//get temperatures from selected device - for(k=0;k<8;k++){ - device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list - } - convert_temperature(device_id); //send OW convert selected device - wait(0.02); //wait 20 ms for convert temperature to complete - T[0] = get_temperature(device_id); - pc.printf("device[%02X] temperature[%.3f]\r\n",device,T[0]); - } - if(n == 3){ // "t 1 5" get temperature for devices 1 thru 5 - - convert_temperature(); //send OW convert to all devices - wait(0.02); //wait 750 ms for convert temperature to complete - for(j=device;j<=arg1;j++){ - for(k=0;k<8;k++){ - device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list - } - pc.printf("device[%02X] temperature[%.3f]\r\n",j,get_temperature(device_id)); - } - } - if(n == 2){//get temperatures from selected device @@ -1530,6 +902,7 @@ case 'x': case 'X': // experimental modes // ****************** set up ADC enabled in test mode***************** + /* pc.printf("<set ADC_ENABLED in test mode>\r\n"); for(j=0;j<device_count;j++){ @@ -1537,7 +910,7 @@ device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list } set_test_mode(device_id); - } + } */ break; @@ -1557,16 +930,23 @@ if(log_flag == true){ if(time_count >= time_to_sample){ //take next sample time_to_sample += log_interval; // calculate time for next sample - + + ///////////////////////temp conversion and assignment to T[]////////////////////////////////////// // start conversion - convert_temperature(); + /*convert_temperature(); wait(0.02); //wait 20ms for convert to complete 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 } T[j] = get_temperature(device_id); + }*/ + for(j=0;j<device_count;j++){ + convert_temperature(OT07[j].I2C_address); + wait(0.02); //wait 20ms for convert temperature to complete + T[j] = get_temperature(OT07[j].I2C_address); } + ///////////////////////////////////////////////////////////////////////////////////////////////// //open file for microSD logging FILE *fp = fopen(log_file, "a");