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.

[参考译文] CCS/TMS570LC4357:i2cReceive()问题

Guru**** 1788580 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/565704/ccs-tms570lc4357-i2creceive-issue

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

工具/软件:Code Composer Studio

大家好、

我正在尝试为 tms570lc43 MCU 构建基于中断的 i2c 接收器应用。 我在接收数据时正与一种奇怪的行为作斗争。 我在中断模式下使用 i2c 模块、7位地址、8位数据、无 FDF、接收器模式、 “忽略 NACK”选项集,hL_i2c.c 驱动程序。

只有当传输了2个数据字节(R/W = 0时、1个字节 i2c 从器件地址、1个字节寄存器地址、1个数据字节和 len = 2时调用 i2CReceive())时、我才能成功完成数据传输。 如果我尝试传输2个以上的字节(len>2),则一切都将失败。

通过观察示波器上的信号、我可以清楚地看到、在接收到第二个字节后、SCL 线路被 I2C 接收器模块无限期地连接到"0"、传输肯定不会成功。 接收器似乎强制停止传输和某一点、但我无法确定发生的位置和方式。

是否有人遇到过相同的问题? 相反、是否有人在其 TMS570 i2c 从应用中成功接收到超过2个字节?

我无法确定可以推断这种阻塞条件的完整机制。 我尝试将 i2c 接收器 SCL 线路配置为输入(Halcogen)、以排除它将线路设置为"0"的机会、但它没有任何效果(为什么不呢?)  有人对此有什么提示吗?

我花了很长的时间来调查这个问题。 我将更改我的项目设置、以保持这一2个数据字节传输的限制、尽管这非常令人沮丧。 如果有人愿意、我会非常感谢

有线索可以帮助我了解如何向前迈进。

非常感谢您的参与。

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

    您能否提供有关"一切失败"的更多详细信息? 您提到您正在使用中断模式。 您是否正确接收到用于2字节传输的中断? 您能否确定是 MCU 还是从器件将 SCL 驱动为低电平? I2C 的一个关键属性是线路只被驱动为低电平、而转换为高电平则通过外部上拉电阻器来处理、这样就可以保持时序。 即、I2C 线路通常为开漏、因此从器件可能会将 SCL 信号驱动为低电平。 如果是这种情况、那么您需要确定总线从端发生了什么错误。 这意味着、正确的寄存器是否被写入、数据是否有效、数据是否导致从器件进入某种安全状态?

    通常、对于 I2C 开发、最好是开发与未知从器件分开的 I2C 应用/驱动器。 我的意思是、连接之前使用过的器件可能会有所帮助、这样您就知道地址和数据是有效的。 这将有助于确定问题是在 MCU 上的源代码还是在从器件中。

    此外、如果您可以发布一些代码片段、甚至是简化的项目文件、我们可以查看它、看看我们是否可以帮助确定您的代码中是否存在任何问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、
    我可以正确接收和处理2个字节传输的中断。 我在2字节传输中看到的唯一问题是、在最后一个 SCL 下降沿之后、SCL 被强制为低电平100 - 200us。 以下传输不成功、只有 CPU 复位后的第一个传输工作正常。

    我使用的是 TMS570 HDK 安全 MCU 套件。 I2C1用作主发送器 I2C 模块(轮询模式)、I2C1用作从接收器(中断模式)。 我使用两根飞线连接 SCL 和 SDA (电路板上安装了上拉电阻)。
    断线的 Trasmission 在传输中的每个字节数都是正确的。

    我确定从器件将 SCL 驱动为低电平、并使用示波器对其进行了验证。

    以下是我的应用程序(从接收器部分)的一些代码段:

    / /
    #define MAX_PAR_NUM 1.

    char buffer [ MAX_PAR_NUM +1]

    void mylave_init (void){
    i2cSetMode (I2CREG2、I2C_SLAVE);
    i2cSetDirection (I2CREG2、I2C_RECEIVER);
    i2cSetOwnADD (I2CREG2、CCI.i2cadd);

    i2cEnableNotification (I2CREG2、I2C_RX_INT | I2C_SCD_INT | I2C_AAS_INT);
    i2cReceive (I2CREG2、MAX_PAR_NUM+1、buffer);



    / /
    void be_CCI_ISR (int flags){

    if (flags & I2C_SCD_INT){
    printf ("I2C 停止条件已检测到\n");//仅用于调试,将被删除
    i2cClearSCD (I2CREG2);


    if (flags & I2C_AAS_INT){
    printf ("I2C 此从设备添加 det。\n");//仅用于调试,将被删除


    if (flags & I2C_RX_INT){
    printf ("I2C received cmd %02Xh ->(%02Xh)\n"、buffer[0]
    ,buffer[1]);//仅用于调试,将被删除
    i2cReceive (CCI.i2c、MAX_PAR_NUM+1、buffer);




    / /

    并从"HL_notification.c"中:

    / /
    /*用户代码开始(11)*/
    extern void be_CCI_ISR (int 标志);
    /*用户代码结束*/
    #pragma weak (i2c 通知)
    void i2cNotification (i2cBASE-t * i2c、uint32标志)

    /*在用户代码开始和用户代码结束之间输入用户代码。 *
    /*用户代码开始(24)*/
    BE_CCI_ISR ((int)标志);
    /*用户代码结束*/

    / /

    i2cInit()在 main()中调用。

    MAX_PAR_NUM =1转换为2字节数据传输+ R/W 位设置为"0"(总共3字节)的初始 I2C 从器件地址。

    printf()对该问题没有任何影响。 即使 printf 已被删除、问题仍然存在。

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

    感谢您发布附加信息。 我将更详细地了解这一点、看看我是否能够发现问题的来源并与您一起返回。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Massimo、您好!

    我对迟迟未能回复您这一帖子深表歉意。 查看提供的代码摘录、您似乎在发送所有数据之前再次调用 I2CReceive。 这将导致接收被截断。 应通过检查 BUSY 位来控制对 I2CReceive 函数的调用、以确保 I2C 模块不在另一次传输的中间。

    此外、您还可以看看 HalCoGen 随附的 I2C 示例。 有几个非常好的代码示例、涵盖 I2C 从设备或主设备 Tx/Rx、处于中断模式的 I2C 或处于轮询模式的常规 I2C 通信。 要查看示例,请依次单击"Help"->"Examples"并导航至 TMS570LC43x 目录,以查看可用的不同"c"示例。

    您可能还需要考虑在环回模式下测试代码、以确保每个组件都在自行运行。 这些示例介绍了如何将模块置于回送模式以进行测试/早期开发。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chuck:

    我非常感谢您的帮助。 同时、我决定将该项目的接口更改为 SPI。 总之、我将应用您的提示并尝试修复 I2C 接口的应用。  我总是渴望了解代码或项目示例、但总是在寻找这些示例。 请为我提供一些相关链接吗?

    非常感谢你的帮助。 我很快会回来更新。 此致、Massimo。

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

    这些示例包含在 HalCoGen 中并安装在 HalCoGen 目录下。 在使用 HalCoGen 内的帮助菜单之前或者通过使用一个文件浏览器窗口直接浏览到它们之前、你可以像我提到的那样访问它们。 如果您使用 Halcogen 的默认安装位置、它们将位于以下位置:C:\ti\Hercules \HALCoGen\v04.06.00\examples、说明 HalCoGen 版本目录可能会因您使用的版本而异。