![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
MAX30208 I2C Terminal Interface
Dependencies: max32630fthr USBDevice
Revision 17:65cd58826416, committed 2020-09-04
- Comitter:
- elloway
- Date:
- Fri Sep 04 21:15:38 2020 +0000
- Parent:
- 16:5354dfc07268
- Commit message:
- initial commit
Changed in this revision
MAX30208_I2C_Terminal_Interface.cpp | Show annotated file Show diff for this revision Revisions of this file |
MAX30208_I2C_Terminal_Interface_03.cpp | Show diff for this revision Revisions of this file |
diff -r 5354dfc07268 -r 65cd58826416 MAX30208_I2C_Terminal_Interface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MAX30208_I2C_Terminal_Interface.cpp Fri Sep 04 21:15:38 2020 +0000 @@ -0,0 +1,632 @@ +#include "mbed.h" +#include "max32630fthr.h" +#include "USBSerial.h" + +//#define OT07_ADDRESS 0xA0 // OTO7 Base Address + +#define DEBUG 1 // 0->off, 1-> on, debug prints to daplink port + +//OT07 Registers +#define OT07_STATUS 0x00 // OT07 status regiter +#define OT07_INT_EN 0x01 // OT07 Interrupt Enable +#define OT07_FIFO_W 0x04 // OT07 FIFO Write Pointer +#define OT07_FIFO_R 0x05 // OT07 FIFO Read Pointer +#define OT07_FIFO_OF 0x06 // OT07 FIFO Overflow Counter +#define OT07_FIFO_COUNT 0x07 // OT07 FIFO Data Count +#define OT07_FIFO_DATA 0x08 // OT07 FIFO Data +#define OT07_FIFO_CNFG1 0x09 // OT07 FIFO Configuration 1 (FIFO_A_FULL) +#define OT07_FIFO_CNFG2 0x0A // OT07 FIFO Configuration 2 +#define OT07_SYS 0x0C // OT07 System Configuration +#define OT07_ALARM_HIGH_MSB 0x10 // OT07 Alarm High MSB +#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_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_ROM_ID 0x30 // OT07 ROM_ID address of LSB? + +#define ID_LENGTH 8 // Rom ID length in bytes +#define BS 8 // ASCII Back Space +#define CR 13 // ASCII Carriage Return + +//global variable + +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 + + }; + + + bool sample_flag; // global flag indicating its time to take next sample. + +//******************** init Feather Boared Hardware *********************** + +MAX32630FTHR pegasus(MAX32630FTHR::VIO_1V8); + +//Configure serial ports +Serial db(P2_1, P2_0); // Hardware serial debug port over DAPLink, 9600 defult baudrate +USBSerial pc; // Virtual serial port over USB + +// I2C setup +I2C i2c(P3_4,P3_5); // P3_4 -> I2C1_SDA, P3_5-> I2C1_SCL + +//Timer setup +Ticker timer_1; // timer for blinking led heartbeat and setting tick_flag +Ticker timer_2; // timer for controling sample rate. + +//LED blink setup +DigitalOut rLED(LED1); +DigitalOut gLED(LED2); +DigitalOut bLED(LED3); + +// ***************************************************************************** +// LED_blink_callback() attached to timer1 interupt +// blinks Feather board led and sets tick_flag true +// ***************************************************************************** + +void LED_blink_callback(){ // LED Heart beat + + bLED=!bLED; //toggle Green LED + +} + + +// ***************************************************************************** +// set_sample_flag_callback() sets sample_flag = true// +// ***************************************************************************** + +void set_sample_flag_callback(){ //set sample flag interrupt + sample_flag = true; + +} + +// ***************************************************************************** +// 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(DEBUG)db.printf("i2c[%02X] e[%d]\n\r",I2C_add,error); + if(error == 0){ + if(data[0] == 0x30){ + + OT07_read_register(I2C_add,OT07_GPIO_CTRL,data,1); //read GPIO location address + //if(DEBUG)db.printf("Found device at address 0x%02X\n\rGPIO location %02X dc[%d]\r\n",I2C_add,data[0],device_count); + 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++; + } + } + + }//end for(i...) + return device_count; +}// end search_I2C() + + + +// ***************************************************************************** +// 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; +} + +//****************************************************************************** +// print_device_list(OT07_struct *, int) prints list of devices found +// OT07_struct* pointer to OT07 device structure array +// int number of devices i array +// returns 0 +//****************************************************************************** + +int print_device_list(OT07_struct OT07[], int n){ + int i; + int j; + for(j=0;j<n;j++){ // loop thru n devices + pc.printf("%02d, ",j); // print device index + pc.printf("%02X, ",OT07[j].I2C_address); // print I2C address + pc.printf("%02X, ",OT07[j].rom_id[7]); // print CRC + for(i=6;i>=1;i--){ + pc.printf("%02X",OT07[j].rom_id[i]); // printf ROM ID + } + pc.printf(", %02X",OT07[j].rom_id[0]); // print family code + pc.printf("\r\n"); + } + return 0; +} + + +//****************************************************************************** +// main() +//****************************************************************************** + +int main() +{ + + OT07_struct OT07[4]; // structure that holds I2C address and ROM_ID + + char data[130]; // char vector used for passing data to read and write register calls + char s[128]; // temp char array + int device_count = 0; // number of I2C devices found by search_I2C_bus() + int i; // loop counter + int j; // loop counter + double T[4]; // holds temperature reading + + // i/o variables for serial com port + char rx_buff[128]; // comport input buffer + int rx_index; // rx_buffer pointer + char c; // command type character + char str[16]; // temp string + int n; // argument count + int arg0; // device argument + int arg1; // argumnet 1 + int arg2; // argument 2 + + int num_bytes; // calculated number of byte to read + + int period = 1000; // sample period in ms + int sample_count = 0; // sample index for log + int delay = 25; + + int i2c_freq = 1; // i2c clock frequency 0->100000kHz, 1->400000kHz + + bool log_flag = false; // true -> log temperature to serial port, false -> do not log + bool ext_convert_flag = true; + int echo = 1; // 0 -> echo off, 1 -> echo terminal input and use verbose output + + + int L3out = 1800; // Sets mV for L3OUT (3V3 on DS2484 Feather Wing board) 1800 to 3600 mV allowed. + + +//************* init ticker timer callbacks **************** + timer_1.attach(&LED_blink_callback,1.0); //start ticker interupt, once per sec. + +//********************* init I2C port *********************** + i2c.frequency(i2c_freq); //set I2C clock 0-->100kHz, 1-->400kHz + + +//******************* init VDD (L3OUT) ********************** + if(DEBUG)db.printf("set LDO3 to %dmV\r\n",L3out); + pegasus.max14690.ldo3SetVoltage(L3out); // sets VDD and I2C to L3out + +//********* echo firmware info to both serial ports ********* + wait(1); //wait 1 sec for USB serial port to init. + sprintf(s,"--- MAX30208 I2C Terminal Interface V0.3 ---\r\n"); + if(DEBUG)db.printf("%s",s); + pc.printf("%s",s); + pc.printf("VDD = %dmV, I2C clock = %dkHz\r\n",L3out, 100*(i2c_freq*3 + 1)); + +//********************** init LEDs ************************* + rLED = LED_OFF; + gLED = LED_ON; + bLED = LED_OFF; + +//******************** Find I2C devices on bus ************** + pc.printf("<search for devices>\r\n"); + device_count = search_I2C_bus(OT07); + pc.printf("<device, I2C Add, CRC, ROM ID, Family>\r\n"); + print_device_list(OT07, device_count); + + + //************* init rx input buffer index ****************** + rx_index = 0; + sample_flag = false; + + //************** start main loop *************************** + if(DEBUG)db.printf("start Main loop\r\n"); + + while(1) { // start main loop, take data if log flag true, check for input, repeat + + //wait(0.2); + if(log_flag == true){ + if(sample_flag == true){// take sample. + sample_flag = false; + convert_temperature(OT07[0].I2C_address); + wait_ms(delay); + T[0] = get_temperature(OT07[0].I2C_address); + pc.printf("%5d, %7.3f\r\n",sample_count++,T[0]); + } + }// end if(log_flag == true) + + // ---------------------------------------------------------------------------- + // test for charater input for USB com port + // ---------------------------------------------------------------------------- + + //test if PC sent some charaters + while(pc.readable()){ //characters in buffer, get them + rx_buff[rx_index] = pc.getc(); + if(echo)pc.putc(rx_buff[rx_index]); //echo character + //pc.printf("<[%02x] %c i[%d]>",rx_buff[i],rx_buff[i],i); //echo charater + + + if(rx_buff[rx_index] == CR){ + //if(DEBUG)db.printf("\r\n"); + if(echo)pc.printf("\r\n"); + rx_buff[++rx_index] = 0; + if(DEBUG)db.printf("%s",rx_buff); + //pc.printf("%s\r\n",rx_buff); + rx_index = -1; // because i++ at end of while give i=0 on next loop + arg0 = 0; + arg1 = 0; + arg2 = 0; + + n = sscanf(rx_buff, " %c %d %x %x", &c, &arg0, &arg1, &arg2); + + //if(DEBUG)db.printf("c[%c] d[%d] a1[%x] a2[%x] n[%d]\r\n",c,arg0,arg1,arg2,n); //echo values read in + //process input + if(n > 0){//got input so process it + switch(c){ + + + case 'd': + case 'D': // Delay after convert command sent (ms) + if(n == 2){ + delay = arg0; + if(delay < 5)delay = 5; + if(delay > 1000)delay = 1000; + } + if(echo)pc.printf("<delay = %dms>\r\n",delay); + break; + + case 'e': + case 'E': // Turn echo ON/OFF + if(arg0 == 0){ + echo = 0; + }else{ + echo = 1; + pc.printf("<echo on>\r\n"); + } + break; + + case 'f': + case 'F': // change I2C Frequency + if(n == 2){ + if((arg0 == 0)||(arg0 == 1)){ + i2c_freq = arg0; + i2c.frequency(i2c_freq); + } + } + if(echo)pc.printf("<I2C Frequency = %dkHz>\r\n",100*(i2c_freq*3 + 1)); + break; + + case 'h': + case 'H': + case '?': //print command list + + + pc.printf("Command Help\r\n"); + + pc.printf("\r\n"); + pc.printf("d ms Set delay time for read command after convert command in ms\r\n"); + pc.printf(" ms, Delay time in ms (int) \r\n"); + pc.printf(" 5ms through 10000ms allowed \r\n"); + pc.printf("\r\n"); + + pc.printf("e n Terminal command echo on/off\r\n"); + pc.printf(" n, Echo ON/OFF flag (int)\n\r"); + pc.printf(" 0 -> echo off\r\n"); + pc.printf(" 1 -> echo on\r\n"); + pc.printf("\r\n"); + + pc.printf("f n I2C Clock Frequency set\r\n"); + pc.printf(" n, Frequency Index (int)\n\r"); + pc.printf(" 0 -> 100kHz\r\n"); + pc.printf(" 1 -> 400kHz on\r\n"); + pc.printf("\r\n"); + + pc.printf("h,? Prints Command Help\r\n"); + pc.printf("\r\n"); + + pc.printf("l [ms] Start/Stop interval logging output to terminal\r\n"); + pc.printf(" ms, if included sets logging interval in ms (int)\r\n"); + pc.printf(" ms = 0 turns off loging\r\n"); + pc.printf("\r\n"); + + pc.printf("p ms Set logging sample period in ms\r\n"); + pc.printf(" ms, Convert period in ms (int) \r\n"); + pc.printf(" 20ms through 60,000ms allowed \r\n"); + pc.printf("\r\n"); + + + pc.printf("r d add [end_add] Read device regester\r\n"); + pc.printf(" d, device index (int)\r\n"); + pc.printf(" add, address to read (hex)\r\n"); + pc.printf(" end_add, if included read all registers from add to end_add (hex)\r\n"); + pc.printf("\r\n"); + pc.printf("s Search I2C bus for all attached devices\r\n"); + pc.printf("\r\n"); + pc.printf("t d [end_d] Send convert temperature command to device and read temperature\r\n"); + pc.printf(" d, device index (int)\r\n"); + pc.printf(" end_d, if included sends skip ROM convert command (int)\r\n"); + pc.printf(" and reads back from device d through end_d\r\n"); + pc.printf("\r\n"); + pc.printf("w d add data Write to device register\r\n"); + pc.printf(" d, device index (int)\r\n"); + pc.printf(" add, write address (hex)\r\n"); + pc.printf(" data, data to write (hex)\r\n"); + pc.printf("\r\n"); + pc.printf("v mV Set VDD of device\r\n"); + pc.printf(" mV, VDD in mV (int)\r\n"); + pc.printf(" 1800mV to 3600mV allowed in 100mV steps"); + pc.printf("\r\n"); + + break; + + + case 'l': + case 'L': // Toggle logging + if((n==2)&&(arg0 == 0)){ //force stop + if(echo)pc.printf("<stop logging [by 0]>\r\n"); + log_flag = false; + timer_2.detach(); + sample_flag = false; + }else{ + + if(n == 2){ + period = arg0; + if(period < 5)period = 5; + if(period > 60000)period = 60000; + } + if(log_flag == false){ //start logging + if(echo)pc.printf("<start logging, period = %dms>\r\n",period); + sample_count = 0; + if(period > 1000){// dont wait for first tick + sample_flag = true; + }else{ + sample_flag = false; + } + log_flag = true; + timer_2.attach_us(&set_sample_flag_callback,period*1000); //start ticker interupt. + + }else{ // n != 2 and log_flag = true + if(echo)pc.printf("<stop logging>\r\n"); + log_flag = false; + timer_2.detach(); + sample_flag = false; + } + }// end else if((n==2)&&(arg0==0)) + break; + + case 'p': + case 'P': //Set sample period in ms + + if(n == 2){ + period = arg0; + if(period < 20)period = 20; + if(period > 60000)period = 60000; + } + if(log_flag == true){ //update sample_flag interrupt period + timer_2.detach(); // stop current timer + if(echo)pc.printf("<period = %dmS>\r\n",period); + timer_2.attach_us(&set_sample_flag_callback,period*1000); // restart with new period + }else{ + if(echo)pc.printf("<set sampling period, %dmS>\r\n",period); + } + break; + + + case 'r': + case 'R': //read register "r device radd.start radd.end" + if(n==3){ //read single register from selected device + OT07_read_register(OT07[arg0].I2C_address,arg1,data,1); + if(echo){ + pc.printf("device[%02d] add[%02X] data[%02X] \r\n",arg0,arg1,data[0]); + }else{ + pc.printf("%02d, %02X, %02X\r\n",arg0,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. + OT07_read_register(OT07[arg0].I2C_address,arg1,data,num_bytes); + for(i=0;i<num_bytes;i++){ + if(echo){ + pc.printf("\r\ndevice[%02d] add[%02X] data[%02X]",arg0,arg1+i,data[i]); + }else{ + pc.printf("%02d, %02X, %02X\r\n",arg0,arg1+i,data[i]); + } + } + if(echo)pc.printf("\r\n"); + } + break; + + case 's': + case 'S': + // ****************** search for I2C devices on bus ***************** + + device_count = search_I2C_bus(OT07); + if(echo){ + pc.printf("<search I2C bus>\r\n"); + pc.printf("<count>\r\n"); + pc.printf("<device, I2C Add, CRC, ROM ID, Family>\r\n"); + } + pc.printf("%2d\r\n",device_count); + print_device_list(OT07,device_count); + + break; + + case 'T': + case 't': + if(n == 2){//get temperatures from selected device + + convert_temperature(OT07[arg0].I2C_address); //send OW convert selected device + wait(0.02); //wait 20 ms for convert temperature to complete + T[arg0] = get_temperature(OT07[arg0].I2C_address); + if(echo)pc.printf("<temperature>\r\n"); + pc.printf("%02d, %7.3f\r\n",arg0, T[arg0]); + } + + 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); + + for(j=arg0;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); + } + + if(echo)pc.printf("<device, temperature>\r\n"); + for(j=arg0;j<=arg1;j++){ + pc.printf("%02d, %7.3f\r\n",j,T[j]); + } + } + + break; + case 'w': + case 'W': //write register + //data[0] = arg2; + OT07_write_register(OT07[arg0].I2C_address,arg1, arg2); + if(echo)pc.printf("write -- add[%02X] data[%02X]\r\n",arg1,arg2); + + break; + + + case 'v': + case 'V': //Set MAX32630FTHR I/O Voltage 0 -> 1.8V, 1 -> 3.3V + + if(n == 2){ //set LDO3 + L3out = arg0; + if(L3out < 1600)L3out = 1600; // check for valid mV range + if(L3out > 3600)L3out = 3600; + L3out = ((L3out+50)/100)*100; // round to 100mV steps + pegasus.max14690.ldo3SetVoltage(L3out); // set ldo3 to L3out + if(echo)pc.printf("<Set ldo3 (VDD) to %4dmV, ",L3out); + if(DEBUG)db.printf("<ldo3 to %4dmV>\r\n",L3out); + + if(L3out >= 1900){ //set VIO to 3300mV + // set VIO to 3v3 + pegasus.vddioh(P3_4, pegasus.VIO_3V3); // SDA use LDO2 + pegasus.vddioh(P3_5, pegasus.VIO_3V3); // SCL use LDO2 + pegasus.vddioh(P5_3, pegasus.VIO_3V3); // GPIO0 use LDO2 + pegasus.vddioh(P5_6, pegasus.VIO_3V3); // GPIO1 use LDO2 + if(echo)pc.printf(" Set VIO=3V3>\r\n"); + }else{//set VIO to 1V8 + pegasus.vddioh(P3_4, pegasus.VIO_1V8); // SDA use 1V8 buck + pegasus.vddioh(P3_5, pegasus.VIO_1V8); // SCL use 1V8 buck + pegasus.vddioh(P5_3, pegasus.VIO_1V8); // GPIO0 use 1V8 buck + pegasus.vddioh(P5_6, pegasus.VIO_1V8); // GPIO1 use 1V8 buck + if(echo)pc.printf(" Set VIO=1V8>\r\n"); + } + }else{ + if(echo)pc.printf("<ldo3 (VDD) %4dmV>\r\n",L3out); + } + break; + + }//end switch(c) + }//if(n>0) + }//end if(CR) + if(rx_buff[rx_index] == BS){ //backspace received, back up buffer pointer + if(rx_index>0)rx_index--; //remove last char from buffer if not at start. + }else rx_index++; + }//end while(pc.redable()) + + }//end while(1) Main Loop +}// end_Main \ No newline at end of file
diff -r 5354dfc07268 -r 65cd58826416 MAX30208_I2C_Terminal_Interface_03.cpp --- a/MAX30208_I2C_Terminal_Interface_03.cpp Mon May 13 17:36:19 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,672 +0,0 @@ -#include "mbed.h" -#include "max32630fthr.h" -#include "USBSerial.h" - -//#define OT07_ADDRESS 0xA0 // OTO7 Base Address - -#define DEBUG 1 // 0->off, 1-> on, debug prints to daplink port - -//OT07 Registers -#define OT07_STATUS 0x00 // OT07 status regiter -#define OT07_INT_EN 0x01 // OT07 Interrupt Enable -#define OT07_FIFO_W 0x04 // OT07 FIFO Write Pointer -#define OT07_FIFO_R 0x05 // OT07 FIFO Read Pointer -#define OT07_FIFO_OF 0x06 // OT07 FIFO Overflow Counter -#define OT07_FIFO_COUNT 0x07 // OT07 FIFO Data Count -#define OT07_FIFO_DATA 0x08 // OT07 FIFO Data -#define OT07_FIFO_CNFG1 0x09 // OT07 FIFO Configuration 1 (FIFO_A_FULL) -#define OT07_FIFO_CNFG2 0x0A // OT07 FIFO Configuration 2 -#define OT07_SYS 0x0C // OT07 System Configuration -#define OT07_ALARM_HIGH_MSB 0x10 // OT07 Alarm High MSB -#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_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_ROM_ID 0x30 // OT07 ROM_ID address of LSB? - -#define ID_LENGTH 8 // Rom ID length in bytes -#define BS 8 // ASCII Back Space -#define CR 13 // ASCII Carriage Return - -//global variable - -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 - - }; - - - bool sample_flag; // global flag indicating its time to take next sample. - -//******************** init Feather Boared Hardware *********************** - -MAX32630FTHR pegasus(MAX32630FTHR::VIO_1V8); - -//Configure serial ports -Serial db(P2_1, P2_0); // Hardware serial debug port over DAPLink, 9600 defult baudrate -USBSerial pc; // Virtual serial port over USB - -// I2C setup -I2C i2c(P3_4,P3_5); // P3_4 -> I2C1_SDA, P3_5-> I2C1_SCL - -//Timer setup -Ticker timer_1; // timer for blinking led heartbeat and setting tick_flag -Ticker timer_2; // timer for controling sample rate. - -//LED blink setup -DigitalOut rLED(LED1); -DigitalOut gLED(LED2); -DigitalOut bLED(LED3); - -// ***************************************************************************** -// LED_blink_callback() attached to timer1 interupt -// blinks Feather board led and sets tick_flag true -// ***************************************************************************** - -void LED_blink_callback(){ // LED Heart beat - - bLED=!bLED; //toggle Green LED - -} - - -// ***************************************************************************** -// set_sample_flag_callback() sets sample_flag = true// -// ***************************************************************************** - -void set_sample_flag_callback(){ //set sample flag interrupt - sample_flag = true; - -} - -// ***************************************************************************** -// 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(DEBUG)db.printf("i2c[%02X] e[%d]\n\r",I2C_add,error); - if(error == 0){ - if(data[0] == 0x30){ - - OT07_read_register(I2C_add,OT07_GPIO_CTRL,data,1); //read GPIO location address - //if(DEBUG)db.printf("Found device at address 0x%02X\n\rGPIO location %02X dc[%d]\r\n",I2C_add,data[0],device_count); - 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++; - } - } - - }//end for(i...) - return device_count; -}// end search_I2C() - - - -// ***************************************************************************** -// 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; -} - -//****************************************************************************** -// print_device_list(OT07_struct *, int) prints list of devices found -// OT07_struct* pointer to OT07 device structure array -// int number of devices i array -// returns 0 -//****************************************************************************** - -int print_device_list(OT07_struct OT07[], int n){ - int i; - int j; - for(j=0;j<n;j++){ // loop thru n devices - pc.printf("%02d, ",j); // print device index - pc.printf("%02X, ",OT07[j].I2C_address); // print I2C address - pc.printf("%02X, ",OT07[j].rom_id[7]); // print CRC - for(i=6;i>=1;i--){ - pc.printf("%02X",OT07[j].rom_id[i]); // printf ROM ID - } - pc.printf(", %02X",OT07[j].rom_id[0]); // print family code - pc.printf("\r\n"); - } - return 0; -} - - -//****************************************************************************** -// main() -//****************************************************************************** - -int main() -{ - - OT07_struct OT07[4]; // structure that holds I2C address and ROM_ID - - char data[130]; // char vector used for passing data to read and write register calls - char s[128]; // temp char array - int device_count = 0; // number of I2C devices found by search_I2C_bus() - int i; // loop counter - int j; // loop counter - double T[4]; // holds temperature reading - - // i/o variables for serial com port - char rx_buff[128]; // comport input buffer - int rx_index; // rx_buffer pointer - char c; // command type character - char str[16]; // temp string - int n; // argument count - int arg0; // device argument - int arg1; // argumnet 1 - int arg2; // argument 2 - - int num_bytes; // calculated number of byte to read - - int period = 1000; // sample period in ms - int sample_count = 0; // sample index for log - int delay = 25; - - int i2c_freq = 1; // i2c clock frequency 0->100000kHz, 1->400000kHz - - bool log_flag = false; // true -> log temperature to serial port, false -> do not log - bool ext_convert_flag = true; - int echo = 1; // 0 -> echo off, 1 -> echo terminal input and use verbose output - - - int L3out = 1800; // Sets mV for L3OUT (3V3 on DS2484 Feather Wing board) 1800 to 3600 mV allowed. - - -//************* init ticker timer callbacks **************** - timer_1.attach(&LED_blink_callback,1.0); //start ticker interupt, once per sec. - -//********************* init I2C port *********************** - i2c.frequency(i2c_freq); //set I2C clock 0-->100kHz, 1-->400kHz - - -//******************* init VDD (L3OUT) ********************** - if(DEBUG)db.printf("set LDO3 to %dmV\r\n",L3out); - pegasus.max14690.ldo3SetVoltage(L3out); // sets VDD and I2C to L3out - -//********* echo firmware info to both serial ports ********* - wait(1); //wait 1 sec for USB serial port to init. - sprintf(s,"--- MAX30208 I2C Terminal Interface V0.3 ---\r\n"); - if(DEBUG)db.printf("%s",s); - pc.printf("%s",s); - pc.printf("VDD = %dmV, I2C clock = %dkHz\r\n",L3out, 100*(i2c_freq*3 + 1)); - -//********************** init LEDs ************************* - rLED = LED_OFF; - gLED = LED_ON; - bLED = LED_OFF; - -//******************** Find I2C devices on bus ************** - pc.printf("<search for devices>\r\n"); - device_count = search_I2C_bus(OT07); - pc.printf("<device, I2C Add, CRC, ROM ID, Family>\r\n"); - print_device_list(OT07, device_count); - - - //************* init rx input buffer index ****************** - rx_index = 0; - sample_flag = false; - - //************** start main loop *************************** - if(DEBUG)db.printf("start Main loop\r\n"); - - while(1) { // start main loop, take data if log flag true, check for input, repeat - - //wait(0.2); - if(log_flag == true){ - if(sample_flag == true){// take sample. - sample_flag = false; - convert_temperature(OT07[0].I2C_address); - wait_ms(delay); - T[0] = get_temperature(OT07[0].I2C_address); - pc.printf("%5d, %7.3f\r\n",sample_count++,T[0]); - } - }// end if(log_flag == true) - - // ---------------------------------------------------------------------------- - // test for charater input for USB com port - // ---------------------------------------------------------------------------- - - //test if PC sent some charaters - while(pc.readable()){ //characters in buffer, get them - rx_buff[rx_index] = pc.getc(); - if(echo)pc.putc(rx_buff[rx_index]); //echo character - //pc.printf("<[%02x] %c i[%d]>",rx_buff[i],rx_buff[i],i); //echo charater - - - if(rx_buff[rx_index] == CR){ - //if(DEBUG)db.printf("\r\n"); - if(echo)pc.printf("\r\n"); - rx_buff[++rx_index] = 0; - if(DEBUG)db.printf("%s",rx_buff); - //pc.printf("%s\r\n",rx_buff); - rx_index = -1; // because i++ at end of while give i=0 on next loop - arg0 = 0; - arg1 = 0; - arg2 = 0; - - n = sscanf(rx_buff, " %c %d %x %x", &c, &arg0, &arg1, &arg2); - - //if(DEBUG)db.printf("c[%c] d[%d] a1[%x] a2[%x] n[%d]\r\n",c,arg0,arg1,arg2,n); //echo values read in - //process input - if(n > 0){//got input so process it - switch(c){ - - case 'b': - case 'B': //Set ADC_Res 0->13, 1->14, 2->15, 3->16 bits - if(n==3){ // apply to selected devices on bus - //db.printf("n=3"); - if((arg1 >= 0)&(arg1 < 4)){ //check input range 0 to 3 - if(echo)pc.printf("<set ADC_RES>\r\n"); - data[0] = (char)(arg1 << 6); // shift 2 lsb's to 2 msb's - OT07_write_register(OT07[arg0].I2C_address, OT07_ADC_SETUP, data, 1); - if(echo){ - OT07_read_register(OT07[arg0].I2C_address, OT07_ADC_SETUP, data, 1); - pc.printf("<device[%02d] set to %dbits 0x14[%02X]>\r\n",arg0,arg1+13,data[0]); - } - } - } - if(n == 4){ // apply to devices (device) through (arg1) - //db.printf("n=4"); - sprintf(str,"%x",arg1); //convert arg1 input as hex to decimal i.e. 0x10 becomes 10 dec, not 16 dec - sscanf(str,"%d",&arg1); - if((arg2 >= 0)&(arg2 < 4)){ //check input range 0 to 3 - if(echo)pc.printf("<set ADC_RES>\r\n"); - for(j=arg0;j<=arg1;j++){ - data[0] = (char)(arg2 << 6); // shift 2 lsb's to 2 msb's - OT07_write_register(OT07[j].I2C_address, OT07_ADC_SETUP, data, 1); - if(echo){ - OT07_read_register(OT07[j].I2C_address, OT07_ADC_SETUP, data, 1); - pc.printf("device[%02d] add[%02X] data[%02X] crc[%02X %02X]\r\n",j,OT07_ADC_SETUP,data[0],data[1],data[2]); - } - } - }// end if(agr2 >= ...) - }// end if(n == 4) - break; - - case 'd': - case 'D': // Turn echo ON/OFF - if(n == 2){ - delay = arg0; - if(delay < 5)delay = 5; - if(delay > 1000)delay = 1000; - } - if(echo)pc.printf("<delay = %dmS>\r\n",delay); - break; - - case 'e': - case 'E': // Turn echo ON/OFF - if(arg0 == 0){ - echo = 0; - }else{ - echo = 1; - pc.printf("<echo on>\r\n"); - } - break; - - case 'f': - case 'F': // change I2C Frequency - if(n == 2){ - if((arg0 == 0)||(arg0 == 1)){ - i2c_freq = arg0; - i2c.frequency(i2c_freq); - } - } - if(echo)pc.printf("<I2C Frequency = %dkHz>\r\n",100*(i2c_freq*3 +1)); - break; - - case 'h': - case 'H': - case '?': //print command list - - - pc.printf("Command Help\r\n"); - pc.printf("\r\n"); - pc.printf("b d [end_d] n Set ADC_Res, n = 2msb's of reg 0x14\r\n"); - pc.printf(" d, device index (int)\r\n"); - pc.printf(" end_d, if included applies ADC_res to deviecs d through end_d (int)\r\n"); - pc.printf(" n, ADC resolution index (int)\r\n"); - pc.printf(" 0 -> 13 bits\r\n"); - pc.printf(" 1 -> 14 bits\r\n"); - pc.printf(" 2 -> 15 bits\r\n"); - pc.printf(" 3 -> 16 bits\r\n"); - pc.printf("\r\n"); - - pc.printf("d ms Set delay time for read command after convert command in ms\r\n"); - pc.printf(" ms, Delay time in ms (int) \r\n"); - pc.printf(" 5ms through 10000ms allowed \r\n"); - pc.printf("\r\n"); - - pc.printf("e n Terminal command echo on/off\r\n"); - pc.printf(" n, Echo ON/OFF flag (int)\n\r"); - pc.printf(" 0 -> echo off\r\n"); - pc.printf(" 1 -> echo on\r\n"); - pc.printf("\r\n"); - - pc.printf("f n I2C Clock Frequency set\r\n"); - pc.printf(" n, Frequency Index (int)\n\r"); - pc.printf(" 0 -> 100kHz\r\n"); - pc.printf(" 1 -> 400kHz on\r\n"); - pc.printf("\r\n"); - - pc.printf("h,? Prints Command Help\r\n"); - pc.printf("\r\n"); - - pc.printf("l [ms] Start / stop interval logging output to terminal\r\n"); - pc.printf(" ms, if included sets logging interval in ms before starting (int)\r\n"); - pc.printf(" ms = 0 turns off loging\r\n"); - pc.printf("\r\n"); - - pc.printf("p ms Set delay time for read command after convert command in ms\r\n"); - pc.printf(" ms, Convert period in ms (int) \r\n"); - pc.printf(" 5ms through 10000ms allowed \r\n"); - pc.printf("\r\n"); - - - pc.printf("r d add [end_add] Read device regester\r\n"); - pc.printf(" d, device index (int)\r\n"); - pc.printf(" add, address to read (hex)\r\n"); - pc.printf(" end_add, if included read all registers from add to end_add (hex)\r\n"); - pc.printf("\r\n"); - pc.printf("s Search I2C bus for all attached devices\r\n"); - pc.printf("\r\n"); - pc.printf("t d [end_d] Send convert temperature command to device and read temperature\r\n"); - pc.printf(" d, device index (int)\r\n"); - pc.printf(" end_d, if included sends skip ROM convert command (int)\r\n"); - pc.printf(" and reads back from device d through end_d\r\n"); - pc.printf("\r\n"); - pc.printf("w d add data Write to device register\r\n"); - pc.printf(" d, device index (int)\r\n"); - pc.printf(" add, write address (hex)\r\n"); - pc.printf(" data, data to write (hex)\r\n"); - pc.printf("\r\n"); - pc.printf("v mV Set VDD of device\r\n"); - pc.printf(" mV, VDD in mV (int)\r\n"); - pc.printf(" 1800mV to 3600mV allowed in 100mV steps"); - pc.printf("\r\n"); - - break; - - - case 'l': - case 'L': // Toggle logging - if((n==2)&&(arg0 == 0)){ //force stop - if(echo)pc.printf("<stop logging [by 0]>\r\n"); - log_flag = false; - timer_2.detach(); - sample_flag = false; - }else{ - - if(n == 2){ - period = arg0; - if(period < 5)period = 5; - if(period > 60000)period = 60000; - } - if(log_flag == false){ //start logging - if(echo)pc.printf("<start logging, period = %dms>\r\n",period); - sample_count = 0; - if(period > 1000){// dont wait for first tick - sample_flag = true; - }else{ - sample_flag = false; - } - log_flag = true; - timer_2.attach_us(&set_sample_flag_callback,period*1000); //start ticker interupt. - - }else{ // n != 2 and log_flag = true - if(echo)pc.printf("<stop logging>\r\n"); - log_flag = false; - timer_2.detach(); - sample_flag = false; - } - }// end else if((n==2)&&(arg0==0)) - break; - - case 'p': - case 'P': //Set sample period in ms - - if(n == 2){ - period = arg0; - if(period < 5)period = 5; - if(period > 60000)period = 60000; - } - if(log_flag == true){ //update sample_flag interrupt period - timer_2.detach(); // stop current timer - if(echo)pc.printf("<period = %dmS>\r\n",period); - timer_2.attach_us(&set_sample_flag_callback,period*1000); // restart with new period - }else{ - if(echo)pc.printf("<set sampling period, %dmS>\r\n",period); - } - break; - - - case 'r': - case 'R': //read register "r device radd.start radd.end" - if(n==3){ //read single register from selected device - OT07_read_register(OT07[arg0].I2C_address,arg1,data,1); - if(echo){ - pc.printf("device[%02d] add[%02X] data[%02X] \r\n",arg0,arg1,data[0]); - }else{ - pc.printf("%02d, %02X, %02X\r\n",arg0,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. - OT07_read_register(OT07[arg0].I2C_address,arg1,data,num_bytes); - for(i=0;i<num_bytes;i++){ - if(echo){ - pc.printf("\r\ndevice[%02d] add[%02X] data[%02X]",arg0,arg1+i,data[i]); - }else{ - pc.printf("%02d, %02X, %02X\r\n",arg0,arg1+i,data[i]); - } - } - if(echo)pc.printf("\r\n"); - } - break; - - case 's': - case 'S': - // ****************** search for I2C devices on bus ***************** - - device_count = search_I2C_bus(OT07); - if(echo){ - pc.printf("<search I2C bus>\r\n"); - pc.printf("<count>\r\n"); - pc.printf("<device, I2C Add, CRC, ROM ID, Family>\r\n"); - } - pc.printf("%2d\r\n",device_count); - print_device_list(OT07,device_count); - - break; - - case 'T': - case 't': - if(n == 2){//get temperatures from selected device - - convert_temperature(OT07[arg0].I2C_address); //send OW convert selected device - wait(0.02); //wait 20 ms for convert temperature to complete - T[arg0] = get_temperature(OT07[arg0].I2C_address); - if(echo)pc.printf("<temperature>\r\n"); - pc.printf("%02d, %7.3f\r\n",arg0, T[arg0]); - } - - 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); - - for(j=arg0;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); - } - - if(echo)pc.printf("<device, temperature>\r\n"); - for(j=arg0;j<=arg1;j++){ - pc.printf("%02d, %7.3f\r\n",j,T[j]); - } - } - - break; - case 'w': - case 'W': //write register - //data[0] = arg2; - OT07_write_register(OT07[arg0].I2C_address,arg1, arg2); - if(echo)pc.printf("write -- add[%02X] data[%02X]\r\n",arg1,arg2); - - break; - - - case 'v': - case 'V': //Set MAX32630FTHR I/O Voltage 0 -> 1.8V, 1 -> 3.3V - - if(n == 2){ //set LDO3 - L3out = arg0; - if(L3out < 1600)L3out = 1600; // check for valid mV range - if(L3out > 3600)L3out = 3600; - L3out = ((L3out+50)/100)*100; // round to 100mV steps - pegasus.max14690.ldo3SetVoltage(L3out); // set ldo3 to L3out - if(echo)pc.printf("<Set ldo3 (VDD) to %4dmV, ",L3out); - if(DEBUG)db.printf("<ldo3 to %4dmV>\r\n",L3out); - - if(L3out >= 1900){ //set VIO to 3300mV - // set VIO to 3v3 - pegasus.vddioh(P3_4, pegasus.VIO_3V3); // SDA use LDO2 - pegasus.vddioh(P3_5, pegasus.VIO_3V3); // SCL use LDO2 - pegasus.vddioh(P5_3, pegasus.VIO_3V3); // GPIO0 use LDO2 - pegasus.vddioh(P5_6, pegasus.VIO_3V3); // GPIO1 use LDO2 - if(echo)pc.printf(" Set VIO=3V3>\r\n"); - }else{//set VIO to 1V8 - pegasus.vddioh(P3_4, pegasus.VIO_1V8); // SDA use 1V8 buck - pegasus.vddioh(P3_5, pegasus.VIO_1V8); // SCL use 1V8 buck - pegasus.vddioh(P5_3, pegasus.VIO_1V8); // GPIO0 use 1V8 buck - pegasus.vddioh(P5_6, pegasus.VIO_1V8); // GPIO1 use 1V8 buck - if(echo)pc.printf(" Set VIO=1V8>\r\n"); - } - }else{ - if(echo)pc.printf("<ldo3 (VDD) %4dmV>\r\n",L3out); - } - break; - - }//end switch(c) - }//if(n>0) - }//end if(CR) - if(rx_buff[rx_index] == BS){ //backspace received, back up buffer pointer - if(rx_index>0)rx_index--; //remove last char from buffer if not at start. - }else rx_index++; - }//end while(pc.redable()) - - }//end while(1) Main Loop -}// end_Main \ No newline at end of file