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/TM4C123GH6PM:无法与 I2C 通信

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/715510/rtos-tm4c123gh6pm-not-able-to-communicate-with-i2c

器件型号:TM4C123GH6PM

工具/软件:TI-RTOS

您好!

我将 TM4C123GH6PM 控制器与 TI-RTOS 搭配使用、用于 Tiva C v:2.16.00.08。 我需要与支持 I2C 作为从设备(Addr :0x54)的 Pixy Cam5通信。

我介绍了 TI-RTOS SDK 中的 I2C 示例、该示例通过 CCS 下载。

每当我运行代码时、它都会进入 IDLE 模式。 我使用断点进行了检查、并使用"步入"按钮来执行每个步骤。 在 taskFxn fucnion 中、它应该在 while 循环内执行、但在此之前它将进入空闲模式。

我无法获取启用了哪个 I2C。 因此、我反复连接到0-3个 I2C 端口、没有一个端口工作正常。

我已经附加了我为摄像机创建的主函数和额外头文件。

e2e.ti.com/.../5047.i2ctmp006.ce2e.ti.com/.../8662.pixy_5F00_header.h

关于摄像机:-

PIXY 凸轮可以识别多达7种颜色、我们可以从 PixyMon 应用程序中配置这些颜色。 因此、通过使用它们的 API、我们可以确定哪种颜色。 当使用 I2C 时、我们不必从特定寄存器中读取、在发送读取命令时、Pixy 将写入识别的所有颜色。

www.cmucam.org/.../Porting_Guide

