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.

[参考译文] TM4C129ENCPDT:SCLK 时钟和 SDO 线路问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1209300/tm4c129encpdt-sclk-clock-and-sdo-line-issue

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:TCA9555、TCA9534A 、、 EK-TM4C129EXL

您好!

我们使用 TCA9555 I2C 芯片运行直接通信。 芯片在同一块板上的距离为4英寸。 芯片直接连接、无需任何缓冲器或隔离器。 我们有4.75kR 上拉电阻。 我编写的固件在另一个项目中经过了测试、在与 TCA9534A 芯片通信时工作正常。 通信频率为100kHz。

我们会随机看到其中一个时钟脉冲会半路并且看起来会出现尖峰。 我们知道这不是尖峰、而是异常的时钟脉冲、因为当我们用其相邻脉冲测量脉冲的周期时、它是相同的周期。 当我们看到这个尖峰时钟脉冲时、TCA9555芯片将不会发布 SDO 线、我认为这是因为 TCA9555在无法识别尖峰半时钟脉冲时、芯片需要微控制器提供另一个脉冲、因此不会释放 SDO 线。

此外、我们还注意到 SDO 数据线上的一些脉冲也不正常。 请查看下面的两个快照。  

第一个 Snapshot 鞋带中的一个时钟脉冲是半向的,显示为尖峰,因此 SDO 线不会从低到高转换。

下面的第二个快照显示了所有时钟脉冲都是正确的、因此 SDO 线路被释放、但是 SDO 线路上的一些数据脉冲似乎不正常。

下图是电路原理图。

i2c 初始化和 i2c_read 代码如下所示;

void Internal_I2C_Init(void)
{
    //I2C0 Module initialization
    ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_I2C0);
    SysCtlDelay(100);
    ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_I2C0);
    SysCtlDelay(100);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);

    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C0)){} //Wait for I2C0 Module to stabilize
    I2CMasterEnable(IOChip_I2C_BASE);
    GPIOPinConfigure(GPIO_PB2_I2C0SCL);
    GPIOPinConfigure(GPIO_PB3_I2C0SDA);
    GPIOPinTypeI2CSCL(IOChip_I2C_BASE, IOChip_I2C_SCL_PIN);
    GPIOPinTypeI2C(IOChip_I2C_BASE, IOChip_I2C_SDA_PIN);
    ROM_I2CMasterInitExpClk(IOChip_I2C_BASE, sys_clock, I2C_100kHz_CLOCK);

}

uint32_t I2C_read(uint32_t ulBase, uint8_t chip_address, uint8_t internal_address)
{
    //Send Chip Hardware Address and Internal address of the register to write the date
    ROM_I2CMasterSlaveAddrSet(ulBase, chip_address, false); // Specify slave address with read request set to false
    ROM_I2CMasterDataPut(ulBase, internal_address); //Place the Internal register address
    ROM_I2CMasterControl(ulBase, I2C_MASTER_CMD_SINGLE_SEND); // Initiate send of 1Byte character from Master to Slave
    while (!(ROM_I2CMasterBusy(ulBase))); //Wait till end of transaction
    while(I2CMasterBusy(ulBase)); // not busy

    //Receive Data
    ROM_I2CMasterSlaveAddrSet(ulBase, chip_address, true); // Specify slave address with read request set to true
    ROM_I2CMasterControl(ulBase, I2C_MASTER_CMD_SINGLE_RECEIVE);// Initiate send of character from Master to Slave
    while (!(ROM_I2CMasterBusy(ulBase))); //Wait till end of transaction
    while(I2CMasterBusy(ulBase));

    //Read Receive Data from FIFO
    return (ROM_I2CMasterDataGet (ulBase)); //Read from FIFO
}

