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.

[参考译文] TMS320F28027:I2C 从器件在接收数据两次后保持 SCL。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/867248/tms320f28027-i2c-slave-holds-the-scl-after-receiving-data-twice

器件型号:TMS320F28027
主题中讨论的其他器件:TMS320F28377S

您好!  

我想使用 I2C 在两个微控制器之间进行通信。 TMS320f28377S 是 I2C 主器件、TMS32f28027是 I2C 从器件。

2秒后、我从主器件交替发送两个不同的字节(0xAA 和0x66)。  

I2COAR = 0x52时、我已成功将从器件配置为 I2C。 我正在使用基本 I2C 中断来从主设备接收数据。 当数据进入 ISR 时、数据存储在 I2CDRR 寄存器的用户变量中。  这种情况发生在主器件的前两条命令中、然后 SCL 和 SDA 都永久保持低电平状态、主器件不发送任何内容。  我在示波器上观察到了这一点。

因此、从器件似乎无法释放 SCL 或无法发送 ACK。

如果我在接收到数据后使 IRS = 0、这将使 I2C 模块复位、那么主器件将继续发送从器件地址、但从器件不响应。 我也在示波器上观察到了这一点。

请在这方面帮助我。  

谢谢、

Vrushali Pohekar-Jangam。

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

    您好、Vrushali、

    [引用 user="Vrushali Jangam"]2秒后、我将从主器件交替发送两个不同的字节(0xAA 和0x66)。  [/报价]

    您是否仅打算从主器件向从器件发送2个字节、然后停止再停止? 您是否正在配置主器件、以便在传输2个字节后发送停止命令? 为此、请参阅 I2CCNT 寄存器、即将其设置为2和 STP 位。

    您是否能够在示波器上捕获所传输的2个字节的波形? 如果是、您能否提供这些波形的屏幕截图? 我猜是从器件的 ACK 存在、但 SCL 和 SDA 信号保持低电平、因为主器件不会生成停止条件。

    最棒的

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kevin:
    I2CCNT = 1、因为我每次传输一个字节值、即0xAA 或0x66、其中包含从器件 ID。  
    我从主器件传输的数据如下所示、
    unsigned int Commcmd = 0xAA;
    unsigned int Relaycmd = 0x66;
    1. I2C_Transmit (0×52,&Commcmd ,sizeof (Commcmd));
    2. I2C_Transmit (0×52,&Relaycmd ,sizeof (Relaycmd));
    当从器件接收数据时、它将被复制到 ISR 中的用户变量中。
    现在、当我观察从器件侧的实时调试时、我可以看到第一个0xAA 在 I2CDRR 中接收到、但在用户变量中没有被复制。
    当第二次主器件发送0x66时、0xAA 出现在写入 ISR 的用户变量中。
    之后、当主器件再次发送数据0xAA 时、I2CDRR 包含0x66值、但不会在用户变量中复制该值。 此时 BB = 1、AAS = 1、XSMT = 1。
    我正在附上屏幕截图。 我观察到主器件发送3次、然后 SCL 和 SDA 保持低电平。
    第一幅图像显示了主器件发送数据0xAA。
    第二 幅图像显示了主器件发送数据0x66。
    第三幅图像显示了通信线路何时保持低电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vrushali、

    [引用 user="Vrushali Jangam"]

    现在、当我观察从器件侧的实时调试时、我可以看到第一个0xAA 在 I2CDRR 中接收到、但在用户变量中没有被复制。
    当第二次主器件发送0x66时、0xAA 出现在写入 ISR 的用户变量中。
    之后、当主器件再次发送数据0xAA 时、I2CDRR 包含0x66值、但不会在用户变量中复制该值。 此时 BB = 1、AAS = 1、XSMT = 1。

    [/报价]

    基于此、I2C 中断可能在 ISR 结束时未被重新启用? 您应该在其末尾具有与以下内容类似的内容:

    //
    //启用未来的 I2C (PIE 组8)中断
    //
    PieCtrlRegs.PIEACX.ALL = PIEACK_group8; 

    在第3个字节和线路被保持在低电平之后、从器件上的 I2CSTR.RSFULL 寄存器位的状态是什么? 可能存在溢出、I2CDRR 未被正确读取。

    最棒的

    Kevin

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

    您好、先生、

    我已成功执行主发送器和从接收器部分。  从器件接收多个字节并将其存储在阵列中。

    我的下一个任务是实现主接收器和从发送器部分。  在本节中、我能够将读取查询发送到从器件。 从机接收查询并进入发送中断。 在这里、我可以看到从器件的发送缓冲区填满了我要发送的数据、但 SDA 线上没有任何数据。 相反、SDA 和 SCL 线路都保持低电平。 我观察了示波器上的波形、并观察到主器件发送从器件 ID、要读取的寄存器地址、然后 SDA 和 SCL 保持低电平。  

    请提供 I2C 从发送器和 I2C 从接收器的工作示例代码。

    谢谢、此致、

    Vrushali Jangam

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

    尊敬的 Kevin:

    今天、我观察到主器件正在发送从器件 id+read 命令、但在本例中、我的从器件不发送 ACK、因为从器件 ID 由于添加了读取命令位而发生更改。 我的 FDF 位在主设备和从设备中都为零。

    您能告诉我、哪个 SFR 标识了此读取命令吗?  我在从器件 ID 匹配中断后直接接收数据、即生成 AASINT。 我无法读取 I2CDRR 中的从器件 ID。

    谢谢、此致、

    Vrushali Jangam。

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

    您好、Vrushali、

    遗憾的是、我们现在没有可用的 I2C 主/从示例。

    [引用 user="Vrushali Jangam">今天我观察到主器件正在发送从器件 id+read 命令、但在这种情况下、我的从器件不发送 ACK、因为从器件 ID 由于添加了读取命令位而发生更改。 我的 FDF 位在主设备和从设备中均为零。

    您确定在第一个字节后看不到 ACK? 您能否在此处提供波形的屏幕截图?

    [引用 user="Vrushali Jangam">您能告诉我哪个 SFR 标识了此读取命令吗?  我在从器件 ID 匹配中断后直接接收数据、即生成 AASINT。 我无法读取 I2CDRR 中的从器件 ID。

    I2CDRR 中不存在从器件 ID、只有数据/命令字节会移入 I2CDRR。 如果您正在进入 AAS 中断 OK、则情况应该正常。 您可以共享 AAS int 代码吗?

    最棒的

    Kevin

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

    尊敬的 Kevin:

    主器件正在向从器件发送以下命令。

    启动条件

    从 ID

    寄存器地址

    重复启动

    从 ID +读取命令

    从器件的数据

    停止条件

    0x24

    0x20

    0x25

    0xAB

    当从机第一次收到读取命令时、从机发送0xAB、主机接收相同的结果。 我已经在调试观察窗口中检查了这个。 但这只是第一次发生。 下面是首次传输的波形图像。

    此外、请告诉我上图中红色突出显示部分的相关信息。

    下面是针对从器件的调试观察窗口的图像。

    以下是 i2c 从器件和 i2c 从器件 ISR 的初始化图像。

    1)从器件侧 I2C 的初始化:

    2) 2) I2C 从设备的 ISR:

    下面是主器件第二次发送读取命令但 SCL 和 SDA 保持低电平时的波形图。 在此波形中、您可以看到最后发送的器件是从器件 id+read 命令。

    谢谢、此致、

    Vrushali Jangam。

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

    您好、Vrushali、

    很难在最后一个波形中看到总线上发生的一切。 我无法分辨字节的起始/结束位置、因此很难查看是否存在 ACK。

    [引用 user="Vrushali Jangam"]此外,请告诉我有关上图中红色突出显示部分的信息。

    这是主器件或从器件、在字节传输/读取之间将总线保持在低电平。 可能是从器件。

    您在波形和代码中看到的最后一部分是主器件向从器件发送读取命令。 应输入 AAS 中断、然后从器件应开始传回、对吧?

    调试从代码和 I2C 寄存器发生这种情况后、代码是否会卡在某个位置、而永远不会进入传输部分? 您应该能够使用 CCS 中的断点主动调试它。

    最棒的

    Kevin