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.

[参考译文] CC1352R:CC1352 I2C

Guru**** 2535750 points
Other Parts Discussed in Thread: CC1352R, TMP116, TMP102, BOOSTXL-BASSENSORS

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/780645/cc1352r-cc1352-i2c

器件型号:CC1352R
主题中讨论的其他器件: TMP116TMP102BOOSTXL-BASSENSORS

海  

我正在处理 CC1352R 传感器代码。 我正在使用 i2c 外设和回调函数读取温度数据。

在初始化时,我只打开 i2c 一次,如果每隔5秒读取一次温度值,我将获得温度值。

但是、如果 我每次尝试打开 i2c 并读取温度值并关闭 i2c、则由于 i2c 传输失败、我无法获取温度值。 如果我在事件中打开和关闭 i2c、是否有任何问题?

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

    如果您共享了代码来显示您在这两种情况下的使用方式、那将会有所帮助。 至于关闭 I2C、是否有理由每次打开/关闭驱动程序?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用的是 TMP116温度。 该温度传感器在5分钟内不会提供90%的温度变化。 达到温度变化的90%需要更多的时间。 这样、我将尝试重新初始化 I2C。

    这是工作代码

    void Temperature_Init (void)

    I2C_init();
    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    i2cParams.transferMode = I2C_MODE_CALLACK;
    i2cParams.transferCallbackFxn= Temperature_CallbackFxn;

    I2C = I2C_open (Board_I2C0、&i2cParams);

    if (i2c == NULL)



    其他





    浮点 CAL_Temperature (void)

    memset (rxBuffer、0、2);
    /*指向 T 环境寄存器并读取其2个字节*/
    txBuffer[0]= temperature 寄存器;
    i2cTransaction.slaveAddress = TMP_SLAVE_ADDRESS;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 2;
    IF (I2C_transfer (i2c、&i2cTransaction))



    其他

    TEMRATE_VALUE = 0.0;

    返回 Temperature_value;

    空 Temperature_CallbackFxn (I2C_Handle handle、I2C_Transaction *事务、bool 传输状态)

    TEMRATE_VALUE = 0;
    温度= 0;
    temp = rxBuffer[0];
    温度=温度<<8;
    temp = Temp|rxBuffer[1];
    //因为1 LSB=0.0078125度级
    Temperature 值= Temp*0.0078125;

    ----------------------------------------------------------------------
    这是另一个代码

    void Temperature_Init (void)

    I2C_init();
    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    i2cParams.transferMode = I2C_MODE_CALLACK;
    i2cParams.transferCallbackFxn= Temperature_CallbackFxn;

    /*指向 T 环境寄存器并读取其2个字节*/
    txBuffer[0]= temperature 寄存器;
    i2cTransaction.slaveAddress = TMP_SLAVE_ADDRESS;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 2;




    浮点 CAL_Temperature (void)

    I2C = I2C_open (Board_I2C0、&i2cParams);

    if (i2c == NULL)



    其他




    IF (I2C_transfer (i2c、&i2cTransaction))



    其他

    TEMRATE_VALUE = 0.0;

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

    请回答我的问题。

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

    我尝试在 tmp007示例中添加 while (1)以重复测试 I2C_open/I2C_close、并且在测试时不会看到任何问题。

    void * mainThread (void * arg0)

       unsigned int   i;
       uint16_t       温度;
       uint8_t        txBuffer[1];
       uint8_t        rxBuffer[2];
       I2C_Handle     i2c;
       I2C_Params     i2cParams;
       I2C_Transaction i2cTransaction;

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

       /*配置 LED 引脚*/
       GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

       /*打开主机显示屏以输出*/
       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、"启动 i2ctmp007示例\n");

       /*创建 I2C 以供使用*/
       I2C_Params_init (&i2cParams);
       i2cParams.bitrate = I2C_400kHz;
       while (1){
           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"\});
           }
       
           /*指向 T 环境寄存器并读取其2个字节*/
           txBuffer[0]= TMP007_obj_TEMP;
           i2cTransaction.slaveAddress = Board_TMP_ADDR;
           i2cTransaction.writeBuf = txBuffer;
           i2cTransaction.writeCount = 1;
           i2cTransaction.readBuf = rxBuffer;
           i2cTransaction.ReadCount = 2;
       
           /*采集20个样本并将其打印到控制台*/
           对于(i = 0;i < 20;i++){
               if (I2C_transfer (i2c、&i2cTransaction)){
                   /*从接收到的数据中提取°C;请参阅 TMP102数据表*/
                   温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);
       
                   /*
                    *如果 MSB 设置为"1"、则我们有二进制补码
                    *需要符号扩展的负值
                    *
                   if (rxBuffer[0]& 0x80){
                       温度|= 0xF000;
                   }
                  /*
                   *为简单起见、将温度值除以32即可摆脱
                   *十进制精度;请参阅 TI 的 TMP007数据表
                   *
                   温度/= 32;
       
                   display_printf (display、0、0、"Sample %u:%d (C)\n"、i、temperature);
               }
               否则{
                   display_printf (display、0、0、"I2C 总线故障\n"\});
               }
       
               /*睡眠1秒*/
               睡眠(1);
           }
       
           /*已取消初始化 I2C */
           I2C_Close (i2c);
           display_printf (display、0、0、"I2C closed!\n"\});
       }
       返回(空);


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

    尊敬的 YiKai Chen:
    如果我在驱动程序示例中实现此代码、则运行正常。 但相同的代码不适用于低于1GHz 的传感器代码。

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

    您并未真正解释为何要在事件中重复打开/关闭 I2C 驱动器、而是只需打开一次即可重复使用手柄。 对于这方面的可能问题、具体取决于您运行的 SDK 版本。

    如果尚未这样做、我建议您尝试使用最新的 SDK、如果您有修订版 E 器件、则为 v2.40。 如果您没有修订版 E launchpad、则应使用 v2.30、因为这是支持较旧芯片修订版的最后一个 SDK。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用 SDK 2.30在传感器读取事件中测试此 I2C 打开/关闭、我可以看到问题。 您是否知道我们为什么无法在周期性事件中重复打开/关闭 I2C?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 YiKai、

    您是否能够在打开/关闭呼叫期间对线路进行范围和检查它们的状态? I2C 硬件没有任何复位机制、这意味着如果模块从未断电、某些状态可能会从开/关运行"溢出"到另一个运行。

    在这些情况下、如果您的总线恰好处于关闭时使 I2C 硬件"繁忙"的状态、则当您再次打开驱动程序时、此状态可能会卡住并保持"忙碌"状态。 您能否检查并查看这是否是您实际看到的内容(因为这会导致传输失败)。

    为2.30 SDK 解决的驱动程序中最初出现一个错误、即使总线正常、也可能在关闭期间导致此错误。
    遗憾的是、如果在调用 Close 时总线未处于空闲状态、我认为仍然可以看到这个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何在打开/关闭呼叫期间使用范围检查它们的状态?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、有几种方法可以检查它。 在关闭 I2C 之前、您可以检查是否有任何线路为低电平(使用它周围的 GPIO 来隔离它)。
    您还可以在打开调用之前中断、看看 I2C 寄存器是否可以访问、如果可以、您还没有为该域供电(可以是另一个保持该域活动的驱动程序、或者您根本没有处于待机状态)。 如果您可以访问它们、您还可以检查状态寄存器以查看是否标记为"忙"或其他内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    @,我用示波器检查了 I2C SCK/SDA 引脚,当应用程序调用 I2C open 和 close 时,这些引脚保持高电平。 此外、在应用程序关闭 I2C 之后、下次重新打开 I2C 之前、我无法访问 I2C 寄存器、这意味着 I2C 已成功关闭。 但是、我仍然看到 I2C 传输失败... 是否有新建议?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、M-W
    我想使用两个从器件。 这样、我会尝试在事件中重复打开/关闭 i2c 驱动器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用两个 I2C 从设备、则无需重复打开/关闭 i2c 驱动器。 您只需要更改 I2C 地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 YiKai Chen:
    我在不重新打开和关闭 i2c 驱动程序的情况下更改了从机的地址、但它不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议您先使用 I2C 协议分析器或示波器来检查 I2C 信号是否正确。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    @YiKai
    您是否能够进入转接呼叫并查看其返回失败的原因是什么? 是由于一些初始检查失败还是由于实际的事务错误?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    @M-W,它不会输入以下代码,因为 object->mode 是 I2CCC26XX_error。 我会跟踪它成为 I2CCC26XX_ERROR 的原因、但 CCS 不会显示调用栈。

    if (object->mode = I2CCC26XX_IDLE_MODE){
    DebugP_log1 (
    "I2C:(%p)传输正常"、
    hwAttrs->baseAddr);
    RET = true;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 YiKai Chen:
    现在、我的两个从器件在 i2c 阻断模式下工作正常。
    如果我使用 i2c 阻断模式、RF 部分(sub1GHZ)是否有任何问题???

    2.当我使用 i2c 回叫时,RTC 不更新日期和时间,但我可以读取日期和时间。
    为什么 RTC 在回调模式下不更新日期和时间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想它不应该影响射频部分。
    2.我看不到 RTC 不更新的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 YiKai、

    我想这主要是在 Hwi 函数内完成的。 我想知道这是否属于"早期中断"问题。 您能否在 Hwi 中放置一个断点、并查看是否在打开的调用之后结束了该断点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我无法理解您所说的“在 Hwi 中放置一个断点”。 您能否向我展示如何执行此操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 YiKai、

    我的意思是将 I2C 源代码添加到工程中、并在"I2CCC26XX_hwiFxn"函数的开头放置一个断点。 然后、您应该看到您是否在 I2C_open()之后收到中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我在 I2C_open()之后得到一个中断(I2CCC26XX_ERROR)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有进一步的建议?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    YiKay、您好!

    当您进入中断时、mstat 寄存器的内容是什么? 假设状态与您所说的相同(在打开/关闭期间线路保持高电平、并且在调用打开之前寄存器处于"不可访问"状态)、我看不到您接收中断的任何原因。

    您能否附加测试时使用的项目、以便我更仔细地查看它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只需使用相同的代码再次测试它、问题就会解除。 我怀疑我的 LaunchPad 和 BOOSTXL-BASSENSORS 之间的硬件连接不好导致此问题。 我想我们可以解决这个问题。 感谢你的帮助。