非常感谢您的观看。

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

    我认为主要问题是时钟的一半或缺失、这可能会导致 IO 芯片和微控制器之间出现不同步的情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    bruce loong 说:
    我们使用 TCA9555 I2C 芯片实现直接通信。 芯片在同一块板上的距离为4英寸。 芯片直接连接、无需任何缓冲器或隔离器。 我们有4.75kR 上拉电阻。 我编写的固件在另一个项目中经过了测试、在与 TCA9534A 芯片通信时工作正常。 通信频率为100kHz。[/报价]

    您好!

     通常情况下、对于100kHz、总线长度可达1米。 因此4in 在范围内。 4.7kΩ Ω 是100k 速度的合理值。  

    第一个 Snapshot 鞋带中的一个时钟脉冲是半向的,显示为尖峰,因此 SDO 线不会从低到高转换。

    [/报价]

    不是很清楚为什么会出现小时钟脉冲。 您可以再次确认从器件未将时钟拉低吗? 如果从器件需要更多时间来创建等待状态、则允许将时钟拉低。 如果您确定从器件不是在拉时钟、那么您可以将上拉电阻器更改为像2kΩ Ω 这样的某个更低的值吗? 您会发现任何差异吗?

    您的电路板布局如何? 是否向总线注入了噪声?

    [QUOTE USERID="163081" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1209300/tm4c129encpdt-sclk-clock-and-sdo-line-issue 下面的第二个快照显示了所有时钟脉冲是正确的、因此 SDO 线路被释放、但是 SDO 线路上的一些数据脉冲似乎不正常

    我认为这些都很好。 您的从器件会通过将 SDO 拉至低电平来回复 ACK。 如果主器件正确地将其识别为有效的 ACK、我目前不会担心。  

    下面是 I2C 应用手册中的另一个示波器屏幕截图。 您可以看到、第9位更窄、可能是因为从器件更快地释放 SDO 并且总线再次被上拉。  

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

    您好!

    我已经改变了4.75kR 上拉与2kR ,但没有运气。 我仍然看到急剧的尖峰时钟、SDO 将在一段时间内保持低电平。 信号也不是噪声。

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

    我可以确认 SDO 线路被连接的任何 I2C 芯片保持在低电平。 我有两个 I2C 芯片 TCA9555和温度传感芯片 TMP275AD。  

    我尝试了两个案例。  

    情况1: 我删除了 TCA9555芯片、只与 TMP275AD 芯片通信。 我看到 SDO 线路将在一段时间内保持低电平、但随后几次尝试后便会恢复。

    CASE2:我安装了 TCA9555芯片并删除了 TMP275AD 芯片。 我看到 SDO 线路将保持低电平、尽管进行了多次尝试、仍然无法再恢复。

    您能建议我们是否可以将时钟进一步降低到10kHz 左右吗?

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

    您好!

    我可以确认所连接的任意 I2C 芯片都将 SDO 线路保持在低电平。 我有两个 I2C 芯片 TCA9555和温度传感芯片 TMP275AD。  [/报价]

     您的原理图未显示 TMP275AD。 MCU (作为主器件)仅与两个从器件进行通信是否正确? 4.7K 或2k 应该足以作为上拉电阻、除非由于电路板上的两个从芯片和长迹线而产生大电容。 这两个从芯片我不熟悉。 如对拉电阻器有疑问、请参阅  TCA9555中的以下说明。

    物理 I2C 接口由串行时钟(SCL)和串行数据(SDA)线组成。 SDA 和 SCL 线都必须通过上拉电阻器连接到 VCC。 上拉电阻器的阻值由 I2C 线路上的电容量决定。 有关更多详细信息、请参阅 I2C 上拉电阻器计算应用报告 SLVA689。 只有当总线处于空闲状态时、才能启动数据传输。 如果在停止条件后、SDA 和 SCL 线都为高电平、则认为总线处于空闲状态。

    我尝试了两个案例。  

    情况1: 我删除了 TCA9555芯片、只与 TMP275AD 芯片通信。 我看到 SDO 线路将在一段时间内保持低电平、但随后几次尝试后便会恢复。

    CASE2:我安装了 TCA9555芯片并删除了 TMP275AD 芯片。 我看到 SDO 线路将保持低电平、尽管进行了多次尝试、仍然无法再恢复。

    [/报价]

    您的意思是、在几次尝试后、它会恢复。 您已经说过、在丢失时钟的情况下、从器件将挂起、等待一个额外的时钟。 它如何恢复?

    您能否展示示波器捕获、了解它在仅连接器件时如何恢复。  

    如果断开两个从器件会怎么样。 您会看到丢失时钟了吗?

    您能建议我们是否可以将时钟进一步降低到10kHz 左右吗?
    [/quote]

    按照协议规定、100kHz 是标准 I2C 速度。  

    您是否有其他显示相同问题的电路板、或者只有该特定电路板具有此行为。  

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

    当它与 TMP275A 通信时(移除 TCA9555时)、SDO 线路偶尔会保持低电平、但很少尝试使其释放回 t 高电平。

    但是、当控制器与 TCA9555通信时(移除 TMP275A 时)、SDO 线路将无法恢复。

    我修改了之前分享的代码、添加了以下代码的注释、改为使用了固定等待时间。

    这有助于我保持对芯片的研磨。

    //while (!(ROM_I2CMasterBusy(ulBase))); //Wait till end of transaction
    //while(I2CMasterBusy(ulBase)); // not busy

    遗憾的是、我只有一个原型电路板。 我有一个评估板。 我要尝试一下。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当它与 TMP275A 通信时(移除 TCA9555时),SDO 线路偶尔会保持低电平,但很少尝试使其恢复到高电平。

    我现在有点困惑。 在这里您说 SDO。 SDO (I2CSDA)是数据线。 我认为问题是其中一个时钟脉冲把时钟(I2CSCL)拉至低电平? SDO 可以保持低电平多个周期、因为从器件正在驱动返回数据。  

    但是、当控制器与 TCA9555通信时(移除 TMP275A 时)、SDO 线路将无法恢复。

    [/报价]

    如果这是由于 I2CSCL 缺失造成的、你能否判断它是否总是缺少相同的时钟脉冲。 观察您的第一个示波器捕获、它是数据周期中的第6个时钟脉冲。 地址周期似乎正常。 始终是缺少第6个时钟脉冲或者缺少任何时钟脉冲。 从主器件的角度来看、  在完成整个传输之前、没有理由错过特定的时钟脉冲。 我想不出为什么主人会这样做的原因。 考虑一下、主器件正在尝试写入从器件、因此它会生成一个地址周期、然后是数据周期。 为什么主器件突然不产生第6个时钟脉冲、而不产生其他时钟脉冲。  

    很遗憾我只有一个原型电路板。 我有一个评估板。 我要尝试一下。

    那么、您能否在评估板上产生同样的问题?

    您是否可以将另一个 MCU 替换为您唯一的原型电路板?

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

    您好!

    SCLK 位置极随机、可能发生在任何地方。 有些事务会很好、其他则不会、并且从器件不同步、因此不会释放 SDO 线路。

    我今天将尝试使用评估板。 我很快就会分享结果。

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

    您好!

     是的、请尝试另一个板。 此外、在所有从器件被断开或者也许一个来自芯片上其它 I2C 模块的虚拟从器件的情况下也进行尝试。 您能看到丢失的任何时钟吗?

     如前所述、从器件还可以将时钟保持为低电平来作为主器件的等待状态。 您可以确认时钟没有被从器件延展吗?

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

    我尝试了一个虚拟从器件、我看到它仍然错过了时钟。 我不想把它称为失踪-时钟,因为时钟在那里,但这是不正常的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我试过一个虚拟从机,我看到它仍然错过了时钟。 我不想把它称为缺失-时钟,因为时钟在那里,但它不是正常的

    这是在您自己的电路板上还是在 LaunchPad 上? 您是否也可以尝试 LaunchPad?

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

    我正在使用 Launchpad TM4C129ENCPDT 进行尝试。 对于我自己的电路板、我使用了 XDS110调试探针、但现在我尝试使用 Launchpad 自身的 UART 接口下载到 Launchpad、会看到以下错误。 有什么想法吗?

    CORTEX_M4_0: Loader: One or more sections of your program falls into a memory region that is not writable.  These regions will not actually be written to the target.  Check your linker configuration and/or memory map.
    CORTEX_M4_0: Trouble Reading Memory Block at 0x0 on Page 0 of Length 0x4: Received malformed response packet (expected 0xc4, received 0xf7)
    CORTEX_M4_0: File Loader: Verification failed: Target failed to read 0x00000000
    CORTEX_M4_0: GEL: File: C:\Users\iabid\Documents\CodeComposerStudio_WorkSpaces\Temp1WS\Project1.out: Load failed.

    请参见所附图片。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在尝试 Launchpad TM4C129ENCPDT。 对于我自己的电路板、我使用了 XDS110调试探针、但现在我尝试使用 Launchpad 自身的 UART 接口下载到 Launchpad [/报价]

    首先、为什么要通过 UART 接口? 您是否尝试使用引导加载程序加载代码。 为什么不使用 JTAG 通过板载 ICDI 调试探针加载代码?

    能否尝试 hello 或 project0等简单示例? 您是否会遇到同样的问题? 如果有、我认为电路板有问题。

    您可以尝试加载代码几次吗? 是否始终会得到相同的误差?

    您能否使用 LM Flash Programmer 执行解锁操作。  

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

    它现在正在工作。 我应该选择电路调试器选项。

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

    您好!

    我使用 Launchpad 运行、Launchpad 上的时钟似乎没有问题。 这是否意味着我有布局问题?

    但是、我看到总线仍然卡住。 但是、这次它似乎是一个不同的问题。 Debugger 窗口显示高速 MCS_HS 的 I2C_MCS 位、当通信停止时仲裁丢失的 MCS_ARBLST 位变为高电平。 为什么会发生这种情况。 时钟只被设定为100KHz。

    我不确定在固件未设置这些位时如何设置这些位。 请记住、这次我在使用 Launchpad。

    (请注意:MCS 0x0070十六进制不等于黄色突出显示位0b00001111100000000)

    还请建议,如果你看到任何问题,我的初始化序列以下;

    void Internal_I2C_Init(void)
    {
        //I2C0 Module initialization
        ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_I2C0);
    //
        SysCtlDelay(100);
        ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_I2C0);
        SysCtlDelay(100);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
    
        while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C0)){} //Wait for I2C0 Module to stabilize
        I2CMasterEnable(IOChip_I2C_BASE);
        SysCtlDelay(100);
        I2CMasterGlitchFilterConfigSet(IOChip_I2C_BASE, I2C_MASTER_GLITCH_FILTER_8);
        GPIOPinConfigure(GPIO_PB2_I2C0SCL);
        GPIOPinConfigure(GPIO_PB3_I2C0SDA);
        GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, IOChip_I2C_SCL_PIN);
        GPIOPinTypeI2C(GPIO_PORTB_BASE, IOChip_I2C_SDA_PIN);
    
        ROM_I2CMasterInitExpClk(IOChip_I2C_BASE, sys_clock, I2C_100kHz_CLOCK);
    
    }

    请注意、我已启用干扰滤波器。

    请建议、如何读取和清除 I2C_MCS 寄存器?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在使用 Launchpad 运行、似乎使用 Launchpad 时钟没问题。 这是否意味着我有布局问题?

    这当然建议您更加关注您的电路板。  

    (注意:MCS 0x0070 HEX 不等于黄色突出显示位0b00001111100000000)

    MCS 寄存器有两个视图。 写入时被用作一个控制寄存器。 当读取该位时、它会显示相应的状态。 如果您正在读取0x70、则表示它已设置 BUSBUSY、IDLE 和 ARLST。 总线仍处于忙状态、但控制器(I2C 状态机)处于空闲状态。 不清楚为什么要设置 ARBLST。  

     您是否在示波器上测量了 SCL 的100k?

    另请建议您在下面看到我的初始化序列有任何问题;

    您的 I2C_100kHz_clock 是什么? 它是0吗? 您的 sys_clock 是什么? 对于100k 波特率、第三个参数应为 false、如下所示。  

    I2CMasterInitExpClk (I2C0_BASE、ui32SysClock、false);

    我假设您在其他某个位置启用 GPIOB。  

    请注意,我已启用干扰过滤器。

    我建议您针对定时禁用滤波器。  

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

    大家好、Sahil:

     您是否已解决此问题? 我现在将关闭该主题。 如果您有任何更新、只需写回此帖子。 该帖子将自动重新打开并通知我。  

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

    您好!

    我看到问题与电路板布局有关。 I2C 时钟引脚在某种程度上对噪声耦合更敏感。 我对电路板做了一些临时修改、电路板开始工作。 感谢您投入宝贵的时间给予大力支持。

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

    尊敬的 Charles:

    我又收到了一些进一步的信息。 让我们回顾一下、快速回顾一下。 正如 TI 建议的那样、使用评估板尝试相同的固件。 我下载了相同的固件、评估板运行良好。 I2C 时钟信号很干净、并且没有半路尖峰时钟。

    但今天、我对评估板重复了同样的测试、并且我注意到、当 USB 调试器电缆(请检查 EK-TM4C129EXL 原理图第6页连接器 U22)插入芯片 USB 调试器 U22并为电路板供电时、I2C 时钟很干净。

    我已断开 USB 电缆、而是从外部提供3.3V 电源。 我注意到评估板 I2C 时钟显示了与我们在控制器板上观察到的相同的半路尖峰信号。

    如果我只需轻触调试器电缆连接器就能连接到 U22外壳(见下图中的绿色圆圈)。 半速尖峰时钟将消失并开始正常工作。  

    我看到连接器外壳和 GND 之间有3300pF (请参阅 C33)和1M 电阻(请参阅 R34)。

    它指向更多的共模问题? 我曾尝试在输入线路上安装多个环形磁珠、但都没有帮助。

    请参阅以下信息、我们将如何为我们的控制器板生成3.3V 隔离式电源。 请记住、当我将相对于 GND1 (TP6)的相同3.3V 从 TP5馈送到 TI 评估板时。 除非我触摸到 U22外壳的 USB 连接器、否则会出现相同的问题。

    有什么建议吗?

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

    您好!

     当您从3.3V BoosterPack 为电路板供电时、是否断开 JP3跳线?