您能帮我解决这个问题吗?

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Vishnu,
    您是否能够对 TI-RTOS 示例进行一些修改以连接 I2C 从设备?

    通常情况下、任务与信标一起使用。 一个任务通常有三个部分、一个在 while (1)之前设置任务环境的源代码、一个 while (1)、此 while (1)包含一个 Semaphore_pend ()来阻止或等待一个信号(信标)被布置、以表示数据可以处理、 最后是结束代码、在任务退出前关闭环境。 您未使用信标、并且您还会注释掉 Task_sleep。 我不是 TI-RTOS 方面的专家、但我认为这可能是一个问题。 我还建议您从 TI-RTOS 示例开始、并在转到复杂的内容之前先尝试将其修改为从器件、例如在当前代码中调用复杂函数(即 getStart、getWord、getByte 以从文件系统读取数据)。 尝试先发送一些简单的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

              在哪里构建 taskFxn_1 (UArg0、UArgarg1)线程?  您使用的所有任务的优先级是什么? 如果您使用多个任务、请保持  taskFxn 的最高优先级、然后重试。 检查逻辑分析仪上接收到的数据或其他数据。 此外、在 while 循环中添加所需的最小延迟(取决于从站)。

    此致、

    Digvijay

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

    [引用 user="Digvijay khambe">您在哪里构建 taskFxn_1() ...  所有任务的优先级是什么 ...  如果使用多个任务,请将  taskFxn 的优先级保持在最高 ...  在逻辑分析仪上检查接收到的数据...  添加所需的最小延迟。[/quot]

    很棒的建议!   很高兴看到您:"平衡延迟"-通过帮助"其他人"-随着您继续"进一步成长/发展"!   注意: “帮助他人——所以经常建立(你)理解和分析— —非常幸运…… 以及最 "有用的结果"。

     供应商/朋友 Charles 写道: "在 转向复杂的事情 (即"调用 复杂的函数")之前、先尝试对其进行调整。  尝试 先发送一些简单的数据。"   他也证明了非常正确的指导,但不能 用“ 一个词……”代替“大约30个(总是充满努力)的文字描述”。  “吻!”   (这证明更 容易记住、指导和有效)

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

    您好、Charles、

    我能够对现有程序进行更改。 但我不知道在 Board_initI2C()函数调用期间初始化了哪个 I2C 引脚。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    taskFxn_1 ()是一个不涉及程序的虚拟函数。 我在为 I2C 编写代码之前使用了该函数来检查任务执行情况。 我在 while 环路中编写的代码、该代码运行良好。 但在 void taskFxn (UARg arg0、UARg arg1)中、I2C 代码不会进入 while 循环。

    到目前为止、我仅使用一个任务。
    空 taskFxn (UARg arg0、UARg arg1)

    System_printf ("内部任务\n");
    system_flush();
    int i;
    uint8_t prev = 0;
    int maxblock = 100;

    while (1)

    system_printf ("进入 while 中\n");
    system_flush();
    getStart();
    int ret = getBlocks (maxblock);
    for (i=0;<ret;i++))

    int color = g_blocks[i]。signature;
    如果(prev != color)

    开关(颜色)

    案例1://printf (“绿色\n”);
    GPIO_WRITE (Board_LED1、Board_LED_ON);//绿色 LED
    中断;
    案例2:// printf (“橙色”);
    GPIO_WRITE (Board_LED2、Board_LED_ON);//红色 LED
    中断;
    案例3://printf (“黄色”);
    GPIO_WRITE (Board_LED0、Board_LED_ON);//蓝色 LED
    中断;


    上一页=颜色;
    //Task_sleep (100);





    它正在控制台中打印"内部任务"、但缺少下一个 printf 语句。 这意味着它不会进入 while 循环。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您的支持。
    现在、我将获得输出。 Task_sleep()出错。
    您能解释一下 Task_sleep()在 TI-RTOS 中的意义是什么?

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

    你(们)好

    [引用 user="Vishnu sathesesh"]但我不知道在 Board_initI2C ();函数调用期间初始化了哪个 I2C 引脚。

    要了解 PIN 配置、您必须浏览以下三个文件

    1.Board.h

    2.EK_TM4C1294XL.h

    3.EK_TM4C1294XL.c

    以下是 与 EK_TM4C1294XL.c 文件中 i2c 的 PIN 配置相关的代码、该文件与我的项目相关。

    /*
     * ========================================= I2C ================================================
     *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (I2C_CONFIG、".CONST:I2C_CONFIG")
    #pragma DATA_SECTION (i2cTivaHWAttrs、".const:i2cTivaHWAttrs")
    #endif

    #include
    #include

    I2CTIVA_Object i2cTivaObjects[EK_TM4C1294XL_I2CCOUNT;

    CONST I2CTIVA_HWAttrs i2cTivaHWAttrs[EK_TM4C1294XL_I2CCOUNT ={
       {
           baseAddr = I2C2_base、
           .intNum = INT_I2C2、
           .intPriority =(~0)
       }、
       {
           baseAddr = I2C8_BASE、
           .intNum = INT_I2C8、
           .intPriority =(~0)
       }
    };

    const I2C_Config I2C_CONFIG[]={
       {
           fxnTablePtr =&I2CTiva_fxnTable、
           .object =&i2cTivaObjects[0]、
           hwAttrs =&i2cTivaHWAttrs[0]
       }、
       {
           fxnTablePtr =&I2CTiva_fxnTable、
           .object =&i2cTivaObjects[1]、
           hwAttrs =&i2cTivaHWAttrs[1]
       }、
       {NULL、NULL、NULL}
    };

    /*
     * ==== EK_TM4C1294XL_initI2C ===
     *
    void EK_TM4C1294XL_initI2C (void)

       /* I2C7初始化*/
       /*
        *注意:TI-RTOS 示例为 SSI2或 I2C7配置引脚 PD0和 PD1。  因此、
        *在中同时使用 I2C 和 SPI 驱动程序时会发生冲突
        *应用程序。  修改此文件中的引脚多路复用设置并解析
        *运行应用程序前发生冲突。
        *
       /*启用外设*/
       SysCtlPeripheralEnable (SYSCTL_Periph_I2C2);

       /*将相应的引脚配置为 I2C 而不是 GPIO。 *
       GPIOPinConfigure (GPIO_PN5_I2C2SCL);
       GPIOPinConfigure (GPIO_PL0_I2C2SDA);
       GPIOPinTypeI2CSCL (GPIO_PORTN_BASE、GPIO_PIN_5);
       GPIOPinTypeI2C (GPIO_PORTL_BASE、GPIO_PIN_0);

    //   ///* I2C8初始化*/
    //   /*启用外设*/
    //   SysCtlPeripheralEnable (SYSCTL_Periph_I2C8);
    //
    //   //////*将相应的引脚配置为 I2C 而不是 GPIO。 *
    //   GPIOPinConfigure (GPIO_PA2_I2C8SCL);
    //   GPIOPinConfigure (GPIO_PA3_I2C8SDA);
    //   GPIOPinTypeI2CSCL (GPIO_Porta_base、GPIO_PIN_2);
    //   GPIOPinTypeI2C (GPIO_Porta_base、GPIO_PIN_3);

       I2C_init();


    此致、

    Digvijay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您获得输出很好,但我仍然不理解 Task_sleep()是如何造成问题的??

    Task_sleep (T)阻断 T 时钟节拍的任务。 您可以设置等效于1个时钟节拍的周期。
    此致、
    Digvijay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Digvijay 澄清海报中的疑虑。