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.

[参考译文] EVM430-FR6047:I2C 时钟同步

Guru**** 2576215 points
Other Parts Discussed in Thread: CC1310, MSP430FR6047

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/937583/evm430-fr6047-i2c-clock-synchronization

器件型号:EVM430-FR6047
主题中讨论的其他器件:CC1310MSP430FR6047

你(们)好

顺便说一下、我的 I2C 通信存在问题。 我正在对 CC1310和 MSP430FR6047水流量计进行编程。 在最一般的层面上、我尝试执行 GUI 的大部分操作。 另一个微控制器- CC1310。 我在两个具有模拟发现功能的 MCU 上读取了 I2C 封装。 当连接到水演示 GUI 时、它按设计工作、但当我使用 CC1310时、我会遇到一些时钟同步问题、这可能是我无法使其正常工作的原因。

下面是整个更新参数的屏幕截图-命令0x96 -在 GUI -> MSP 位于顶部、我的位于底部。

我使用 TI 的 API 来初始化 I2C 并将频率设置为400kHz -否则为标准参数。 我可以进行通信、因此设置应该很好。 我无法按我希望的那样进行通信。

您可以清楚地看到。 时钟在每个字节的开头保持低电平。 如果我放大 h09部分、可以看到时序在数据和时钟方面稍有不同

第一个重点是 I2C 线路本身。 我测量了上拉电阻器、它们很好。 时钟频率略有差异  

如果我使用相同的刻度、即使存在差异、也不会太大。

我有一个 for 循环、用于处理 I2C 通信并模拟 Gui->MSP I2C 通信。 我发送 comm96、等待 COMM_IRQ 线路中的中断、然后接收读取消息。 然后、我传输参数、并对所有参数重复该过程。

循环使用将结构作为参数的函数、该参数包含要写入的数据或接收读取软件包的位置。 在该函数中、设置 i2ctransaction 结构并进行 I2CTransfer 调用。

调试 MSP430显示我只设置3个参数、未设置 updatevalid 标志。

我可以引入3秒 延迟(不会比该时间快很多)、然后我可以设置所有参数、但有效标志仍然为 false。

您如何在 EVAL 板的"GUI"端对其进行管理?

此致 Lasse

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

    您好、Lasse、

    您能解释一下 CC1310上运行的代码:

    1) 1)您使用的是什么 SimpleLink CC13x0 SDK?

    2) 2)您的应用基于哪个示例项目?

    3) 3)器件上定义了哪些任务、哪些任务与 I2C 同时运行?

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

    感谢您的回复 Marie。

    在回答您的问题时、我拥有以下内容:

    0) 0)我想我忘记了提到我已经检查了 SDA 和 SCL 上的电压、这两个电阻器都很好、因此上拉电阻器也可以。

    1) Simplelink SDK:simplelink_cc13x0_sdk_3_20_00_23

    2) 2)该项目最初基于 i2ctmp 项目(但与 I2C_init 部件不同、没有太多保留)

    3) 3)我有1个正在运行的任务- mainThread -它会调用我的 setparameters()函数。

    因此、它应该是唯一运行的任务。 在编写时,在 while (1)循环中调用了原始 POST setparameters()

    while (1)
    {
    setparameters();
    sleep (1);//在此处有一个断点,然后检查 MSP 中的参数
    } 

    正如您在第一个帖子中看到的、该函数随后调用一个 I2CCommunications 函数、该函数执行以下操作:

    bool I2CCommunication (struct I2CtransactionStruct* CommStruct)
    {
    
    i2c = I2C_open (Board_I2C0、&i2cParams);
    
    if (CommStruct->write)
    {
    i2cTransaction.writeBuf = Write_buffer;
    i2cTransaction.writeCount = CommStruct->length;
    i2cTransaction.readBuf = 0;
    i2cTransaction.ReadCount = 0;
    } 否则(!CommStruct->write){
    i2cTransaction.writeBuf = 0;
    i2cTransaction.writeCount = 0;
    i2cTransaction.readBuf = read_buffer;
    i2cTransaction.ReadCount = CommStruct->length;
    }
    
    //准备写消息,如果 CommStruct->write/loop
    
    处理每个已发送或已接收的包
    while (CommStruct->count->0){
    
    if (CommStruct->Wait){
    //sem_res_Bool = Semaphore_pend (captureSem、(7000 *(1000 / Clock_tickPeriod)));
    
    while (GPIO_Read (Board_DIO1)= 1){
    //不执行
    任何操作}
    interrupt_counter++;
    //sem_res = sem_titedwait (&captureSem、&ts);
    
    }
    
    if ((res = I2C_transfer (i2c、transfer)= true)){
    } 否则{
    I2C_Close (i2c);
    返回 false;
    }
    
    //unpacking package if it was a received package
    }(如果包是接收到的包,请将其 


    我强调了一些可解决某些问题的代码。

    我已经注释了信标部分(已尝试使用您的 API 和 POSIX)。 当我需要一个读取数据包时、这个部件等待 COMM_IRQ 线路中断。
    如果没有信标、但只有一个简单的 while 循环、它实际上会按计划工作。

    但是、时钟同步部分仍然存在(很抱歉、IRQ 线路刚刚被封顶)。



    总之、
    1) 1)我可以在没有信标的情况下设置参数(稍后将需要使用该部件重试)
    2) 2)更新有效标志现已设置
    3) 3)即使我遇到时钟同步问题、也能正常工作

    TI 的 I2C 故障排除指南(我认为已经有了)提到、即使 clk SYNC 是 I2C 协议的一部分、也最好避免它。 那么、问题仍然是为什么它在那里呢?
    但或许这不是一个容易回答的问题。

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

    您好、Lasse、  

    请详细说明您的 CC1310代码吗? 为了更加精确、您是否可以包含所使用的 I2C 参数以及"I2CtransactionStruct"的定义以及 I2C_transfer (i2c、transaction)中的"Transaction"是什么?

    我假设"Transaction (交易)"为"i2cTransaction (i2cTransaction)"。 我不确定我是否了解您的架构与"commStruct"以及它在大图中的工作原理。 为了给您提供任何有关您拉伸时钟的好反馈、我需要了解有关您定制构建的所有详细信息。 如果您不想在此处分享、请随时在 PM 与我联系。