主题中讨论的其他部件: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


