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.

[参考译文] CC1350STK:传感器控制器 I2C 和任务代码 I2C

Guru**** 2581345 points
Other Parts Discussed in Thread: CC1350STK, HDC1000, CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/711036/cc1350stk-sensor-controller-i2c-together-with-task-code-i2c

器件型号:CC1350STK
主题中讨论的其他器件: HDC1000CC1310

你(们)好

我正在尝试与 CC1350STK 中的 BMP280传感器通信。  
我在传感器控制器中有成功从传感器读取压力数据并将原始数据报告回应用程序的代码。

在应用中、我希望在启用任务之前从传感器读取 ID、以及一些保存校准值的 I2C 寄存器、这些值稍后用于计算。
但是,当我在 启用任务之前先使用 I2C_open(),然后使用 I2C_Close()时,我看到任务没有唤醒 CPU (可能没有运行)。 当我删除  I2C_open()和 I2C_Close()代码时,任务会按照配置每 X 秒唤醒一次 CPU。

是否有办法在任务中使用 I2C,然后在调用 scifStartTasksNbl()以执行同样使用 I2C 的 SensorController 任务之前将其禁用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您写的是"当我在启用任务之前使用 I2C_open()和 I2C_Close()时",您在这里是指 SCE 任务吗? 您能否提供一些代码来显示与其余代码相关的 I2C_open ()/ I2C_close ()的放置位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    任务代码(在 BIOS_Start()之后):

    I2C_Handle I2C;
    I2C_Params i2cParams;
    
    /*配置 LED 引脚*//
    GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    
    I2C = I2C_open (Board_I2C_TMP、&i2cParams);
    if (i2c == NULL){
    返回;
    }
    
    if (hdc1000_detect (i2c)=HDC1000_STATUS_FAILED){
    
    。} 否则{
    
    。}
    
    I2C_CANCEL (i2c);
    I2C_Close (i2c);
    
    SCE_START();
    } 

    初始化代码(在 BIOS_Start()之前):

    SCE_INIT (0x00010000、1、1);
    SCE_registerAdcCallback (SceCallback); 

    当我注释掉任务代码中的所有 I2C 代码时、数据到达传感器控制器任务。 当代码显示时、没有数据到达。 我的传感器控制器任务也使用相同的 I2C 总线。
    在调用 SCE_START()之前是否有方法使用总线;然后释放它以执行传感器控制器任务?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需确保:SCE_START()之前的 I2C 代码按预期工作吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 已检查它是否正常工作。 我可以在 hdc1000_detect()中从 I2C 器件读取 ID,但不能从 SCE 任务中读取任何数据。
    如果我删除所有 I2C 代码并且只保留 SCE_START(),那么我会看到数据到达。
    除了 I2C_CANCEL()和 I2C_CLOSE ()外,是否还需要执行其他任何操作来释放用于 SCE 任务的 I2C 总线?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否查看此处涵盖的 I2C 驱动程序中的错误 :e2e.ti.com/.../2646582 是否与您的案例相关?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于不活动而关闭此线程。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    很抱歉耽误了很长时间、这已经暂停了一段时间、但现在需要再次进行。
    我尝试执行文章中所述的操作:添加 I2CCC26XX.c 并更改这些行、但这没有帮助。
    SCE_START()之前的代码运行良好(所有检测),但没有来自传感器控制器任务的数据。
    如果我在 SCE_START()之前注释掉所有这些 I2C 代码,则数据始终到达。

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

    我必须澄清以下几点:

    您编写了"任务代码(在 BIOS_Start()之后)":

    我假设您的代码如下所示:

    int main (void)
    {
    /*调用驱动程序初始化函数。 *
    Board_initGeneral();
    display_init();
    
    /*初始化传感器节点任务*/
    
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    } 

    您在任务中提供了您要提供的代码? 是否可以发布更完整的代码来显示您正在执行的操作以避免误解。   

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

    当然…

    int main (void)
    {
    /*调用驱动程序初始化函数。 *
    Board_initGeneral();
    
    I2C_init();
    
    /*清除 LED 引脚*/
    NodeRadioTask_init();
    NodeTask_init();
    data_task_init();
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    } 

    void data_task_init (void)
    {
    SCE_INIT (0x00010000、1、1);
    SCE_registerAdcCallback (SceCallback);
    } 

    然后在 BIOS_start()函数内每隔一秒调用一次该代码:

    I2C_Handle I2C;
    I2C_Params i2cParams;
    
    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    
    I2C = I2C_open (Board_I2C_TMP、&i2cParams);
    if (i2c == NULL){
    返回;
    }
    
    if (hdc1000_detect (i2c)=HDC1000_STATUS_FAILED){
    
    。} 否则{
    
    。}
    
    I2C_CANCEL (i2c);
    I2C_Close (i2c);
    
    SCE_START();
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从您最初的帖子中、我得到的印象是、您希望在启动 SCE 之前从传感器中读出一些详细信息。

    但是、从最后一段代码中可以看出、您正在使用 I2C 驱动程序每秒尝试访问传感器、同时尝试使用 I2C 使用 SCE 访问传感器。

    为什么不使用 SCE 或 I2C 驱动程序读取所需的所有数据、为什么要尝试同时读取这两个数据?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我希望在任务中读取一次数据(而不是 SCE 任务)、以便我可以读取器件 ID、校准值等。。
    然后、我想在任务中释放 I2C 总线并启动 SCE 任务、该任务定期使用 I2C 总线(每秒一次)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、但为什么您今天有一项任务、每秒使用 I2C 驱动器一次? 从我的角度来看、您执行代码的方式与代码的工作方式类似。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为什么不呢? 初始化 I2C、检查 ID 并启动 SCE 任务的代码仅在成功连接到集中器后调用一次。
    如果连接停止、SCE 任务停止、没有人访问 I2C、当连接将重新建立时、可能会再次调用此代码、因此我认为这是可以实现的。

    我还希望在开始 SCE 任务之前每次都读取 ID、因为其中一个传感器可能发生了故障、因此我不想读取垃圾值。
    我已经尝试将读取 ID 的 I2C 代码移动到 BIOS_start()之前,但它在 i2c_transfer()中挂起。

    是否可以读取 I2C 总线、将其释放、然后启动 SCE 任务?

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

    我认为、使用 CC1310 LP 和传感器 BP、我将能够再现 MoonDrop 概念。
    您能否确认以上 h/w 是否足够?

    如果是、则在 Mon. 我应该能够帮助修复此帖子。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    月降:
    "我还想每次读取 ID ":如果传感器由于某种原因而死了、为什么不从 SCE 读取 ID 并让主应用程序停止 SCE 任务?

    “我已经尝试将读取 ID 的 I2C 代码移动到 BIOS_start()之前”:BIOS_start()启动并需要激活不同的时钟