Jump to content

Reading / writing on I2C protocol

Recommended Posts



I am trying to Interface my temperature sensor MLX90620(16*4 IR array) with TIVA 


microcontroller(tm4c123gxl).The Serial communication used here is i2c(just the wire library) and the 


platform used is Energia.The first part of the process is to obtain the EEPROM values,which has been 


completed successfully.


Now I have to write the oscillator trimming value,obtained from a particular location in 


EEPROM(0xF7),into the register(0x93).This is the place where Iam stuck.


I have written the oscillator trimming value according to the protocol,but when I read the location to 


check whether I am on the right track, I am receiving -1.


I had read in a forum that -1 is predefined value which signifies buffer empty, which means I am not 


receiving anything and I am not able to figure out where I am going wrong. Is it the read or the write 




Please help. Thank you in advance.


I am attaching the datasheet of the sensor.



/* MLX90620 interfaced with tiva microcontroller TM4C123 with I2C */



#include <Wire.h>

TwoWire Wire1(0);

byte button ;

int8_t data_EEPROM;

int8_t d;

int8_t y;

int8_t data_osc;

int state;

int location = 0;

int8_t val_2,val_3;


void setup()







/* reading calibration data from EEPROM */

/* receiver buffer is of 32 bytes therefore transmitting the read command for 8 times */


void main_2()




Wire1.beginTransmission(80); // slave address EEPROM(0x50)

state = Wire1.endTransmission(); // read the acknowledgement

state = 5; // modify the state value




state = Wire1.endTransmission();


Wire1.requestFrom(80, 32);//(uint8_t)32); // requesting the 32 bytes from EEPROM

state = Wire1.endTransmission();


while(!Wire1.available()){}; // waiting period till slave device send some data


while(Wire1.available()) // reading the data available on SDA pin


data_EEPROM = Wire1.read();


{ // reading oscillator trimming value from location 0xF7(247 in dec)

data_osc = data_EEPROM;

Serial.print("location value is ");



Serial.println(data_osc); // Oscillator trimming value is 87





state = Wire1.endTransmission(true); // sending the stop condition after every 32bytes read











void readoscillator_trimming(int8_t val)


val_2 = val - 170;



Wire1.beginTransmission(96); // slave address of ram(0x60)

y = Wire1.endTransmission();



Wire1.write(4); // command to write osc trimming value

y = Wire1.endTransmission();


Wire1.write(val_2); // LSB check byte (refer datasheet)

y = Wire1.endTransmission();



Wire1.write(val); // LSB byte

y = Wire1.endTransmission();


val_3 = 0 - 170;


Wire1.write(val_3); // MSB check byte

y = Wire1.endTransmission();



Wire1.write(0); // MSB data

y = Wire1.endTransmission(true); // stop bit



//Reading the oscillator trimming value register


Wire1.beginTransmission(96); // slave address

y = Wire1.endTransmission();


Wire1.write(2); // command for reading RAM data

y = Wire1.endTransmission();


Wire1.write(147); // address of OSC trimming register

y = Wire1.endTransmission();


Wire1.write(0); // address step

y = Wire1.endTransmission();


Wire1.write(1); // no. of bytes to be read

y = Wire1.endTransmission();


Wire1.requestFrom(96,2); // requesting 2 bytes (LSB and MSB)

y = Wire1.endTransmission();


while(!Wire1.available()){}; // additional delay for slave to respond


while(Wire1.available()) // reading the data



d = Wire1.read(); //reading the data

while(d == -1)


d = Wire1.read();







y = Wire1.endTransmission(true);





void loop()


// put your main code here, to run repeatedly:



Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...