program for temperature reading with mlx90615

Dependencies:   crc8

Committer:
glsfacom
Date:
Wed Jul 15 18:20:00 2020 +0000
Revision:
0:db513e91a2c9
Child:
2:c4552b8c47c0
export to mbed studio;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
glsfacom 0:db513e91a2c9 1 #include "Mlx90615.h"
glsfacom 0:db513e91a2c9 2 #include "smbus.h"
glsfacom 0:db513e91a2c9 3
glsfacom 0:db513e91a2c9 4 I2C i2c(p28, p27);//I2C_SDA, I2C_SCL
glsfacom 0:db513e91a2c9 5 void Mlx90615::wake()
glsfacom 0:db513e91a2c9 6 {
glsfacom 0:db513e91a2c9 7 /*SCL = 0;
glsfacom 0:db513e91a2c9 8 wait_ms(50);
glsfacom 0:db513e91a2c9 9 SCL = 1;*/
glsfacom 0:db513e91a2c9 10 MLX_VCC = 1;
glsfacom 0:db513e91a2c9 11 wait_us(301*1000);//Waiting for valid data as datasheet says
glsfacom 0:db513e91a2c9 12 }
glsfacom 0:db513e91a2c9 13
glsfacom 0:db513e91a2c9 14 unsigned int Mlx90615::sleep(){
glsfacom 0:db513e91a2c9 15 MLX_VCC = 0;
glsfacom 0:db513e91a2c9 16 return 1;
glsfacom 0:db513e91a2c9 17 }
glsfacom 0:db513e91a2c9 18
glsfacom 0:db513e91a2c9 19 unsigned int Mlx90615::read(unsigned char memory, unsigned char address){
glsfacom 0:db513e91a2c9 20 unsigned char crc, addr, status = 0;
glsfacom 0:db513e91a2c9 21 unsigned int read = 0x0000;
glsfacom 0:db513e91a2c9 22
glsfacom 0:db513e91a2c9 23 addr = memory + address;
glsfacom 0:db513e91a2c9 24
glsfacom 0:db513e91a2c9 25 i2c.start();
glsfacom 0:db513e91a2c9 26
glsfacom 0:db513e91a2c9 27 smbus_send_address(0x5B, WRITE);
glsfacom 0:db513e91a2c9 28 if(!i2c.ACK) return 0;
glsfacom 0:db513e91a2c9 29
glsfacom 0:db513e91a2c9 30 smbus_send_byte(addr);
glsfacom 0:db513e91a2c9 31 if(!i2c.ACK) return 0;
glsfacom 0:db513e91a2c9 32
glsfacom 0:db513e91a2c9 33 i2c.start();
glsfacom 0:db513e91a2c9 34
glsfacom 0:db513e91a2c9 35 smbus_send_address(0x5B, READ);
glsfacom 0:db513e91a2c9 36 if(!i2c.ACK) return 0;
glsfacom 0:db513e91a2c9 37
glsfacom 0:db513e91a2c9 38 read = smbus_read_uint(&status, LITTLE_ENDIAN);
glsfacom 0:db513e91a2c9 39
glsfacom 0:db513e91a2c9 40 crc = smbus_read_byte(&status);
glsfacom 0:db513e91a2c9 41
glsfacom 0:db513e91a2c9 42 smbus_stop();
glsfacom 0:db513e91a2c9 43
glsfacom 0:db513e91a2c9 44 return read;
glsfacom 0:db513e91a2c9 45 }
glsfacom 0:db513e91a2c9 46
glsfacom 0:db513e91a2c9 47 unsigned int Mlx90615::read_temperature(){
glsfacom 0:db513e91a2c9 48 unsigned int temp = read(RAM, 0x07);
glsfacom 0:db513e91a2c9 49 while(temp == 0)
glsfacom 0:db513e91a2c9 50 {
glsfacom 0:db513e91a2c9 51 wait_us(5000);
glsfacom 0:db513e91a2c9 52 temp = read(RAM, 0x07);
glsfacom 0:db513e91a2c9 53 }
glsfacom 0:db513e91a2c9 54 return temp;
glsfacom 0:db513e91a2c9 55 }
glsfacom 0:db513e91a2c9 56
glsfacom 0:db513e91a2c9 57 /*float convert_to_celsius(unsigned int temperature){
glsfacom 0:db513e91a2c9 58 return temperature * 0.02 - 273.15;
glsfacom 0:db513e91a2c9 59 }*/
glsfacom 0:db513e91a2c9 60 typedef unsigned char uint8_t;
glsfacom 0:db513e91a2c9 61
glsfacom 0:db513e91a2c9 62 uint8_t gencrc(uint8_t *data, size_t len)
glsfacom 0:db513e91a2c9 63 {
glsfacom 0:db513e91a2c9 64 uint8_t crc = 0xff;
glsfacom 0:db513e91a2c9 65 size_t i, j;
glsfacom 0:db513e91a2c9 66 for (i = 0; i < len; i++) {
glsfacom 0:db513e91a2c9 67 crc ^= data[i];
glsfacom 0:db513e91a2c9 68 for (j = 0; j < 8; j++) {
glsfacom 0:db513e91a2c9 69 if ((crc & 0x80) != 0)
glsfacom 0:db513e91a2c9 70 crc = (uint8_t)((crc << 1) ^ 0x31);
glsfacom 0:db513e91a2c9 71 else
glsfacom 0:db513e91a2c9 72 crc <<= 1;
glsfacom 0:db513e91a2c9 73 }
glsfacom 0:db513e91a2c9 74 }
glsfacom 0:db513e91a2c9 75 return crc;
glsfacom 0:db513e91a2c9 76 }
glsfacom 0:db513e91a2c9 77
glsfacom 0:db513e91a2c9 78 void Mlx90615::write(unsigned char address, unsigned int value){
glsfacom 0:db513e91a2c9 79 unsigned char addr = EEPROM + address;
glsfacom 0:db513e91a2c9 80 unsigned char bytes[4], crc, vh, vl;
glsfacom 0:db513e91a2c9 81 vh = value >> 8;
glsfacom 0:db513e91a2c9 82 vl = value;
glsfacom 0:db513e91a2c9 83 bytes[0] = 0xB6;
glsfacom 0:db513e91a2c9 84 bytes[1] = addr;
glsfacom 0:db513e91a2c9 85 bytes[2] = vl;
glsfacom 0:db513e91a2c9 86 bytes[3] = vh;
glsfacom 0:db513e91a2c9 87 crc = gencrc(bytes, 4);
glsfacom 0:db513e91a2c9 88
glsfacom 0:db513e91a2c9 89 i2c.start();
glsfacom 0:db513e91a2c9 90
glsfacom 0:db513e91a2c9 91 smbus_send_address(0x5B, WRITE);
glsfacom 0:db513e91a2c9 92
glsfacom 0:db513e91a2c9 93 smbus_send_byte(addr);
glsfacom 0:db513e91a2c9 94
glsfacom 0:db513e91a2c9 95 smbus_send_byte(vl);
glsfacom 0:db513e91a2c9 96
glsfacom 0:db513e91a2c9 97 smbus_send_byte(vh);
glsfacom 0:db513e91a2c9 98
glsfacom 0:db513e91a2c9 99 smbus_send_byte(crc);
glsfacom 0:db513e91a2c9 100
glsfacom 0:db513e91a2c9 101 smbus_stop();
glsfacom 0:db513e91a2c9 102 }
glsfacom 0:db513e91a2c9 103
glsfacom 0:db513e91a2c9 104 void Mlx90615::erase_eeprom_address(unsigned char address){
glsfacom 0:db513e91a2c9 105 write(address, 0x0000);
glsfacom 0:db513e91a2c9 106 }
glsfacom 0:db513e91a2c9 107
glsfacom 0:db513e91a2c9 108 void Mlx90615::set_emissivity(float e){
glsfacom 0:db513e91a2c9 109 unsigned int emissivity;
glsfacom 0:db513e91a2c9 110 emissivity = 16384 * e;
glsfacom 0:db513e91a2c9 111 erase_eeprom_address(0x03);
glsfacom 0:db513e91a2c9 112 wait_us(5*1000);
glsfacom 0:db513e91a2c9 113 write(0x03, emissivity);
glsfacom 0:db513e91a2c9 114 }