]> jspc29.x-matter.uni-frankfurt.de Git - avr.git/commitdiff
add all functionalities to MLX90393; not all are tested. Clean up of main.c
authorAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Mon, 15 Feb 2021 15:09:08 +0000 (16:09 +0100)
committerAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Mon, 15 Feb 2021 15:09:08 +0000 (16:09 +0100)
atmega32u4/CbmRich_sensoring/DS28E17/DS28E17.c
atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.c
atmega32u4/CbmRich_sensoring/MLX90393/MLX90393.h
atmega32u4/CbmRich_sensoring/main.c

index f07f280890e972cc8f23453446caa67358d478cd..a6ecc5c215da310d04f3d7949c876428718c7ecc 100644 (file)
@@ -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);
index 737be1bcf70c50008cf1144b3ce2135af5fd9cae..f8c028728b886a7da11019dfebc3a674d3b48350 100644 (file)
@@ -1,11 +1,85 @@
 #include "MLX90393.h"
+#include <util/delay.h>
 
+/**
+ * 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
index 6a43b0de944a28086bda8244e0ce5ac6ae181541..902909b511afa70fe20f3c532bb2731c46c5195e 100644 (file)
@@ -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
index 74942ede3e088ebc22346eb5528831644cb03f72..93080891978fc66d760ade05348a66fa935ac029 100644 (file)
@@ -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