This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AWR6843AOPEVM:通过 i2c 读取温度

Guru**** 649970 points
Other Parts Discussed in Thread: TMP112, AWR6843AOPEVM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1171718/awr6843aopevm-read-temp-via-i2c

器件型号:AWR6843AOPEVM
主题中讨论的其他器件:TMP112

,您好、我想 通过 i2c 读取 TMP112A 的 xwr6843aopEVM 温度。 rend 函数 如下所示:

float TMP_ReadTemp(I2C_Handle i2cHandle, uint8_t i2cSlaveAddress, uint8_t i2cSlaveRegAddress)
{
    uint8_t         txData[2];
    bool            retVal = false;
    uint8_t         rxData[2];
    I2C_Transaction i2cTransaction;
    int16_t         digitalTemp = 2;
    int32_t         errCode;

    /* Scan for the slave address */
    System_printf ("22222222222 \n");
    txData[0] = i2cSlaveRegAddress;
    System_printf ("333333333 \n");
    i2cTransaction.slaveAddress = i2cSlaveAddress;
    System_printf ("44444444444 \n");
    i2cTransaction.writeBuf = txData;
    System_printf ("55555555555 \n");
    i2cTransaction.writeCount = 1;
    System_printf ("666666666666 \n");
    i2cTransaction.readBuf = rxData;
    System_printf ("777777777777 \n");
    i2cTransaction.readCount = 0;
    System_printf ("8888888888888 \n");

    /* Writing to slave address */
    retVal = I2C_transfer(i2cHandle, &i2cTransaction);
    if (retVal == false)
    {
        System_printf ("I2C_transfer Failed \n");
    }
    else
    {
        /* Read from slave */
        System_printf ("99999999999 \n");
        i2cTransaction.slaveAddress = i2cSlaveAddress + 1;
        i2cTransaction.writeBuf = txData;
        i2cTransaction.writeCount = 0;
        i2cTransaction.readBuf = rxData;
        i2cTransaction.readCount = 2;

        retVal = I2C_transfer(i2cHandle, &i2cTransaction);
        if (retVal == false)
        {
            errCode = -1;
        }
        else
        {
            digitalTemp = (rxData[0]<<4) | (rxData[1]>>4);
            if(digitalTemp > 0x7FF)
            {
                digitalTemp |= 0xF000;
            }
        }
    }
    return digitalTemp * 0.0625;
}

在使用 API I2C_Handle、I2C_transfer ()之前...我已经完成了 I2C_Init()、I2C_Params_init (&i2cParams)和   I2C_open (0、&i2cParams)。 调试时的结果如下:

 

当代码运行到 I2C_transfer()时,它似乎会停止。 我的 I2C 代码中是否有任何问题?

谢谢!

