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.

[参考译文] RTOS/LAUNCHXL-CC2650:当尝试使用 SCS 从 RTC 模块读取温度时、i2cStatus 始终为0x0001

Guru**** 2587365 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/595660/rtos-launchxl-cc2650-i2cstatus-always-0x0001-when-trying-to-read-temperate-from-rtc-module-using-scs

器件型号:LAUNCHXL-CC2650

工具/软件:TI-RTOS

您好!

我在 Sensor Controller Studio 中无法使用 i2c。 每次执行"任务测试"时、i2cStatus 始终为0x0001。

以下是 Arduino 中的代码、我在其中进行原型设计、现在我正在尝试在 SCS 中使其正常工作:

如您所见、它在 Arduino 中完美地工作。

下面是我的 SCS 项目: e2e.ti.com/.../led_5F00_blinker_5F00_launchpad.zip

请忽略项目的注释代码和标题。 这是我在遵循 I2C 光传感器项目和 SCS i2c 文档中的代码时修改的 LED 示例项目。

如果我忘记说什么、请提问、我将尽力解释。

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

    您是否已经完成了 SimpleLink Academy 中的传感器控制器实验? 您可以在以下位置找到它们: software-dl.ti.com/.../overview.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我有。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是代码、如果它有助于:

    State.counter += 10;
    
    //选择温度寄存器
    i2cStart();
    i2cTx (I2C_OP_WRITE | 0x68);
    i2cTx (0x11);
    
    //如果成功...
    if (state.i2cStatus = 0x0000){
    
    state.insidecounter += 3;
    
    U16 resultRegH;
    U16 resultRegL;
    
    //读取结果
    i2cRepeatedStart();
    i2cTx (I2C_OP_Read | DS3231_address);
    i2cRxAck (resultRegH);
    i2cRxNack (resultRegL);
    i2cStop();
    
    } 否则{
    i2cStop();
    }
    
    fwScheduleTask (5); 

    我甚至无法进入 if 语句。 使用调试器时、我可以告诉您"i2cTx (I2C_OP_WRITE | 0x68);"语句返回0x0001的 i2cStatus

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

    为了进行记录、我可以从 CCS 访问传感器:

    unsigned int i;
    uint16_t 温度;
    float temp_float;
    uint8_t txBuffer[1];
    uint8_t rxBuffer[2];
    I2C_Handle I2C;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;
    
    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    I2C = I2C_open (Board_I2C、&i2cParams);
    if (i2c == NULL){
    System_abort ("初始化 I2C\n 时出错");
    }
    否则{
    system_printf ("I2C 已初始化!\n");
    }
    
    /*指向 T 环境寄存器并读取其2个字节*/
    //设置事务
    txBuffer[0]= DS3231_REG_TEMRATURE;
    i2cTransaction.slaveAddress = DS3231_address;
    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]<< 2)|(rxBuffer[1]>> 6);
    temp_float =(float)温度/4.0f;
    
    /*
    *如果 MSB 设置为"1"、则我们有二进制补码
    *需要符号扩展的负值
    */
    // if (rxBuffer[0]& 0x80){
    // 温度|= 0xF000;
    //}
    
    System_printf ("示例%u:%f (C)\n"、i、temp_float);
    } 否则{
    System_printf ("I2C 总线故障\n");
    }
    
    system_flush();
    Task_sleep (1000000 / Clock_tickPeriod);
    }
    
    /*已取消初始化 I2C */
    I2C_Close (i2c);
    System_printf ("I2C 已关闭!\n"\}); 

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

    您好、Roman、

    • 您是否在 SCL 和 SDA 上安装了外部上拉电阻器?
      • SCL 和 SDA 需要外部上拉电阻器。 电阻器值必须符合 I2C 规范中的要求。 典型值为2.2k Ω 或10k Ω、具体取决于总线负载和串行时钟频率。
    • 这是哪个传感器?
    • 您是否可以尝试以100kHz 而不是400kHz 的频率运行以进行测试?
    • 您能否获取通信的逻辑分析仪图(适用于工作中(CCS-TI-RTOS)和不工作(SCS))?

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

    您好、Erik V、

    我正在使用用于 RTC 模块的分线板。 它内部有4.7k Ω 电阻器。 我用 DMM 进行了双重检查。 以下是分线板的原理图: e2e.ti.com/.../7356.Protel-Schematic.pdf

    传感器是 DS3231、我使用的是分线板。 下面是我找到的相关链接:

    我两次都没有尝试过。 我还尝试将时钟拉伸超时从1us 改为10us。

    我家里没有示波器、但我可以在本周的某个时候在学校里试一下。

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

    以下是示波器图片:

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

    这是另一个屏幕截图、但使用数字探头。

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

    您好、Roman、

    上拉电阻可能太弱?

    您成功使用的 TI-RTOS 驱动程序将在 SDA/SCL 上配置内部上拉。 传感器控制器框架不会配置任何上拉。 可以在框架函数 scifTaskResourceInit()中 Hack/Alter 此函数:

    scifInitIo (9、AUXIOMODE_OPEN_LOW_ITH_INPUT_INPUT、-1、1);
    scifInitIo (10、 AUXIOMODE_OPON_DRALE_ITH_INPUT_INPUT、-1、1); 

    通过将第三个参数更改为1:

    scifInitIo (9、AUXIOMODE_OPEN_LOW_ITH_INPUT_INPUT、1、1);
    scifInitIo (10、 AUXIOMODE_OPON_DRALE_OF_INPUT、1、1); 

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

    Erik V 您好、

    感谢您的帮助! 我成功地使它正常工作。

    事实证明、问题是我使用的 I2C 从器件地址。

    在 Arduino 中、我使用了0x68、在 RTOS 中、我使用了0x68、因此在这里也使用了它。 事后看来、这很明显、但我应该已经完成0x68 << 1。 我通过在传感器控制器版本和 RTOS 版本上使用数字示波器并对两者进行比较来解决这个问题。

    图1:传感器控制器中的0x68地址

    图2:0x68 << 1传感器控制器中的地址

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