FTDI Community

General Category => Discussion - Software => Topic started by: nevs on November 13, 2019, 07:20:07 AM

Title: FT2232H and Digital Temperature Sensors TMP112
Post by: nevs on November 13, 2019, 07:20:07 AM
Hi,

I use TMP112A Digital Temperature Sensors from Texas Instrument (http://www.ti.com/product/TMP112 (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, &reg, &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] << 8) | 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


Title: Re: FT2232H and Digital Temperature Sensors TMP112
Post by: nevs on November 18, 2019, 09:58:28 AM
OK, when I use libMPSSE__0_6_Beta.zip everything works... ;D