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.

[参考译文] TMS320F28335:I2C 从器件(将 SDAA 和 SCLA 保持在低电平)

Guru**** 2609895 points
Other Parts Discussed in Thread: C2000WARE, CONTROLSUITE, TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/683167/tms320f28335-i2c-slave-holding-sdaa-and-scla-low

器件型号:TMS320F28335
Thread 中讨论的其他器件:C2000WAREcontrolSUITE

将 MCU 设置为 I2C 从设备时出现问题。  我看到、在 I2CMDR 内设置 IRS=1时、SDA 和 SCK 线路被拉至接地。  我希望它们上拉至3.3V、因为器件是一个不进行通信的从器件。  当我设置为可能丢失的从器件时、是否需要执行一些特殊操作?

下面是我要执行的步骤

设置 EALLOW

在 I2C 线路上启用内部上拉电阻(也尝试禁用)

为 SCLA 和 SDAA 设置多路复用器

为引脚设置异步定性

启用外设时钟

恢复 EALLOW

复位 I2C 模块。

设置 I2C 模块时钟

设置我们自己的地址

复位并启用 TX FIFO

复位并启用 RX FIFO

设置 I2CINT2A 的中断处理程序

设置 I2C 中断-使用 FIFO 模式禁用

清除状态标志。

取消复位(IRS=1)并将总线置于空闲模式

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

    正确的做法是、I2C 应在不受总线控制的"空闲"模式下从复位状态中唤醒、尤其是在处于从模式时。 当您启用 I2C (设置 IRS = 1)时、是否设置了任何状态位或中断标志? 您可以共享 I2C 配置代码吗?

    请看一下 C2000ware 中的 I2C 示例。 这为 I2C 的运行提供了必要的配置设置。 尽管它是为主设备设置的、但配置的其余部分是等效的。

    谢谢、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*初始化 I2C 从设备外设*/
    void F28335_I2C_InitSlave (uint8_t slave_addr、/*Ftn_PTR_I2C_TX_t TX_fifo_callback、*/ Ftn_PTR_I2C_Rx_t Rx_fifo_callback)

    //启用 I2C 外设 I/O 引脚和 I2C 时钟。
    uint16_t foreEALLOW = CPU_SetEALLOW ();
    // GPIO_32_33 (GPIO32、GPIO33)
    //将 GPIO32 & GPIO33设置为禁用内部上拉电阻
    //位0和1
    PTR_GPIO_B_CTRL_REG->GPxPUDew |= 0x00000003;
    //清除 GPIO32和 GPIO33以启用内部上拉
    //PTR_GPIO_B_CTRL_REG->GPxPUDew &&~0x00000003;

    //为 SCLA 和 SDAA 设置 GPIO32和 GPIO33
    //位0-4 (每个两个)
    PTR_GPIO_B_CTRL_REG->GPxMUX1ew &&~0x0000000F;
    PTR_GPIO_B_CTRL_REG->GPxMUX1ew |= 0x00000005;

    //将 GPIO32 & GPIO33设置为异步限定
    //位0-4 (每个两个)
    PTR_GPIO_B_CTRL_REG->GPxQSEL1ew |= 0x0000000F;

    //启用外设时钟
    PCLKCR0ew |= I2CAENCLK;

    CPU_RestoreEALLOW (前推 EALLOW);

    //重置 I2C 模块。
    //注意:必须保持复位(IRS=0)直到配置完成。
    I2CMDR = I2C_HOLD_RESET;

    //设置 I2C 模块时钟。
    I2CPSC = 14;

    //设置时钟高和低脉冲宽度。
    I2CCLKL=7;
    I2CCLKH = 8;

    //设置我们自己的地址
    I2COAR = slave_addr;

    //重置并启用 TX FIFO。 使用其中断
    I2CFFTX = TXFFINTCLR;
    I2CFFTX = I2CFFEN /*| TXFFRST | TXFFIENA | TXFFIL_TRIP*/;

    //复位和启用 RX FIFO。
    I2CFFRx = RXFFINTCLR;
    I2CFFRX = RXFFRST | RXFFIENA | RXFFIL_TRIP;

    //设置 I2CINT2A 的中断处理程序
    PIE:SetVector_Noos (I2CINT2_vector、I2CINT2_Group、I2CINT2_BIT、&F28335_I2C_FIFO_ISR);
    /*TX_CALLM= TX_Fifo_callback;*/
    RX_CALLACK = RX_Fifo_callback;

    //设置 I2C 中断-使用 FIFO 模式禁用。
    I2CIER = 0;

    //清除状态标志。
    I2CSTR = I2CSTR_CLEAR_FLAGS;

    //完成,删除复位(IRS=1)并将总线置于空闲模式。
    I2CMDR = I2C_BUS_IDLE;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是执行最后一个 I2CMDR 行之前的屏幕捕获

    下面是单步执行 I2CMDR 线路后的屏幕电容

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您似乎在 I2C 上启用了数字回送(I2CMDR 的位6)。 由于您连接到了外部器件和从器件、这毫无意义。 我不认为这是您问题的根源、但稍后肯定会导致一些问题。

    您可以在 C2000Ware 中试用该示例吗? 您只需将配置更改为从接收器、而不是主发送器。 您可以将配置与该示例进行比较。

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

    I2CMDR 设置为0x4020。  这设置了位14和05 (基于0)。  这些是 FREE 位和 IRS 位;它们应该是如何启用它的。

    我介绍了 controlSUITE。  对于28335、我没有看到任何 I2C 从设备示例、只是主设备示例。  但是、我的初始化与在这里完成的操作非常一致、只是我没有打开主位。  我确实注意到 controlSUITE 在使 I2C 退出复位状态后确实启用了 TX\RX FIFO。  不过,我不会认为这是罪魁祸首。

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

    谢谢、是的、这是我提到位6的错误...

    您可以压缩并共享您的项目吗? 我以前从未听说过这种情况、这是一款非常旧的器件、因此我要说、这可能与您的设置中的某些内容相关、但我想亲自尝试一下。

    您是否有另一个器件连接到 I2C 总线? 您是否正在使用定制硬件?

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

    可能无法确定 zip 文件、但 Init 代码位于此处。  它有权使这一问题产生。  我有时看到状态寄存器中的从发送器位出现、这是意外的、因为它没有在设置该从发送器位之前就已经接收到数据的函数中达到一个断点。  当被配置为未知的从器件时、我开始担心芯片有一些问题。  也许这是我遇到的一个独特的情形。

    主 I2C 只是另一个 TMS320F28335电路板。  一个是主器件、另一个是从器件。

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

    今天或明天、我将尝试抽出一些时间、在硬件方面对此进行研究。

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

    实际上、我看到的问题是、只需将示波器连接到从器件、即使在环路中也没有主器件。  当我将主器件置于循环中时、开始发生奇怪的事情、我猜是因为从器件无限期地将线路拉低。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 我今天也无法做到这一点。 希望到星期一、我可以进行一些实践测试

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

    是否进行了运气测试?

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

    这是一个繁忙的星期。 我肯定会为明天做一些测试、把板放在我旁边、并有一些时间深入研究。

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

    我在工作台上完全复制了 IRS 前/后启用寄存器设置、但看不到您的行为。 线路上是否有外部上拉电阻器? 您的上拉电阻值是多少。
    当我强制其中一条线路为0时、我确实看到总线忙位被置位。 在我看来、可能已经有一些东西将线路拉低了。
    在设置 IRS 时、您是否可以共享 i2c 信号的示波器图像? 将另一个 GPIO 配置为触发器、并在将 IRS 设置为1之前直接切换。 我很好奇地想知道迹线上是否还有其他事情发生。

    您自己是否完成了任何其他调试步骤?


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

    我在 F28379D 中添加了一个简单的主/从外部回送示例、C 文件链接在以下位置: e2e.ti.com/.../2533996

    该代码执行主器件 TX、主器件 RX、从器件 RX 和从器件 TX。 它非常简单、不使用中断或错误检查、但是一个很好的起点。

    -Mark