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.

[参考译文] CC1310:I2C 通信期间的等待时间

Guru**** 2540720 points
Other Parts Discussed in Thread: OPT3001, CC1310, LAUNCHXL-CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/969263/cc1310-the-waiting-time-during-i2c-communication

器件型号:CC1310
主题中讨论的其他部件:OPT3001、、

您好!

我的客户正在使用 CC1310中的主 CPU I2C 测试与 OPT3001的通信、但正在经历 I2C 持续访问等待时间。
另一方面、当在传感器控制器侧执行 I2C 通信时、不会生成该等待时间。


在主 CPU 上执行 I2C 通信时、为什么会发生这种等待时间?
此外、是否有方法可以消除这种等待时间?


以下示例代码用于主 CPU 端。" 仅修改了"i2ctmp.c"。

/*
版权所有(c) 2018-2019、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//

/*
=== i2ctmp116.c ===
*/
#include 
#include 
#include 

/*驱动程序头文件*/
#include 
#include 
#include 

/*示例/板头文件*/
#include "Board.h"

#define TASKSTACKSIZE 640

/*
===== tmp 寄存器======
*/
#define TMP006_REG TMP006的0x0001 /*芯片温度结果寄存器*/
#define TMP116_REG TMP116的0x0000 /*芯片温度结果寄存器*/

#define OPT3001_ADDR 0x44;
#define TMP116_BP_ADDR 0x48;
#define TMP116_LP_ADDR 0x49;

静态 Display_Handle 显示;

/*
=== mainThread ====
//
void * mainThread (void * arg0)
{
uint16_t 样本;
uint16_t 温度;
uint8_t txBuffer[8];
uint8_t rxBuffer[8];
I2C_Handle i2c;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;

/*调用驱动程序初始化函数*/
display_init();
GPIO_init();
I2C_init();

/*配置 LED 以及 TMP116_EN 引脚(如果适用)*/
GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
#ifdef Board_GPIO_TMP116_EN
GPIO_setConfig (Board_GPIO_TMP116_EN、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
TMP116的/* 1.5ms 复位时间*/
睡眠(1);
#endif

/*打开主机显示屏以输出*/
Display = Display_open (Display_Type_UART、NULL);
if (display =NULL){
while (1);
}

/*打开用户 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);
display_printf (display、0、0、"启动 i2ctmp 示例。");

/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
I2C = I2C_open (Board_I2C_TMP、&i2cParams);
if (i2c == NULL){
Display_printf (display、0、0、"Error Initializing I2C\n");
while (1);
}
否则{
display_printf (display、0、0、"I2C initialized!\n"\});
}

/*通用 I2C 事务设置*/
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 0;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 0;
i2cTransaction.slaveAddress = OPT3001_ADDR;

/*采集20个样本并将其打印到控制台*/
对于(;;){
TxBuffer[0]= 0x01;
TxBuffer[1]= 0xC2;
TxBuffer[2]= 0x10;
i2cTransaction.writeCount = 3;
i2cTransaction.ReadCount = 0;
i2cTransaction.slaveAddress = OPT3001_ADDR;
if (!I2C_transfer (i2c、&i2cTransaction)){
Display_printf (display、0、0、"错误。 未找到 TMP 传感器!");
}

usleep(150000);

TxBuffer[0]= 0x00;
i2cTransaction.writeCount = 1;
i2cTransaction.ReadCount = 2;
if (I2C_transfer (i2c、&i2cTransaction)){
uint8_t exp = rxBuffer[0]>> 4;
uint16_t fraction =((rxBuffer[0]& 0x0F)<< 8)| rxBuffer[1];
uint32_t lux =(uint32_t)(2 <<(exp - 1))*(uint32_t) fraction;
display_printf (display、0、0、"Sample %u"、lux);
}
否则{
display_printf (display、0、0、"I2C 总线故障");
}

/*睡眠1秒*/
usleep(200000);
}

I2C_Close (i2c);
display_printf (display、0、0、"I2C closed!");

返回(NULL);
}

传感器控制器侧基于 Sensor Controller Studio 中包含的"I2C Light Sensor"示例软件创建。

下面是 I2C 通信期间主 CPU 侧的波形图。

使用的电路板是 LAUNCHXL-CC1310。
Ch.1 (黄色):SCL (2V/div)
通道2 (绿色):SDA (2V/div)
Ch. 3 (蓝色):电流消耗波形(2mA/div)
红色箭头表示正在等待的时间。

下面是 I2C 通信期间传感器控制器侧的波形。


使用的电路板是 LAUNCHXL-CC1310。
Ch.1 (黄色):SCL (2V/div)
通道2 (绿色):SDA (2V/div)
Ch. 3 (蓝色):电流消耗波形(2mA/div)

此致、
Una

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

    您好 UNA、

    感谢您的提问。  

    我将对此进行研究、并在下周向您进行更新。  

    同时、您能否共享您正在使用的 SDK 的哪个版本?  

    谢谢、  
    ELIN

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

    您好、Elin、

    感谢你的答复。

    它们使用的是 SDK v4.10.02.04的最新版本。
    但是、Resource Explorer 版本似乎已经过时(v4.10.01.01)。

    此致、
    Una

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

    您好 UNA、

    从您的范围来看、它似乎与"先写后读"交易相关、在这种情况下、周期似乎是专有的时钟延伸(我假设在两侧都是时钟延伸、但一旦它成为接收器、CC1310侧就肯定是如此)。 为什么说起来很难、但通常我会说它与系统中的其他情况有关、 I2C 接收器将强制 SCL 为低电平、而不能接收、只要您尚未读出最后接收到的数据(由于没有 FIFO、这可能是每个字节)、就意味着 ARM 端的接收就会强制 SCL 为低电平。

    对于传感器控制器、这实现了一个完全自主运行的位拆裂 I2C 主器件。 这意味着"系统延迟"不是延迟、在写入/读取之间移动以及处理连续读取的速度可能会更快(因为它不等待处理特定中断、而是以轮询方式进行操作)。  

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

    您好、M-W、

    感谢你的答复。

    由于 OPT3001连接到 CC1310、因此 ARM 端用作 I2C 主设备。
    我认为时钟扩展是 I2C 从设备的功能。
    由于 OPT3001也连接到传感器控制器、我认为会发生相同的时钟拉伸。 为什么我看不到时钟延伸到传感器控制器侧?

    此致、
    Una

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

    您好 UNA、

    时钟扩展是接收器的功能、并不严格限于该角色。 例如、如果您从主器件执行突发读取操作、它会在等待您耗尽数据寄存器的同时拉伸时钟。 并不是从器件应该真正关心这一点、而是它仍然在做、因为它是接收器逻辑工作的方式。  

    因此、在 ARM 情况下、由于主器件需要在 SW 中漏掉之前接收到的数据、因此可能会发生拉伸(正如我在上面提到的)。 传感器控制器不使用相同的外设(或任何尚可的外设)、也不受其他因素的影响、例如可能导致 I2C 处理延迟的 RTOS 事件和中断。