From 007ea22367d4848af10e5592a81ee8af9edd76ff Mon Sep 17 00:00:00 2001 From: Adrian Weber Date: Mon, 15 Feb 2021 16:09:08 +0100 Subject: [PATCH] add all functionalities to MLX90393; not all are tested. Clean up of main.c --- .../CbmRich_sensoring/DS28E17/DS28E17.c | 2 - .../CbmRich_sensoring/MLX90393/MLX90393.c | 76 ++++++++++++++++- .../CbmRich_sensoring/MLX90393/MLX90393.h | 10 +++ atmega32u4/CbmRich_sensoring/main.c | 84 ++++++++----------- 4 files changed, 120 insertions(+), 52 deletions(-) diff --git a/atmega32u4/CbmRich_sensoring/DS28E17/DS28E17.c b/atmega32u4/CbmRich_sensoring/DS28E17/DS28E17.c index f07f280..a6ecc5c 100644 --- a/atmega32u4/CbmRich_sensoring/DS28E17/DS28E17.c +++ b/atmega32u4/CbmRich_sensoring/DS28E17/DS28E17.c @@ -3,7 +3,6 @@ int ds28e17_Write_with_Stop(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t wleng, uint8_t *wdata, uint8_t *status) { int wire_status; - status[0] = 0xd; const uint8_t CRC16bufSize = 3 + wleng; uint8_t CRC_data_buf[CRC16bufSize]; wire_status = owu_reset(wire); @@ -69,7 +68,6 @@ int ds28e17_Write_with_Stop(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Ad int ds28e17_Write_Read_with_Stop(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t wleng, uint8_t *wdata, uint8_t rleng, uint8_t *rdata, uint8_t *status) { int wire_status; - status[0] = 0xd; const uint8_t crc_buf_size = 4+wleng; uint8_t CRC_data_buf[crc_buf_size]; wire_status = owu_reset(wire); diff --git a/atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.c b/atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.c index 737be1b..f8c0287 100644 --- a/atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.c +++ b/atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.c @@ -1,11 +1,85 @@ #include "MLX90393.h" +#include +/** + * start a single measurement of all 4 measurements (T;X,Y,Z) of MLX90393 + **/ int MLX90393_convert_TXYZ_SM(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status){ - uint8_t wdata_SM[1] = {0x3F}; + uint8_t wdata_SM[1] = {0x3F}; // 3: SM; F: ZYXT return ds28e17_Write_Read_with_Stop(wire,OW_addr,I2C_Addr,0x1,wdata_SM,rleng,rdata,status); } + +/** + * Read all 4 values from MLX90393 + **/ int MLX90393_read_TXYZ(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status){ uint8_t wdata_SM[1] = {0x4F}; return ds28e17_Write_Read_with_Stop(wire,OW_addr,I2C_Addr,0x1,wdata_SM,rleng,rdata,status); +} + +/** + * Read register + **/ +int MLX90393_read_register(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t reg, uint16_t *data, uint8_t *status){ + uint8_t wdata_SM[2] = {0x50,((reg<<2)&0xFF)}; + uint8_t rdata[3] = {0,0,0}; + uint8_t ow_stat = ds28e17_Write_Read_with_Stop(wire,OW_addr,I2C_Addr,0x2,wdata_SM,0x3,rdata,status); + + *data = (rdata[1] & rdata[2]); + + return ow_stat; +} + + +/** + * Write to register + **/ +int MLX90393_write_register(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint16_t wdata ,uint8_t reg, uint8_t *rdata, uint8_t *status){ + uint8_t wdata_SM[4] = {0x60, (wdata>>8)&0xFF, (wdata)&0xFF, ((reg<<2)&0xFF)}; + uint8_t ow_stat = ds28e17_Write_Read_with_Stop(wire,OW_addr,I2C_Addr,0x4,wdata_SM,0x1,rdata,status); + + return ow_stat; +} + +/** + * Exit Mode + **/ +int MLX90393_exit_mode(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status){ + uint8_t wdata_SM[1] = {0x80}; + return ds28e17_Write_Read_with_Stop(wire,OW_addr,I2C_Addr,0x1,wdata_SM,rleng,rdata,status); +} + +/** + * Memory Recall operation + **/ +int MLX90393_memory_recall(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status){ + uint8_t wdata_SM[1] = {0xD0}; + return ds28e17_Write_Read_with_Stop(wire,OW_addr,I2C_Addr,0x1,wdata_SM,rleng,rdata,status); +} + + +/** + * Memory Store operation + **/ +int MLX90393_memory_store(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status){ + uint8_t wdata_SM[1] = {0xE0}; + uint8_t ow_stat = ds28e17_Write_Read_with_Stop(wire,OW_addr,I2C_Addr,0x1,wdata_SM,rleng,rdata,status); + + _delay_ms(16); + + return ow_stat; +} + +/** + * Hot reset of the MLX90393 + **/ +int MLX90393_reset(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t *status){ + // first execute an exit mode operation as told in datasheet + uint8_t r_data[1] = {0x00}; + uint8_t ex_stat[1] = {0x00}; + MLX90393_exit_mode(wire,OW_addr,I2C_Addr,0x1,r_data,ex_stat); + + uint8_t wdata_SM[1] = {0xF0}; + return ds28e17_Write_with_Stop(wire,OW_addr,I2C_Addr,0x1,wdata_SM,status); } \ No newline at end of file diff --git a/atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.h b/atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.h index 6a43b0d..902909b 100644 --- a/atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.h +++ b/atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.h @@ -13,6 +13,16 @@ int MLX90393_convert_TXYZ_SM(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_A int MLX90393_read_TXYZ(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status); +int MLX90393_read_register(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t reg, uint16_t *data, uint8_t *status); + +int MLX90393_exit_mode(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status); + +int MLX90393_memory_recall(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status); + +int MLX90393_memory_store(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t rleng, uint8_t *rdata, uint8_t *status); + +int MLX90393_reset(owu_struct_t *wire, uint8_t *OW_addr, uint8_t I2C_Addr, uint8_t *status); + #if defined(__cplusplus) } #endif diff --git a/atmega32u4/CbmRich_sensoring/main.c b/atmega32u4/CbmRich_sensoring/main.c index 74942ed..9308089 100644 --- a/atmega32u4/CbmRich_sensoring/main.c +++ b/atmega32u4/CbmRich_sensoring/main.c @@ -21,6 +21,7 @@ #define FIRMWARE_VERSION 0x001 //#define DEBUG_USB_OUT +//#define DEBUG_DS28E17_STATUS // BEGIN define 1-wire parameters #define MAX_OW_DEV_COUNT_PER_PIN 10 // DS18B20 + MLX90393 @@ -253,6 +254,7 @@ int search_devices(owu_struct_t ow_Q[]){ send_Address(ow_line, dev_count[ow_line]-1); } else if (dev_addr[ow_line][dev_count[ow_line]][0] == 0x19 ){ //DS28E17 { + // Go through all possible MLX90393 devices uint8_t stat[2] = {0,0}; uint8_t answer = 0; for (uint8_t i_i2c = 0; i_i2c < 16 ;i_i2c++){ MLX90393_convert_TXYZ_SM(&ow_Q[ow_line], dev_addr[ow_line][dev_count[ow_line]],MLX90393_I2C_Addr[i_i2c],0x1,&answer,stat); @@ -273,15 +275,6 @@ int search_devices(owu_struct_t ow_Q[]){ } } } - //uint8_t lbuf[20]; - //uint8_t stat[2] = {0xe,0xa}; - //uint wdata[1] = 0x80; - //int nbytes2 = sprintf((char*) lbuf, "Reset MLX: %d\n", ds28e17_Write_with_Stop(&ow_Q[ow_line], dev_addr[ow_line][dev_count[ow_line]-1],0x0C,1,wdata,stat)); - //usb_serial_write(lbuf,nbytes2); - //nbytes2 = sprintf((char*) lbuf, "DS28E17, status: %02x %02x \n", stat[0], stat[1]); - //usb_serial_write(lbuf,nbytes2); - - } else { //Error: Action to be defined. } @@ -325,19 +318,10 @@ int init_OW_measurements(owu_struct_t ow_Q[]){ // start measurement on device if (dev_addr[ow_line][dev_nbr][0] == 0x28) { // Device is DS18B20 ds_convert_device(&ow_Q[ow_line], dev_addr[ow_line][dev_nbr]); - - } else if (dev_addr[ow_line][dev_nbr][0] == 0x19) { // Device is DS28E17 - uint8_t stat[2] = {0,0}; - uint8_t answer = 0; + uint8_t answer = 0; MLX90393_convert_TXYZ_SM(&ow_Q[ow_line], dev_addr[ow_line][dev_nbr],dev_addr[ow_line][dev_nbr][8],0x1,&answer,stat); - //uint8_t lbuf[20]; - //int nbytes = sprintf((char*) lbuf, "INIT SM on MLX: %d\n", ds28e17_SM(&ow_Q[ow_line], dev_addr[ow_line][dev_nbr],0x0C,stat, &answer)); - //usb_serial_write(lbuf,nbytes); - //nbytes = sprintf((char*) lbuf, "DS28E17, status: %02x %02x %02x\n", stat[0], stat[1], answer); - //usb_serial_write(lbuf,nbytes); - } else { // error: Action to be defined } @@ -394,35 +378,37 @@ int OW_measurements(owu_struct_t ow_Q[]){ ds_convert_device(&ow_Q[cur_meas_line], dev_addr[cur_meas_line][cur_meas_devNbr]); } else if (dev_addr[cur_meas_line][cur_meas_devNbr][0] == 0x19) { // Device is DS28E17 - - uint8_t lbuf[50]; uint8_t stat[2] = {0xe,0xa}; uint8_t value[10] = {0,0,0,0,0,0,0,0,0,0}; //uint8_t wdata[1] = {0x4F}; - int nbytes = sprintf((char*) lbuf, "DS28E17: %d\n", MLX90393_read_TXYZ(&ow_Q[cur_meas_line], - dev_addr[cur_meas_line][cur_meas_devNbr], - dev_addr[cur_meas_line][cur_meas_devNbr][8], - 0x9, - value, - stat)); + MLX90393_read_TXYZ(&ow_Q[cur_meas_line], + dev_addr[cur_meas_line][cur_meas_devNbr], + dev_addr[cur_meas_line][cur_meas_devNbr][8], + 0x9, + value, + stat); send_Values(cur_meas_line,cur_meas_devNbr,'T',(uint16_t) ((value[1] << 8) | value[2])); send_Values(cur_meas_line,cur_meas_devNbr,'X',(uint16_t) ((value[3] << 8) | value[4])); send_Values(cur_meas_line,cur_meas_devNbr,'Y',(uint16_t) ((value[5] << 8) | value[6])); send_Values(cur_meas_line,cur_meas_devNbr,'Z',(uint16_t) ((value[7] << 8) | value[8])); + #ifdef DEBUG_DS28E17_STATUS + uint8_t lbuf[50]; + uint8_t nbytes = sprintf((char*) lbuf, "DS28E17 (OW_st: %02x), stat: %02x %02x %02x %02x%02x %02x%02x %02x%02x %02x%02x\n", ow_status, + stat[0], + stat[1], + value[0], + value[1], + value[2], + value[3], + value[4], + value[5], + value[6], + value[7], + value[8]); usb_serial_write(lbuf,nbytes); - nbytes = sprintf((char*) lbuf, "DS28E17, status: %02x %02x %02x %02x%02x %02x%02x %02x%02x %02x%02x\n", stat[0], stat[1], value[0], - value[1], - value[2], - value[3], - value[4], - value[5], - value[6], - value[7], - value[8]); - usb_serial_write(lbuf,nbytes); - + #endif // Init new Single measurement (SM) @@ -465,14 +451,14 @@ void send_Address(uint8_t line , uint8_t devNbr){ } uint8_t nbytes = sprintf((char*) txbuf, "A%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",dev_addr[line][devNbr][0], - dev_int_addr[line][devNbr], - dev_addr[line][devNbr][1], - dev_addr[line][devNbr][2], - dev_addr[line][devNbr][3], - dev_addr[line][devNbr][4], - dev_addr[line][devNbr][5], - dev_addr[line][devNbr][6], - dev_addr[line][devNbr][8]); + dev_int_addr[line][devNbr], + dev_addr[line][devNbr][1], + dev_addr[line][devNbr][2], + dev_addr[line][devNbr][3], + dev_addr[line][devNbr][4], + dev_addr[line][devNbr][5], + dev_addr[line][devNbr][6], + dev_addr[line][devNbr][8]); usb_serial_write(txbuf,nbytes); // Send via UART @@ -495,9 +481,9 @@ void send_Values(uint8_t line , uint8_t devNbr, uint8_t valType, uint16_t value) } uint8_t nbytes = sprintf((char*) txbuf, "V%02x%02x%c%04x\n",dev_addr[line][devNbr][0], - dev_int_addr[line][devNbr], - (char) valType, - value); + dev_int_addr[line][devNbr], + (char) valType, + value); usb_serial_write(txbuf,nbytes); // Transmit txbuf via UART -- 2.43.0