Hi,
I use TMP112A Digital Temperature Sensors from Texas Instrument (
http://www.ti.com/product/TMP112) and I want read value of Temperature Register, but I have problem. The read value should have 16 bits, so I have to read two bytes. The first byte is read correctly, the second byte returns value 0xFF.
Read Word Format:
1] Starty by Master | Device address | Ack By TMP112 | Register address | Ack By TMP112 | Stop By Master
2] Starty by Master | Device address | Ack By TMP112 | 1 Data Byte |
Ack By Master | 2 Data Byte | Ack By Master | Stop By Master
I think the problem is in Ack By Master when is reading the first and second byte. I don't know how make "Ack By Master" in the middle of reading.
My code:
int i2c_tmp_read(uint8_t addr, uint8_t reg, uint16_t * val)
{
FT_STATUS status;
long unsigned int num_to_send, num;
uint8_t buf[2] = {0, 0};
// prepare data
num_to_send = 1;
num = 0;
// write data
status = I2C_DeviceWrite(ftHandle, addr, num_to_send, ®, &num,
I2C_TRANSFER_OPTIONS_START_BIT
| I2C_TRANSFER_OPTIONS_STOP_BIT);
if (status != FT_OK)
{
return (-1);
}
// prepare data
num_to_send = 2;
num = 0;
// read data
status |= I2C_DeviceRead(ftHandle, addr, num_to_send, buf, &num,
I2C_TRANSFER_OPTIONS_START_BIT
| I2C_TRANSFER_OPTIONS_NACK_LAST_BYTE
| I2C_TRANSFER_OPTIONS_STOP_BIT);
if ((status != FT_OK) || (num != num_to_send))
{
return (-1);
}
*val = (buf[1] <<
| buf[0];
return (0);
}
Existing options:
#define I2C_TRANSFER_OPTIONS_START_BIT 0x00000001
#define I2C_TRANSFER_OPTIONS_STOP_BIT 0x00000002
#define I2C_TRANSFER_OPTIONS_BREAK_ON_NACK 0x00000004
#define I2C_TRANSFER_OPTIONS_NACK_LAST_BYTE 0x00000008
#define I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BYTES 0x00000010
#define I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BITS 0x00000020
#define I2C_TRANSFER_OPTIONS_FAST_TRANSFER 0x00000030
#define I2C_TRANSFER_OPTIONS_NO_ADDRESS 0x00000040
My question is: Is there an option that made
Ack By Master? How to solve this problem?
I thank you in advance for your help
.
Marketa