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.

[参考译文] TMS320F28386D:IIC

Guru**** 2457760 points
Other Parts Discussed in Thread: TMS320F28386D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1236823/tms320f28386d-iic

器件型号:TMS320F28386D

以下是正常的 IIC 交易。

两次转换之间的延迟应为105ms。

但我面临的错误,有时它将启动写通信非常非常接近,这是不是预期.

哪种方式可导致此错误?  其他中断?

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

    您好!

    您使用什么来触发 I2C 通信?  您要使用什么配置来设置外设?

    [quote userid="554284" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1236823/tms320f28386d-iic 有时候它会非常非常接近地启动写通信

    您能否用接近的方式量化您的意思?

    此致、

    阿米尔·奥马尔

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

    通过调用以下函数周期来触发 I2C 通信

    void I2cWritePECMax20480_TmrDly(void)
    {
        uint32_t _uMDataBuf = 0;
        uint32_t _uMdev_id = 0;
        uint32_t _uMreg = 0;
        uint32_t _uMcrc_data_out = 0;
        uint32_t _uMcrc_data_in[3];
    
        _uMdev_id = 0x39;
        _uMreg = 0x28;
        _uMDataBuf = 0x08;
    
        _uMcrc_data_in[0] = ((_uMdev_id<<1) | 0x00);
        _uMcrc_data_in[1] = _uMreg;
        _uMcrc_data_in[2] = _uMDataBuf;
        _uMcrc_data_out = PEC_CRC(_uMcrc_data_in,3);
        //
        // Setup number of bytes to send msgBuffer and address
        //
        I2C_setDataCount(I2CB_BASE, 3);
        I2C_sendStopCondition(I2CB_BASE);
        //
        // Setup data to send
        //
        I2C_putData(I2CB_BASE, _uMreg);
        I2C_putData(I2CB_BASE, _uMDataBuf);
        I2C_putData(I2CB_BASE,_uMcrc_data_out);
        //
        // Send start as master transmitter
        //
        //I2C_setFIFOInterruptLevel(I2CB_BASE, I2C_FIFO_TX3, I2C_FIFO_RX16);
        I2C_setConfig(I2CB_BASE, I2C_MASTER_SEND_MODE);
        I2C_sendStartCondition(I2CB_BASE);
        //I2C_sendStopCondition(I2CB_BASE);
    
        DEVICE_DELAY_US(50000);
    
    }

    IIC 初始化低于

            I2C_disableModule(I2CB_BASE);
            //
            // I2C configuration. Use a 100kHz I2CCLK with a 33% duty cycle.
            //
            I2C_initMaster(I2CB_BASE, DEVICE_SYSCLK_FREQ, 100000, I2C_DUTYCYCLE_33);
            I2C_setConfig(I2CB_BASE, I2C_MASTER_SEND_MODE);
            I2C_setSlaveAddress(I2CB_BASE, 0x0039);
            I2C_disableLoopback(I2CB_BASE);
            I2C_setBitCount(I2CB_BASE, I2C_BITCOUNT_8);
            I2C_setAddressMode(I2CB_BASE, I2C_ADDR_MODE_7BITS);
            //
            // FIFO configuration
            //
            I2C_enableFIFO(I2CB_BASE);
            //
            // Enable stop condition and register-access-ready interrupts
            //
            I2C_enableInterrupt(I2CB_BASE, I2C_INT_STOP_CONDITION |
                                           I2C_INT_REG_ACCESS_RDY);
            I2C_clearInterruptStatus(I2CB_BASE, I2C_INT_ADDR_SLAVE | I2C_INT_ARB_LOST | I2C_INT_NO_ACK | I2C_INT_STOP_CONDITION);
    
            I2C_setFIFOInterruptLevel(I2CB_BASE, I2C_FIFO_TX3, I2C_FIFO_RX16);
            I2C_setEmulationMode(I2CB_BASE, I2C_EMULATION_FREE_RUN);
    
            //
            // Configuration complete. Enable the module.
            //
            I2C_enableModule(I2CB_BASE);

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

    器件型号:TMS320F28386D

    当在 CPU2中添加 I2CB 时、 有时会显示 NACK 发生。

    我想知道 NACK 发生的根本原因。

    我应检查哪些寄存器来确认根本原因?

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

    第二张图片是进入 I2CB  NACK 中断时的快照

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

    您好!

    我将要求我们的设计团队看看这是否有特定的原因。 我会在一周结束时告诉你他们是否有一个可靠的答案。

    此致、

    阿米尔·奥马尔

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

    器件型号:TMS320F28386D

    一条 I2C 总线只有一个主器件和一个从器件。

    我想确认以下图片的信息。

    第二个 ACK ((No-) Acknowledgement 位来自 接收器)、此接收器是否意味着主器件?

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

    您好!

    几个问题:

    1. 在您的第一个代码片段的第21行、您为什么发送停止条件
    2. 您可以向我发送在发生这种额外写入时为 I2C 设置的状态位吗?

    我正在尝试将您的代码与 图33-7进行比较。 I2C 主设备 TX/RX 流程图为您提供了有关如何将 I2C 用作控制器的通用指南。

    此致、

    阿米尔·奥马尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 在您的第一个代码片段的第21行、您为什么发送停止条件
    • 您可以向我发送在发生这种额外写入时为 I2C 设置的状态位吗?
    [/报价]

    由于引用了 TI 的示例、我发送了一个停止条件。 I2C_ex4_EEPROM_Polling。 此停止是否会导致意外情况?

    我使用逻辑分析仪捕获了额外的写入、如果需要状态位、我将添加中断来捕获这个额外的写入。

    哪个中断可以捕获此错误?  我需要此信息来启用 I2C 中断。 如下所示。

    I2C_enableInterrupt (I2CB_BASE、I2C_INT_STOP_Condition |
    I2C_INT_REG_ACCESS_RDY);

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

    另一个重要信息是、在 CPU2中 、有一个90KHz 的 ADC 中断、需要4-5us。  

    我已尝试禁用该中断、不会发生 I2C 错误。

    但在这个中断中、I2C 什么都不使用。 我没有发现与它们有任何联系。

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

    您好!

    我注意到您正在创建许多与 I2C 相同主题的线程。 请尝试将所有类似问题保存在一个主题中(如果需要、请花点时间编译并列出您在发布之前遇到的问题、而不是将每个问题发布为单独的主题)。 到目前为止、看起来 您已经创建了一些与 I2C 相关的线程。 这使得很难跟踪和尝试回答您的问题。

    我将继续并合并这些内容、 尝试回答您的问题。 请避免在将来执行此操作。

    此致、

    阿米尔·奥马尔

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

    您好!

    第二个 ACK ((No-)接收方的确认位), 此接收器是否表示主接收器?

    图片讨论的是 I2C 数据传输、因此我认为接收器是 F2838x 外部的目标器件。 但是、我认为这可以适用于任何一种方式; F2838x 或外部 I2C 器件可以是接收器、因为您可以有一个控制器或目标作为接收器。

    由于参考了 TI 的示例,我发送了一个停止条件。 I2C_ex4_EEPROM_Polling。 此停止是否会导致意外结果?

    我查看了这个示例、但 在函数中没有看到此类流程。 您能指出您专门从哪个函数复制吗? 在我查看的寄存器中、似乎在通信结束时发送了停止条件、而您的代码在发送启动条件之前设置了停止条件。

    哪种中断可以捕获此错误?

    我知道、对于这种类型的错误、没有特定的中断。 您可以在每次 I2C 通信结束时只将状态位读取到变量中 、并在那里有断点;当逻辑分析仪显示发生了额外的写入时、查看变量的值。

    、但在这个中断中、I2C 什么也没有。 我没有找到与它们的任何连接。

    I2C 是 处于中断还是只是正常函数? 您刚才引用的基于代码的示例没有中断、它仅使用轮询、因此这在具有可能主动中断 I2C 通信的中断的程序中可能并不理想。

    此致、

    阿米尔·奥马尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此图像讨论的是 I2C 数据传输,因此我相信接收器是 F2838x 外部的目标器件。 但是、我认为这可以适用于任何一种方式; F2838x 或外部 I2C 器件可以是接收器、因为您可以有一个控制器或一个目标是接收器。

    明白了意思。 谢谢。

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

    Omer Amir 说:

    我查看了这个示例、但 在函数中没有看到此类流程。 您能指出您专门从哪个函数复制吗? 在我查看的寄存器中、似乎在通信结束时发送了停止条件、而您的代码在发送启动条件之前设置了停止条件。

    从 i2c_ex5_master_slave_interrupt

    uint16_t I2C_MasterTransmitter(struct I2CHandle *I2C_Params)
    {
        uint16_t status;
    
        uint32_t base = I2C_Params->base;
    
        I2C_Params->numofSixteenByte  = (I2C_Params->NumOfDataBytes) / I2C_FIFO_LEVEL;
        I2C_Params->remainingBytes    = (I2C_Params->NumOfDataBytes) % I2C_FIFO_LEVEL;
    
        ASSERT(I2C_Params->NumOfDataBytes <= MAX_BUFFER_SIZE);
    
        I2C_enableFIFO(base);
    
        status = I2C_TransmitSlaveAddress_ControlBytes(I2C_Params);
    
        if(status)
        {
            return status;
        }
    
        I2C_setDataCount(base, (I2C_Params->NumOfAddrBytes + I2C_Params->NumOfDataBytes));
        I2C_sendStopCondition(base);
    
        I2C_setFIFOInterruptLevel(base, I2C_FIFO_TXEMPTY, I2C_FIFO_RXFULL);
    
        I2C_enableInterrupt(base, (I2C_INT_STOP_CONDITION | I2C_INT_ARB_LOST | I2C_INT_NO_ACK));
        I2C_enableInterrupt(base, I2C_INT_TXFF);
    
        I2C_clearInterruptStatus(base, I2C_INT_TXFF);
    
        return SUCCESS;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I2C 是 中断还是只是正常函数? 您引用的基于代码的示例没有中断、它仅使用轮询、因此这在具有可能主动中断 I2C 通信的中断的程序中可能并不理想。

    我们使用轮询模式。 因为在 OUT 项目中禁止了额外的中断。 (定义了项目 SW 架构)

    我们想知道 90KHZ ADC 中断 是如何影响 I2C 通信的,它是否会使它失去功能?  如何实现?

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

    我们发现根本原因是、当有 ADC 中断并继续调用以下代码时、会导致错误。

    I2C_sendStartCondition (I2CB_BASE);

    I2C_sendStopCondition (I2CB_BASE);

    我们可以通过以下代码重现错误、添加以下两个错误之间的1us 延迟  

    I2C_sendStartCondition (I2CB_BASE);

    I2C_sendStopCondition (I2CB_BASE);

    void I2cWritePECMax20480_TmrDly(void)
    {
        uint32_t _uMDataBuf = 0;
        uint32_t _uMdev_id = 0;
        uint32_t _uMreg = 0;
        uint32_t _uMcrc_data_out = 0;
        uint32_t _uMcrc_data_in[3];
    
        _uMdev_id = 0x39;
        _uMreg = 0x28;
        _uMDataBuf = 0x08;
    
        _uMcrc_data_in[0] = ((_uMdev_id<<1) | 0x00);
        _uMcrc_data_in[1] = _uMreg;
        _uMcrc_data_in[2] = _uMDataBuf;
        _uMcrc_data_out = PEC_CRC(_uMcrc_data_in,3);
        //
        // Setup number of bytes to send msgBuffer and address
        //
        I2C_setDataCount(I2CB_BASE, 3);
        //
        // Setup data to send
        //
        I2C_putData(I2CB_BASE, _uMreg);
        I2C_putData(I2CB_BASE, _uMDataBuf);
        I2C_putData(I2CB_BASE,_uMcrc_data_out);
        //
        // Send start as master transmitter
        //
        //I2C_setFIFOInterruptLevel(I2CB_BASE, I2C_FIFO_TX3, I2C_FIFO_RX16);
        I2C_setConfig(I2CB_BASE, I2C_MASTER_SEND_MODE);
        I2C_sendStartCondition(I2CB_BASE);
        DINT;
        DRTM;
        DELAY_US(1);
        I2C_sendStopCondition(I2CB_BASE);
    
        DEVICE_DELAY_US(50000);
    
    }

    我们尝试将  I2C_sendStartCondition 和 I2C_sendStopCondition 合并 为一个代码。

    它会解决问题并修复错误。

    HWREGH (I2CB_BASE + I2C_O_MDR)|=(I2C_MDR_STT |I2C_MDR_STP);

    如果 TI 的任何专家能够帮助您讨论这一点、我们将不胜感激。

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

    您好!

    当在 CPU2中添加 I2CB 时、 有时会显示 NACK 发生。

    我想知道 NACK 发生的根本原因。

    我应检查哪些寄存器来确认根本原因?

    [/报价]

    好像您正在尝试在控制器发送器模式下使用 I2C 并从目标器件接收 NACK。 似乎目标 I2C 器件正在处理已发送的信息并阻止 F2837xD I2C 发送更多数据字节。 这是预期的行为、而不是器件错误。 NACK 信号来自 I2C 目标器件、因此、您需要查看所连接的 I2C 目标器件、而不是 F2837xD 器件。

    来自 i2c_ex5_master_slave_interrupt

    您引用的代码片段在停止条件之后不会发送任何启动条件、 看起来此函数 专门用于将器件配置为控制器发送器、实际上并没有在该函数内发送任何内容。

    我们想知道 90KHZ ADC 中断是如何 影响 I2C 通信的,它会不会使它变得不可用?  如何?

    您需要配置一些输出切换或观察变量以进行确认、但 ADC 中断会中断 I2C 通信并导致一些不同的行为。 我不知道 设计中具体是如何实现的、但根据其声音、如果您在使用轮询 I2C 时不使用中断、则没有问题。 我将与一些 中断专家确认、看看他们是否更了解这一点、但现在您 可以确认这是否是正在发生的情况。

    如果来自 TI 的任何专家可以帮助交谈,我们不胜感激。

    这是一个与先前的问题不同的问题吗? 如果是、您能否说明实际问题是什么? 我不确定我是否理解你的最新帖子。

    此致、

    阿米尔·奥马尔

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们可以通过以下代码重现错误,在[/报价]之间添加1us 延迟

    这正是我希望 TI 专家能够确认的

    我们尝试将  I2C_sendStartCondition 和 I2C_sendStopCondition 合并 为一个代码。

    它会解决问题并修复错误。

    HWREGH (I2CB_BASE + I2C_O_MDR)|=(I2C_MDR_STT |I2C_MDR_STP);

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

    错误在于额外的写入 命令。 它受 ADC 中断影响。

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

    您好!

    我以前没有听说过客户有此类问题。 我将尝试与其他一些专家取得联系、了解为什么会因为存在 ADC 中断而发送另一个目标地址、并在明天与您联系。

    此致、

    阿米尔·奥马尔

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

    您好!

    您需要在发送起始条件时查找代码(通过直接修改寄存器或使用 driverlib 函数)。  I2C 只发送另一个启动条件、因为在传输过程中的某个位置会发送另一个启动条件。 如果您只有一个开始条件被发送、那么您可以读取 I2CSTR 寄存器中的总线忙位、看看当您准备发送另一个开始条件时它是否仍在传输过程中。

    此致、

    阿米尔·奥马尔

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

    我很确定没有发送其他启动条件。

    此 I2CB 只有一个主器件 F28386和一个从器件。

    我将复制的错误步骤放在上面。

    使用 I2C 轮询模式和其他中断的某个人可能具有相同的错误。

    希望这将有所帮助。

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

    您好!

    我很确定没有其他启动条件发送。

    请仔细检查、 您也可以读取 I2CSTR 寄存器中的总线繁忙位、查看当您即将发送另一个启动条件时它是否仍在传输过程中。

    我将复制的错误步骤放在上面。

    使用 I2C 轮询模式和其他中断的某个人可能具有相同的错误。

    [/报价]

    任何其他客户均未报告此问题、因此不存在已知问题/修复。 您需要自行完成一些工作、以验证是否以某种方式发送了另一个启动、或者 您的代码是否在前一次传输的中间发送了另一个启动条件。

    此致、

    阿米尔·奥马尔