We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hello, I'd like to ask a little bit help. I downloaded the mcb517_i2c aplication note. I try to read the LM75 tempereture sensor with the bit_bang i2c routines. The problem is... There is a 16 bit temperature register and I can read only the high byte . I use the following program . . unsigned char data_in; i2c_start(); i2c_write(0x91); data_in=i2c_read(); i2c_stop(); I try to use the unsigned int instead unsigned char and modified the i2c_read routin to read 16 bit but no succes. Any advice? Cheer George
the IIC is a byte system, you will need data_in twice Erik
Hello, Of course I've tried it. The second reading was permanently 255 instead of 0 or 128. Thanks George
I looked at the documentation for the device. You have to implement a read I2C with ack function, followed by a read I2C without ack function, then a Stop function to read this part correctly. If that does not work, can you post the I2C functions code (i.e. what makes up the I2C_read, stop, etc) so we can take a look. Please review the Tips for posting Messages before posting code.
Hi George! My LM75 library code looks like this:
#include "i2c.h" #define uchar unsigned char #define LM75_SLA 0x49 #define LM75_TEMPADR 0x00 #define LM75_CONFADR 0x01 #define LM75_THYSTADR 0x02 #define LM75_TOSADR 0x03 uchar get_temp( int *halfdegree ) { uchar sendbyte; uchar rbuf[2]; sendbyte = LM75_TEMPADR; if (i2c_xceive( LM75_SLA, &sendbyte, 1, rbuf, 2 )){ *halfdegree = -1; return -1; } else { *halfdegree = ((((int)rbuf[0]) << 8) + rbuf[1]) / 128; return 0; } }
/*------------------------------------------------------------------------- Transmit data then receive data on I2C-Bus: sla : Slave Adress xbuf : data buffer (transmit ) xmit_count: Number of bytes. Has to be <= 16!!! rbuf : data buffer ( receive ) recv_count: Number of bytes. Has to be <= 16!!! returns -1 if error -------------------------------------------------------------------------*/ extern int i2c_xceive( uchar sla, uchar xbuf[], uchar xmit_count, uchar rbuf[], uchar recv_count );
Hello, Thanks for the help. Yes,you're right. The problem was the missing ack. Because the master didn't send the ack beetween two readings the slave always sent the first byte instead of second. Thank again George
Thanks for eweryone's help. As some people point me the problem is the ack and the're right. Thanks again George
You can also test the LM75 with my I2C-Simulation DLL. You'll find it in http://www.c51.de part µVision2 DLLs