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.

[参考译文] TMDSCNCD2800157:需要一些帮助才能使 I2C 在我的 TMDSCNCD2800157 controlCARD 上运行

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1229306/tmdscncd2800157-need-some-help-making-the-i2c-work-on-my-tmdscncd2800157-controlcard

器件型号:TMDSCNCD2800157
主题中讨论的其他器件: C2000WARE

您好、专家!

我们的客户 需要一些帮助、以使 I2C 在其 TMDSCNCD2800157 controlCARD 上运行。
他遵循控制卡上的 I2C 接口示例、但成功有限。 他可以在 I2CA 中进行发送、但不能接收
如果有帮助、他提供了支持源代码和范围捕获
e2e.ti.com/.../CS1759715.zip

他 在不同的引脚上尝试了 I2CA 和 I2CB -仍然无法读取。
也尝试过使用和不使用 FIFO -这是他目前为止拥有的最好的 FIFO
他有很短的事务、只有很少的事务-所以不需要使用中断。 代码可以管理事务、无需等待。

请提供帮助建议。 谢谢你。

此致、
杰拉德

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

    Gerald,

    您尝试与 I2C 连接到什么? F280015x I2C 控制器还是目标?  

    我无法查看图像。 您能以 png / jpeg 格式发送吗?

    请提供您正尝试为传输和接收选项实现的 I2C 帧格式?

    此致、

    Manoj

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

    Gerald,

    我成功地读了示波器。 从下面的示波器屏幕截图可以看出、您似乎正在从目标中读取一些值? 那么、问题是什么呢。 我无法理解。

    此致、

    Manoj

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

    尊敬的  Manoj:

    我将您的回复转发给了我们的客户、但未能在上周收到他的回复。 因此,我在上星期四给他一封跟进信,看看他的关注是否已得到解决。 请参阅下面的客户反馈:

    我的问题未解决。  我暂时需要解决、但 I2CA 的状态位仍不可用。

    我想使用状态位来控制 I2C 的流、而不是使用延时时间。  如果没有状态位、就不可能知道 I2C 的状态、我也猜测何时接收到数据。 这是一个需要解决的重大问题。  

    我们希望得到进一步的建议。 谢谢你。

    此致、
    杰拉德

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    想使用状态位来控制 I2C 的流,而不是使用时间延迟。  如果没有状态位、就不可能知道 I2C 的状态、我也猜测何时接收到数据。 这是一个需要解决的重大问题。  [/报价]

    我需要更多详细信息、以便为您提供有意义的意见。 他是否检查了 I2CSTR (I2C 状态位)? 他们讨论的是什么延时时间? 它们是在进行字节字节通信(还是)启用 FIFO 的事务?

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

    CS1789715.zip 包括一个代码片段和以下范围捕获。  我可以使用  DEVICE_DELAY_US 而不是任何类型的状态位解决该问题。  由于 I2C 是一种状态驱动功能、因此它应该由状态而不是时序延迟来控制。  我的主要问题是、在使用延迟方法读取几十个字节时、一些字节将被复制或丢失 、因为我使用的是延时时间、而不是状态。  您的所有示例也都使用延时时间、并且只能处理几个字节、因此它们没有帮助。   

    我已尝试了使用和不使用 FIFO 的两种方法。  我无法使 I2C_STS_RX_DATA_RDY 或 I2C_STS_RX_FULL 正常工作。

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

    我写了一个不使用延迟函数的示例 I2CWrite 函数。

    void I2CWrite (uint32_t base、uint16_t targetAddr、uint16_t * pTXbuff、uint16_t byteCount、bool sendStopCondition)


    // I2C_enableInterrupt (base、I2C_INT_STOP_Condition | I2C_INT_NO_ACK | I2C_INT_ARB_LOST);

       //禁用并启用 FIFO 以刷新任何之前的 I2C 事务
       I2C_disableFIFO (base);
       //I2C_enableFIFO (base);

       I2C_setTargetAddress (base、targetAddr);
       //控制器发送模式+重复模式
       //I2CCNT 寄存器设置被忽略
       I2C_setConfig (base、I2C_CONTROL_SEND_MODE | I2C_REPEAT_MODE);

       I2C_sendStartCondition (base);

       uint16_t buff_pos = 0;

       uint16_t i;
       for (i=1;i<=byteCount;i++)
       {
           I2C_putData (base、pTXbuff [buff_pos++]);

           while (!(I2C_getStatus (base)和 I2C_STS_TX_DATA_RDY)){}

           I2C_clearStatus (base、I2C_STS_REG_ACCESS_RDY);
       }

       if (sendStopCondition)
       {
           I2C_sendStopCondition (base);
           while (I2C_getStopConditionStatus (base));
       }
    }

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

    这个代码段与我用于写入 I2C 的代码段非常接近。  我的问题是从 I2C 读取。   I2C_STS_RX_DATA_RDY 状态位不起作用。   请阅读我的文章并检查我的代码片段。  谢谢。

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

    您好、Brian、我们会在几天后回来与您联系。

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

    您好、Brian、

    我的问题是从 I2C 读取的。   I2C_STS_RX_DATA_RDY 状态位不起作用。   请阅读我的文章并检查我的代码片段。  [/报价]

    不处于 FIFO 模式时、可以使用 I2C_STS_RX_DATA_RDY 寄存器。 在代码中、我看到您在从 I2CDRR 读取数据之前清除了状态寄存器。 我认为您不应执行此操作、因为读取 I2CDRR 寄存器会自行将其清除。

    对于 FIFO 模式、您可以尝试 C2000WARE 中的"i2c_ex4_eeprom_Polling"示例中的以下例程。

        uint16_t i,count = 0,buff_pos=0;
        while(count < numofSixteenByte)
        {
            status = handleNACK(base);
            if(status)
            {
              return status;
            }
    
            count++;
    
            attemptCount = 1;
            while(!(I2C_getRxFIFOStatus(base) == I2C_FIFO_RXFULL) && attemptCount <= 9 * (I2C_FIFO_RXFULL + 2U))
            {
                DEVICE_DELAY_US(I2C_Params->Delay_us);
                attemptCount++;
            }
    
            for(i=0; i<I2C_FIFO_LEVEL; i++)
            {
                I2C_Params->pRX_MsgBuffer[buff_pos++] = I2C_getData(base);
            }
        }

    此致!

    Kevin 老师