#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
#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
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);
}
}
}
- //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.
}
// 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
}
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)
}
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
}
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