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.

[参考译文] TMS570LC4357:I2C 通讯问题

Guru**** 2468610 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1034094/tms570lc4357-i2c

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我在HALCOgen上面配置了i2c1的寄存器。μ A

/**-设置 i2c 模式*/
i2cREG1->MDR =(uint32)((uint32) 0U << 15U)// nack 模式
|(uint32)((uint32) 0U << 14U)/*自由运行*/
|(UINT32)((UINT32) 0U << 13U)/*开始条件-仅主机模式*/
|(uint32)((uint32) 1U <<11U)/*停止条件*/
|(UINT32)((UINT32) 1U <<10U)/*主/从模式*/
|(uint32)((uint32) I2C_transmitter)/*发送器/接收器*/
|(UINT32)((UINT32) I2C_7BIT_AMODE)/* xpaned 地址*
|(uint32)((uint32) 0U << 7U)/*重复模式*/
|(uint32)((uint32) 0U << 6U)/*数字回送*/
|(uint32)((uint32) 0U << 4U)/*起始字节-仅主机*/
|(uint32)((uint32) 0U << 3U)/*免费数据格式*/
|(UINT32)((UINT32) I2C_8_BIT);/*位计数*

参照HALCoGen 的示例编写了i2c 读写接口,但是通讯的情况并不理想。μ A

i2cSetSlaveAdd()的作用是什么?

能否提供更为详尽的i2c示例或者相关文档?μ A

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

    您好!

    通过 I2C、我们可以 将多个从器件连接到单个主器件、或者网络中可以有多个主器件和多个从器件。 因此、mI2C 消息中需要目标器件的 I2C 地址。

    I2C 消息被划分为 数据帧 。 每个 报文都有一个包含从器件二进制地址的地址帧、以及一个或多个包含正在传输的数据的数据帧。 该报文还包括 开始和停止条件、读取/写入位以及每个数据帧之间的 ACK/NACK 位。

    i2cSetSlaveAdd()函数用于告诉 I2C 控制器它将与之通信的器件的地址。  

    您的 I2C 通信有什么问题? 我可以了解更多详细信息吗?

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

    μ 首先,在No FDF 模式、  

    i2cREG1->MDR |=(uint32)(1 << 9 | 1 << 10);//发送和主控
    i2cREG1->MDR &=~(uint32)(1 << 15);// ACK

    i2cSetStop (i2cREG1);
    i2cSetCount (i2cREG1、1);
    i2cSetStart (i2cREG1);
    i2cSetSlaveAdd (i2cREG1、0x38);
    i2cSendByte (i2cREG1、0x70);

    while (!i2cIsTxReady (i2cREG1)); //一直在这里等待,STR 寄存器= 1406

    我按照上述的代码发送,start信号之后就会发slave address字段吗?发现没有address相应,并且i2C 波形不规范,成尖峰状,SCL这之后一致拉低 μ A

    我使用的是TMS570 LC4357 HDK 板子的B2 C3,i2c1,HDK3.3V 上拉10K电阻,你能帮我看一下可能存在的问题吗

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

    但是我把i2c速度从100khz,降到了10khz,相应的slave 地址波形正常输出了,i2c 100KHz 不能支持10K上拉电阻吗?

    另外,为什莫寻址没有得到ACK之后,SCL总线一直拉低 μ A

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="491887" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1034094/tms570lc4357-i2c/3823957 #3823957"]我按照上述的代码发送,start信号之后就会发slave address字段吗?[/quot]

    i2cSetSlaveAdd (i2cREG1、0x38);应在 i2cSetStart()之前调用。

     i2cSetStart()将发送起始位、从器件地址。  

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

    但是我把i2c速度从100khz,降到了10khz,相应的slave 地址波形正常输出了,i2c 100KHz 不能支持10K上拉电阻吗?

    另外,为什莫寻址没有得到ACK之后,SCL总线一直拉低 μ A

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

    您好!

    最大上拉电阻受总线电容(CB)限制。 I2C 总线的最大电容为400pF、在 I2C 规范中指定。  HDK 和 I2C 引脚上的 I2C 信号布线具有 较小的电容。 具有接地平面和电源平面的 PCB 上的电路走线约为1~3 pF/in、低电容电缆约为20−30pF/ft 导体来屏蔽。 我假设 I2C 线的总电容器(clk 和 data)为200pF。  

    最大上拉电阻是最大上升时间(TR)的函数:

    RP (最大值)= TR/(0.8473*CB)  

    对于标准 I2C 模式(100KHz)、最长上升时间为1us (I2CLK 脉宽的1/5):

    RP (max)= 1us/(0.8473*200pF)= 5.9k Ω。

    I2C 负载电容越大、Rp 就越小。  

    如果上拉电阻过大、信号可能会变得太慢而无法达到高电平和低电平。  在 kΩ 中、从4.7 μ F 电流开始、然后使用示波器查看 I2C 信号;如果上升沿舍入过多、则需要使用较小的电阻器。  

    https://www.ti.com/lit/an/slva689/slva689.pdf

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

    该问题已经得到解决,出错的原因有两点,一个是阻值太大,改用4.7K,还有是外接i2c设备需要使用阻值小的单芯线,而不是普通的杜邦线,以避免线路阻值的影响 μ A