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.

[参考译文] 编译器/TM4C123GH6PM:I2C 写入问题。 连续写入问题。 SDA 变为高电平。

Guru**** 2465890 points
Other Parts Discussed in Thread: PCA9534

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/662123/compiler-tm4c123gh6pm-i2c-write-issue-issue-with-continuous-write-sda-goes-high

器件型号:TM4C123GH6PM
主题中讨论的其他器件:PCA9534

工具/软件:TI C/C++编译器

大家好、社区  

我的 I2C 代码有问题。 在下图中、I2C SDA 线在两个字节之间变为高电平存在问题。 它仍然与 i2c 上的大多数芯片通信(下图)、但当我与 PCA9534通信时、总线挂起、如上图所示。  

void I2CSend (uint8_t slave_addr、uint8_t * data、uint8_t num_of _elements_TO_SEND)
{
uint8_t i;

//告诉主模块何时将在总线上放置什么地址
//与从设备通信。
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、false);



//将要发送的数据放入 FIFO 中
I2CMasterDataPut (I2C0_BASE、DATA[0]);

//如果只有一个参数,我们只需要使用
//单发送 I2C 函数
如果(num_of _elements_TO_SEND = 1)
{
//从 MCU 发起数据发送
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);

//等待 MCU 完成传输。
while (I2CMasterBusy (I2C0_BASE));


}


//否则,我们开始在上传输多个字节
//I2C 总线
其他
{
//从 MCU 发起数据发送
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

//等待 MCU 完成传输。
while (I2CMasterBusy (I2C0_BASE));

//send num_of _args-2数据片段、使用
///burse_send_contt 命令的 I2C 模块
对于(i = 1;i <(num_of _elements_TO_SEND - 1);i++)
{
//将下一段数据放入 I2C FIFO 中
I2CMasterDataPut (I2C0_BASE、DATA[i]);
//发送刚刚放置到 FIFO 中的下一个数据
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);

//等待 MCU 完成传输。
while (I2CMasterBusy (I2C0_BASE));
}

//将最后一段数据放入 I2C FIFO 中
I2CMasterDataPut (I2C0_BASE、DATA[i]);
//发送刚刚放置到 FIFO 中的下一个数据
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);


//等待 MCU 完成传输。
while (I2CMasterBusy (I2C0_BASE));






}
} 

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

    我不认为 SDA 线路变为高电平是问题的根本原因、我记得在 I2C 示例的其他逻辑快照中看到的、I2C 总线在写入从器件时是如何为器件运行的、 我没有发现任何导致问题的行为报告。 我认为我们需要比 SDA 线的行为更深入地研究这一点。

    获取更多信息的几个问题:

    1) 1)您安装了什么值的上拉电阻器?
    2) 2) 2)您能否共享 I2C 初始化信息?
    3) 3)读写时是否都会出现问题?
    4) 4)您是否验证了器件的从器件地址是否正确? 我假设它从您的图像设置为0x48?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    空 InitI2C0 (空)
    {
    //启用 I2C 模块0
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    
    
    //复位模块
    SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
    
    //启用包含 I2C 0的 GPIO 外设
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    
    //为端口 B2和 B3上的 I2C0功能配置引脚复用。
    GPIOPinConfigure (GPIO_PB2_I2C0SCL);
    GPIOPinConfigure (GPIO_PB3_I2C0SDA);
    
    //为这些引脚选择 I2C 功能。
    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
    
    //启用和初始化 I2C0主机模块。 使用的系统时钟
    // I2C0模块。 最后一个参数设置 I2C 数据传输速率。
    //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
    //设置为400kbps。
    I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
    
    //清除 I2C FIFO
    HWREG (I2C0_BASE + I2C_O_FIFOCTL)= 80008000;
    } 

    您好、Ralph、

    1) 1) 4.7K Ω 上拉电阻器、我还尝试了10k Ω、但没有成功。

    3) 3)问题似乎仅在写入第二个字节后发生。  

    4) 4)是的、我已经验证了从器件地址。

    这是初始化代码。

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

    初始化和发送数据的代码看起来很稳定。尽管我认为您不需要清除 I2C FIFO 行、也有 driverlib 调用。 我通读了 PCA9534的器件数据表、我认为基于该数据发送顺序还可以。

    鉴于您似乎在其他器件上取得了成功、我认为您需要做的是获取 o 范围并检查 I2C 线路上的某些时序与 PCA9534数据表规格。 我在 E2E 上寻找任何 I2C 驱动器作为参考、虽然我找不到任何驱动器、但我发现一篇提到时序调整的文章解决了 I2C 问题。 鉴于您的设置看起来有多稳定、我认为验证时序是合理的。

    此外、为了进一步说明 SDA 线不应该成为问题的原因、我不关心它的主要原因是当它发出高电平脉冲时、该时间内不会发生时钟周期、因此它不像从器件或主器件将寄存高电平值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "感受疼痛"(拉尔夫和海报的疼痛。)

    实际上、I2C 用作多器件总线、但当出现"此类问题"(超出"正常"诊断工作范围)时、"kiss"表示 "部署了最简单的设置。"

    作为"时序"-我有理由相信-在诊断提示/问题中有所上升-我会问、"所有其他 I2C 器件都与 I2C 总线"隔离"-尽可能/实用!"

    Fi/I 已观察到、在(合理数量的)情况下、"未寻址的 I2C 器件"可能会"对 I2C 数据传输和/或 ACK 造成不必要的影响"-并且(即使很少见)-这种潜在的(损害)最好"消除"... 以防万一...

    我们过去的诊断工作已经发现、"行为错误的从属设备"做出了多次响应、即使未生成(准确) I2C 地址、但却发生了"足够的 I2C 地址位匹配"... 更改为"非法启用该从属设备!"    (暂时消灭此类"奴隶"可防止.)

    KISS -再次-"上升到诊断场合"、通过"减少 空气中的焊球数量!"  (设计变量-此处-针对纯化员...)

    事实证明、它还有助于(真正)测量/确认 到总线上每个 I2C 器件的电源布线。    有时可能存在"寄生电源路径"、而这些"将 I2C 总线打开以产生"意外后果"、这种情况下很少见..."

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

    所有、

    感谢你的帮助。 我确实认为这是一个时间问题。 l 已经运行测试并发现某些位模式更有可能导致芯片问题。 我过去使用过 PCA9534、从之前的项目中删除了 PCA9534中的一个、并将新项目作为比较投入使用、问题没有消失、但问题的发生显著减少。 我将继续研究 i2c 路径和总线上的其他器件的问题。

    谢谢、

    Andrew Ward

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

    虽然 I2C (可能)通过"插件板"或短互连 SDA/SCL 导线工作(短期)、但"最佳结果"很少到达...

    同样、消除(可能)影响"外部影响"对"速度、易用性和增强"诊断成功与否有很大影响...

    另请注意、I2C 用作 "短距离总线"-如果 MCU 和"从板"之间的"电缆已连接"-通常~150mm 证明、"最大可靠电缆长度"。    始终必须"仔细检查"从电路板/I2C 器件和 MCU 之间的接地"、确保其稳定可靠且尽可能直接。