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.

[参考译文] CC3220:CC3220MODASF 中的 I2C (I2C 读取中的详细信息)接口

Guru**** 2578945 points
Other Parts Discussed in Thread: HDC1080

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/741960/cc3220-i2c-dealy-in-i2c-read-interfacing-in-cc3220modasf

器件型号:CC3220

您好!

我正在尝试将 HDC1080传感器连接到 CC3220MODASlaunchpad 并对其进行访问。

我已完成对只读寄存器的读取、例如制造商 ID 和器件 ID、但没有问题。

同样、我要重复从地址0x00读取温度传感器并获取 I2C 总线故障。


根据我的 HDC1080传感器(随附)的数据表、6.5ms 的延迟需要在写入后读取数据。 因此、我希望输入从我的从设备写入命令代码和读取数据之间的延迟。 我没有在"SDK2.3 中的 i2ctmp006示例项目"的 I2C.h 中获取指针函数调用

请帮助我解决问题、据我所知、我需要在阅读前输入延迟。 请参阅随附的数据表和以下我的代码:

TxBuffer[0]= 0x00;
i2cTransaction.slaveAddress = 0x40;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;

while (1){
if (I2C_transfer (i2c、&i2cTransaction)){
温度= rxBuffer[0];
温度=(温度<< 8)|rxBuffer[1];

float newtemperature =((float) temperature /65536)* 165)-40;


display_printf (display、0、0、"温度=%f ('C)\n"、newtemperature);

}
否则{
display_printf (display、0、0、"I2C 总线故障\n");
}

/*睡眠5秒*/
睡眠(5);
}

/*已取消初始化 I2C */
I2C_Close (i2c);
display_printf (display、0、0、"I2C closed!\n"\});

返回(0); 

请告诉我这里发生了什么:

/*!
*@简介 指向*驱动程序特定实现的函数指针
I2C_transfer ()。
//
typedef bool (* I2C_TransferFxn)(I2C_Handle handle、
I2C_Transaction *事务); 

e2e.ti.com/.../hdc1080.pdf

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HDC1080要求在 I2C 写入指针0x00 (或0x01)之后以及在 I2C 读取之前等待大于或等于 HDC1080转换时间。 如果等待的时间不够长、将收到 NACK。 HDC1080产品说明书的第11-12页对此进行了说明。 转换时间~4-7ms、具体取决于配置。

    谢谢、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的任:
    我也在问同样的问题、如何在 CC3220 SDK 项目"i2ctmp00c"中插入读取前的延迟。

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

    使用 usleep(7000)提供7ms 的延迟,并允许在该时间内暂停任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Amith、感谢您的回答。
    据我所知、I2C 从从从从器件读取数据将作为工作方式
    步骤1:开始写入
    步骤2:发送寄存器地址以读取
    步骤3:开始阅读
    步骤4:读取 MSB
    步骤5:读取 LSB
    步骤6:停止

    在本例中、我必须在步骤2后插入"usleep(7000)"。
    在 SDK 的代码中、我没有看到执行这些步骤的位置。 我想知道插入延迟的代码的位置/部分。

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

    正如 Ren 之前提到的、您需要在等待数据之前写入寄存器0x0

    步骤1:I2C 写入指针寄存器0x0
    usleep (7000)
    步骤2:从指针寄存器0x0读取 I2C
    步骤3:从指针寄存器0x1读取 I2C

    数据表中的图12显示了如何执行步骤1、图14显示了如何执行步骤2和3
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能不能说、按照 SDK 中的 I2C 示例、如何在这里执行相同的操作


    TxBuffer[0]= 0x00;
    i2cTransaction.slaveAddress = 0x40;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 2;


    while (1){
    if (I2C_transfer (i2c、&i2cTransaction)){
    温度= rxBuffer[0];
    温度=(温度<< 8)|rxBuffer[1];


    float newtemperature =((float) temperature /65536)* 165)-40;




    display_printf (display、0、0、"Temperature =%f ('C)\n"、newtemperature);



    否则{
    display_printf (display、0、0、"I2C 总线故障\n"\});



    /*睡眠5秒*/
    睡眠(5);



    /*已取消初始化 I2C */
    I2C_Close (i2c);
    display_printf (display、0、0、"I2C closed!\n"\});


    返回(0);
    请告诉我这里发生了什么:


    /*!
    *@将函数指针简要介绍到的特定于驱动程序的实现
    * I2C_transfer ()。
    *
    typedef bool (* I2C_TransferFxn)(I2C_Handle handle、
    I2C_Transaction *事务);

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

    我没有用于测试它的活动设置、但应该是

    TxBuffer[0]= 0x00;
    i2cTransaction.slaveAddress = 0x40;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 0;
    I2C_transfer (i2c、&i2cTransaction)

    usleep(7000);


    TxBuffer[0]= 0x00;
    i2cTransaction.slaveAddress = 0x40;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 0;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 4;

    while (!(I2C_transfer (i2c、&i2cTransaction));