LeiGong

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,LeiGong,

    我有几个问题可以让我更好地了解您的情况:

    1. 您使用的是哪个版本的毫米波 SDK?
    2. 根据您的屏幕截图、您似乎正在运行高架车辆乘员检测演示、这是正确的吗?
      1. 如果是、这是否是您所做的唯一修改?
      2. 如果没有、您正在运行哪个演示固件?  
    3. 您是否在以下位置参考了 SDK 中提供的 I2C 测试代码?
      /packages/ti/drivers/i2c/test

    此致、

    Josh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Josh Dye、您好!
    感谢您的回复!
    我的答案如下:
    Q1: 毫米波 SDK 版本: MMWAVE_SDK_03_05_00_04
    Q2:是的、它基于高架车辆乘员检测演示、但我更改了许多位置、包括算法等。 如果我不添加通过 I2C 代码读取的 TEPM、它会很好地工作。
    Q3:是的、我的代码基于  /packages/ti/drivers/i2c/test.  但似乎仍然存在问题。
    我还有一些问题:
    如果  I2C 从设备不止一个、当我使用 API I2C_open 时、如何确定索引(索引到 I2C_CONFIG 表中的 I2C 的逻辑外设编号)?
    在中  /packages/ti/drivers/i2c/test.  索引为0 (见下图)。 但是、如果有多个器件连接 I2C 总线、我不知道该怎么做。 我是否需要使用  I2C_open (0、&i2cParams)、I2C_open (1、&i2cParams)、I2C_open (2、&i2cParams)...?
    2.我不清楚 结构  i2cTransaction 中  i2cTransaction.slaveAddress 是实数 SlaveAddress (如0x90)或索引(逻辑外设编号、如0、1、...)。 我看到这两个,我不清楚我应该选择哪一个。
    在中  /packages/ti/drivers/i2c/test/master.c
    在以下测试中、 SlaveAddress 似乎是真实地址。
    main_thread.c
    哪一个是正确的、或者我对它们的理解不正确?
    谢谢!
    Lei Gong
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    各位好,李孔

    很抱歉回复太晚了。 请允许我在1-2天内就这些问题与您联系、并尝试重复您的问题。  

    此致、

    Josh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    永远不介意,感恩节快乐!

    期待您的回复。 在主题 :https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1173275/awr6843aopevm-read-temperature-via-i2c/4416261?tisearch=e2e-sitesearch&keymatch=read%2520temp#4416261 中、我重复了我的问题、或许可以帮助您清楚地认识到我的问题。

    再次感谢您的真诚回复!

    Lei Gong

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    各位好,李孔

    [引用 userid="542914" URL"~/support/sensors-group/sensors/f/sensors-forum/1171718/awr6843aopevm-read-temp-via-i2c/4411050 #4411050"]我是否需要使用  I2C_open (0、&i2cParams)、I2C_open (1、&i2cParams)、I2C_open (2、&i2cParams)...?

    您应该只需要使用 I2C_open (0、&i2cParams)。  

    [引用 userid="542914" URL"~/support/sensors-group/sensors/f/sensors-forum/1171718/awr6843aopevm-read-temp-via-i2c/4411050 #4411050"]我不清楚 结构 中 i2cTransaction  的 i2cTransaction.slaveAddress 是实数 SlaveAddress (例如0x90)或索引(逻辑外设编号、例如0、1、...)。

    对于 i2cTransaction.slaveAddress、应使用实际地址。 TMP112的 I2C 地址可在 AWR6843AOPEVM 原理图中找到。

    此致、

    Josh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Josh、您好!

    您的回复很清晰。 我已经根据您的指令修改了代码。 我已经根据 https://www.ti.com/document-viewer/lit/html/SWRU546E/GUID-00256656-BC54-48EF-B44F-3054031A4C73#TITLE-SWRU546ID-B1E452BD-DA85-44F4-AD00-B689124D4D94仔细检查了从器件地址和从器件寄存器地址。  

    我尝试过的这两个从器件地址。  但它仍然 无法正常工作。 修改后的代码-- READ_TEMP_FUNCTION 如下所示,是否可以帮助我检查它?

    /* Read Temp function*/
    float TMP_ReadTemp(I2C_Handle i2cHandle, uint8_t i2cSlaveAddress, uint8_t i2cSlaveRegAddress)
    {
        uint8_t         txData[2];
        bool            retVal = true;
        uint8_t         rxData[2];
        I2C_Transaction i2cTransaction;
        int16_t         digitalTemp = 2;
        int32_t         errCode;
    
        /* Reset the transmit and receive buffer */
        memset(&rxData, 0, sizeof (rxData));
    
        /* Scan for the slave address */
        txData[0] = i2cSlaveRegAddress;
        i2cTransaction.slaveAddress = i2cSlaveAddress;
        i2cTransaction.writeBuf = txData;
        i2cTransaction.writeCount = 1;
        i2cTransaction.readBuf = rxData;
        i2cTransaction.readCount = 0;
    
        System_printf ("2222222222 \n");
        /* Writing to slave address */
        retVal = I2C_transfer(i2cHandle, &i2cTransaction);
        if (retVal == false)
        {
            System_printf ("I2C_transfer Failed \n");
        }
        else
        {
            /* Read from slave */
            System_printf ("3333333333 \n");
            i2cTransaction.slaveAddress = i2cSlaveAddress + 1;
            i2cTransaction.writeBuf = txData;
            i2cTransaction.writeCount = 0;
            i2cTransaction.readBuf = rxData;
            i2cTransaction.readCount = 2;
    
            retVal = I2C_transfer(i2cHandle, &i2cTransaction);
    
            System_printf ("44444444444444 \n");
            if (retVal == false)
            {
                errCode = -1;
            }
            else
            {
                digitalTemp = (rxData[0]<<4) | (rxData[1]>>4);
                if(digitalTemp > 0x7FF)
                {
                    digitalTemp |= 0xF000;
                }
            }
        }
        return digitalTemp * 0.0625;
    }

    调用 READ_Temp_function 的 READ_Task 如下所示:

    我运行代码时的结果为:

    I2C_transfer()总是失败的,我不知道为什么。

    期待您的回复。

    祝你一切顺利、

    Lei Gong

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    各位好,李孔

    请注意、我们不在这些论坛的范围内、可以代表您调试定制代码。 如果您有关于如何使用某些驱动程序 API 的具体问题、我可以回答这些问题。  

    我建议您确保以与 SDK 中的测试代码一致的方式使用 I2C 驱动程序。

    此致、

    Josh