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.

[参考译文] TCA9555:无法向 TCA9555PWR 发送多个 I2C 数据

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1195423/tca9555-unable-to-send-multiple-i2c-data-to-tca9555pwr

器件型号:TCA9555
主题中讨论的其他器件:TM4C1292NCPDTTM4C123TCA6416

您好!

在原理图中、我将 通过 I2C 时钟和数据线 SCL 和 SDA 将 TM4C1292NCPDT 连接到 IO 扩展器 IC TCA9555PWR。  

我尝试运行以下代码、将3个地址行都设置为高电平、这意味着地址为0x27:

#include  

#include  

#include  

#include  "inc/hw_i2c.h"

#include  "inc/hw_memmap.h"

#include  "inc/hw_types.h"

#include  "inc/hw_gpio.h"

#include  "driverlib/i2c.h"

#include  "driverlib/sysctl.h"

#include  "driverlib/gpio.h"

#include  "driverlib/pin_map.h"

#include  "XDC/STD.h"

#include  

uint32_t g_ui32SysClock;

bool bDiInitialized = false;

 

#define  DI_SLAVEADDRESS         0x27

 

//初始化 I2C 模块0

空隙  InitI2C0 ( 空隙 )

  //启用 I2C 模块0

    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);

   //重置模块

    SysCtlPeripheralReset (SYSCTL_Periph_I2C0);

 

   //启用包含 I2C 0的 GPIO 外设

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

 

   //  为端口 B2和 B3上的 I2C0功能配置引脚多路复用。

    GPIOPinConfigure 寄存器 (GPIO_PB2_I2C0SCL);

    GPIOPinConfigure 寄存器 (GPIO_PB3_I2C0SDA);

 

   //为这些引脚选择 I2C 功能。

    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);

    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

 

   //启用并初始化 I2C0主机模块。  使用 I2C0模块的系统时钟。  最后一个参数设置 I2C 数据传输速率。

   //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率 设置为400kbps。

   //I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、true);//用于400kbps tm4c123

    I2CMasterInitExpClk (I2C0_BASE、   SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000)、true);//对于400kbps tm4c129

 

   //清除 I2C FIFO

   //HWREG (I2C0_BASE + I2C_O_FIFOCTL)= 80008000;

}

 

//I2C Send 函数

//向指定的从设备发送 I2C 命令

空隙  I2CSend (uint8_t slave_addr、uint8_t num_of_args、...)

   uint8_t i;

   //告诉主模块什么时候它会在总线上放置什么地址

   //正在与从器件通信。

    I2CMasterSlaveAddrSet (I2C0_BASE、slave_addr、false);

 

   //存储可变数量参数的列表

   va_list vargs;

 

   //指定 va_list 为"open"和最后一个固定参数 ,以便  vargs  知道开始查找的位置

   va_start (vargs、num_of_args);

 

   //将要发送的数据放入 FIFO 中

    I2CMasterDataPut (I2C0_BASE、va_arg (vargs、uint32_t));

   //如果只有一个参数,我们只需要使用 单个 send I2C 函数

    如果 (num_of_args == 1)

   {

       //开始从 MCU 发送数据

        I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);

       //等待 MCU 完成传输。

        while 循环 (!( I2CMasterBusy (I2C0_BASE)));

        while 循环 ( I2CMasterBusy (I2C0_BASE));

       //"关闭"变量参数列表

       va_end (vargs);

   }

   //否则,我们将在  I2C 总线上开始传输多个字节

    方案

   {

       //开始从 MCU 发送数据

        I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

       //等待 MCU 完成传输。

        while 循环 (!( I2CMasterBusy (I2C0_BASE)));

        while 循环 ( I2CMasterBusy (I2C0_BASE));

       //使用发送 num_of_args-2段数据

       //I2C 模块的 BURST_SEND_CONT 命令

        表示 (i = 1;i <(num_of_args - 1);i++)

       {   //将下一段数据放入 I2C FIFO 中

            I2CMasterDataPut (I2C0_BASE、va_arg (vargs、uint32_t));

           //发送刚放入 FIFO 的下一个数据

            I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);

           //等待 MCU 完成传输。

            while 循环 (!( I2CMasterBusy (I2C0_BASE)));

            while 循环 ( I2CMasterBusy (I2C0_BASE));

       }

       //将最后一段数据放入 I2C FIFO 中

        I2CMasterDataPut (I2C0_BASE、va_arg (vargs、uint32_t));

       //发送刚放入 FIFO 的下一个数据

        I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);

       //等待 MCU 完成传输。

        while 循环 (!( I2CMasterBusy (I2C0_BASE)));

        while 循环 ( I2CMasterBusy (I2C0_BASE));

       //"关闭"变量 参数 列表

       va_end (vargs);

   }}  

//通过 I2C 向指定的从设备发送一组数据

空隙  I2CSendString 的一个字符串 (uint32_t slave_addr、  特性  数组[])

{    //告诉主模块在 与从模块通信时它将在总线上放置的地址。

    I2CMasterSlaveAddrSet (I2C0_BASE、slave_addr、false);

    //将要发送的数据放入 FIFO 中

    I2CMasterDataPut (I2C0_BASE、array[0]);

    //如果只有一个参数,我们只需要使用

   //单次发送 I2C 函数

    如果 (array[1]=='\0')

   {

       //开始从 MCU 发送数据

        I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);

 

       //等待 MCU 完成传输。

        while 循环 (!( I2CMasterBusy (I2C0_BASE)));

        while 循环 ( I2CMasterBusy (I2C0_BASE));

   }

    //否则,我们将在  I2C 总线上开始传输多个字节

    方案

   {        //开始从 MCU 发送数据

        I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

        //等待 MCU 完成传输。

        while 循环 (!( I2CMasterBusy (I2C0_BASE)));

        while 循环 ( I2CMasterBusy (I2C0_BASE));

        //将索引初始化为数组

       uint8_t i = 1;

        //使用发送 num_of_args-2段数据

       //I2C 模块的 BURST_SEND_CONT 命令

        while 循环 (array[i + 1]!='\0')

       {        //将下一段数据放入 I2C FIFO 中

            I2CMasterDataPut (I2C0_BASE、array[I++]);

            //发送刚放入 FIFO 的下一个数据

            I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);

            //等待 MCU 完成传输。

            while 循环 (!( I2CMasterBusy (I2C0_BASE)));

            while 循环 ( I2CMasterBusy (I2C0_BASE));

       }

        //将最后一段数据放入 I2C FIFO 中

        I2CMasterDataPut (I2C0_BASE、array[i]);

        //发送刚放入 FIFO 的下一个数据

        I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);

        //等待 MCU 完成传输。

        while 循环 (!( I2CMasterBusy (I2C0_BASE)));

        while 循环 ( I2CMasterBusy (I2C0_BASE));

   }}   

 //I2C 接收功能

//在从器件上读取指定的寄存器

uint32_t  I2CReceive. (uint32_t slave_addr、uint8_t reg)

   //指定我们要向写入(寄存器地址)

   ///从设备

    I2CMasterSlaveAddrSet (I2C0_BASE、slave_addr、false);

   //指定要读取的寄存器

    I2CMasterDataPut (I2C0_BASE、reg);

   //向从器件发送控制字节和寄存器地址字节

    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

   //等待 MCU 完成事务

    while 循环 ( I2CMasterBusy (I2C0_BASE));

   //指定我们将从从属设备读取

    I2CMasterSlaveAddrSet (I2C0_BASE、slave_addr、true);

   //发送控制字节并从我们 指定的寄存器中读取

    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_RECEIVE);

   //等待 MCU 完成事务

    while 循环 (!( I2CMasterBusy (I2C0_BASE)));

    while 循环 ( I2CMasterBusy (I2C0_BASE));

   //返回从指定寄存器提取的数据

    返回  I2CMasterDataGet (I2C0_BASE);

}}  

空隙  主电源 ( 空隙 )

{    //将时钟设置为直接从外部晶体/振荡器运行。

  G_ui32SysClock =  SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |

                                      SYSCTL_OSC_MAIN |

                                      SYSCTL_USE_PLL |

                                      SYSCTL_CFG_VCO_480)、120000000);

  //初始化 I2C 模块0

 InitI2C0 ();

 I2CSend (DI_SLAVEADDRESS、3、0、0、0x01);

 I2CSend (DI_SLAVEADDRESS、3、0x06、0x01、0);//配置端口0

    while 循环 (1){};

}

 但从示波器捕获可以看出、只有单个 I2C 发送命令看起来无效、而不是多个命令。

我在 CCS 的调试模式下检查了状态寄存器 I2C0MCS。 DATACK 和 ERROR 位设为低电平。

每个使用的上拉电阻器为2K。 没有将 ACK 显示为低电平的范围能力。

所以、我这次只按照您的建议对从器件进行一次 I2C 写入、即  I2CSend (DI_SLAVEADDRESS、  0 0、0、0x01) 、但示波器捕获保持不变。

此外、我尝试了函数 I2CSend (DI_SLAVEADDRESS、 1、0、0、0x01) 来传输一位、示波器捕获如下所示

此外、我将使用 ADUM3151隔离器的 Launchpad 和 EV-Board 以及 IO-Expander EVM (设置如下所示)进行测试。 我将 通过隔离器从 Launchpad 向 IO 扩展器 EVM 提供 I2C SCL、SDA 信号。

对于 IO 扩展器、我使用从器件地址为0x27 (原理图的屏幕截图如下所示)、因为 EV 板中的所有三个地址线(引脚2、3、21)均已上拉(我们已替换 IC TCA6416并在评估板中焊接 TCA9555PWR)。

但从示波器捕获可以看出、只有单个 I2C 发送命令看起来无效、而不是多个命令。

请提供相同的指南。

此致、

Kiranjit

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

    Kiranjit,

    您的系统似乎没有任何 I2C 命令可以运行、甚至一个命令都无法运行、因为它会阻碍和停止进一步的通信。  

    您能帮助我了解时钟是如何生成的吗?

    时钟的位周期似乎不一致。  

    此外、这里标记的位:

    我们是否确信在时钟的这一上升沿、会对"1"计时? 它看起来非常接近 SDA 转换的边沿、很难判断是否读取了"0"或"1"。 对于标准模式速度(< 100kHz)、I2C 要求最短数据设置时间为250ns。 建立时间是在对数据进行采样之前、转换后 SDA 线上的数据达到稳定所需的最短时间。  

    如果该位被读取为"0"、当然、最后会得到错误的 I2C 地址。 也许可以尝试重新运行测试、但将 A2设为"0"、看看器件是否为 ACK。

    此致、

    泰勒

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

    您展示了三个捕获。

    在第一个波形中、SDA 线与 SCL 上的上升沿同时发生变化。 这是错误的、可能会被解释为停止条件。

    在第二和第三个波形中、SDA 线在上升沿表现出过冲。 这表明该引脚被配置为一个推挽输出、而不是像 I²C Ω 所要求的那样被配置为一个双向开漏引脚。 这产生了从机不能发送 ACK 位的影响。

    这就意味着 μ I²C 模块和管脚没有正确配置。 (我对 TM4C 一无所知。)

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

    您好、Tyler 和 Clemens、

    我尝试将 A2设置为"0"、因此将0x23指定为地址(请参阅示波器捕获)。  

    我的代码已附在上一篇文章中。 请建议如何通过此代码提供正确的设置时间?

    此外、我将 I2C0 (PB2、PB3)用于 CDE 中的 SCL 和 SDA、这是我在上拉至2k 后向 IO 扩展器提供的2条线路。

    请提供有关我需要以何种方式和何处进行更改的反馈。

    此致、

    Kiranjit

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

    该波形同时在 SCL 和 SDA 上具有一个上升沿、这是不允许的。 并且 SDA 引脚看起来未配置为开漏引脚(这意味着 GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3)调用不起作用)。

    我不知道 TM4C。 这应转到微控制器论坛。

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

    Kiranjit,

    我第二个在 SCL 的上升沿清除应答。

    请看红线、SCL 在边沿转换时对 SDA 进行采样、而不是对数据位进行50%的采样。 此处的时序有问题、这可能是 I2C 信令设置中的错误。  

    如果您需要更快的答案、我可以将该主题转到基于 TM4C ARM 的微控制器的微控制器论坛。 从编码的角度来看、它们可能拥有更多的支持。  

    我可以查看代码、并在 CST 明天下午5点之前获得回复。  

    此致、

    泰勒

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

    您好、Tyler:

    请查看您是否可以检查代码。

    我已经在微控制器论坛上发布了这个内容、但没有获得帮助。 请参阅以下链接:

    TM4C1292NCPDT:无法向 TCA9555PWR 发送多个 I2C 数据-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    也许如果你可以把它在你自己的语言的时间,然后请做

    我已将 SCL 和 SDA 都配置为开漏、并将它们上拉。

    谢谢。

    Kiran

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

    尊敬的 Kiran:

    这里是我对现在发生的事情的最佳猜测。 根据示波器捕获、看起来时钟的上升沿在数据线(SDA)的上升沿进行采样。 这不是 I2C 的工作方式。 时钟信号应该在数据位中采样大约50%、而不是在边沿上。 由于时钟信号在该位的边沿进行采样、因此它可能在输入"1"或"0"数据时存在不确定。  

    由于 SDA 在第9个时钟边沿上为高电平、因此示波器捕获会显示7位地址、后跟一个写入位、然后是一个 NACK。  

    这告诉我、目标/从器件无法识别 I2C 地址、可能是由于时序错误所致。

    我将尝试操作本应用报告的第8-9页  、并将其与您的代码进行比较。  

    https://www.ti.com/lit/an/spma073/spma073.pdf?ts=1676562493313&ref_url=https%253A%252F%252Fwww.google.com%252F

    您在上面定义了从器件地址:

    #define  DI_SLAVEADDRESS         0x27[/报价]

    但示波器捕获显示:

    0x27是您尝试发送的地址:0100111

    我们在范围0?00011中看到的情况

    无论"?" 为"1"或"0"。 我们发送的地址设备无法识别、我认为这是时序问题。 我认为错误不在 I2Csend 或 I2Creceive 命令中。 我认为在 init 函数中会发生该错误。

      //启用 I2C 模块0

        SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);

       //重置模块

        SysCtlPeripheralReset (SYSCTL_Periph_I2C0);

     

       //启用包含 I2C 0的 GPIO 外设

        SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

     

       //  为端口 B2和 B3上的 I2C0功能配置引脚多路复用。

        GPIOPinConfigure 寄存器 (GPIO_PB2_I2C0SCL);

        GPIOPinConfigure 寄存器 (GPIO_PB3_I2C0SDA);

     

       //为这些引脚选择 I2C 功能。

        GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);

        GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

     

       //启用并初始化 I2C0主机模块。  使用 I2C0模块的系统时钟。  最后一个参数设置 I2C 数据传输速率。

       //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率 设置为400kbps。

       //I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、true);//用于400kbps tm4c123

        I2CMasterInitExpClk (I2C0_BASE、   SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000)、true);//对于400kbps tm4c129

    [/报价]

    这部分代码。 您能否按照所附应用报告第9页的示例进行操作?

    首先设置系统时钟、然后停止时钟、复位、并启用 I2C 模块、然后等待外设设置:while (!SysCtl_Periph_I2C2);<-这不在您的代码中。  

    我还认为您的代码可能缺少 I2CMasterIntEnableEx 函数调用来使您的中断发生仲裁丢失、停止位、NACK 位、时钟低电平超时和数据的情况。 您是否可以尝试在 init 函数中调用此函数?

    此致、

    泰勒

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

    您好、Tyler:

    我在代码中进行了以下更改。

    请查看有关2k (100kHz 和400kHz)的 SDA 和 SCL 上拉的示波器捕获

    100kHz

    400kHz

    SDA 和 SCL 上拉电阻器 4k7 (分别为100kHz 和400kHz)的示波器捕获:

    100kHz

    400kHz

    请 分享您的反馈。

    此致、

    Kiran

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

    Kiran,

    您正在使用什么外部振荡器? 您是否可以将其替换为其他振荡器/晶体?  

    100kHz 的时钟信号似乎没问题。  

    400KHz 信号看起来是时钟信号中断并且不再一致的地方。 出于某种原因、某些脉冲似乎比其他脉冲更长。  

    您能否将上拉电阻从2k 更改为10kohm?  

    示波器捕获:

    I2C 总线仍发送错误地址。  

    0x27 = 0100111

    范围= 0100011

    我也不明白为什么总线在 NACK 和 ACK 之间中途。 由于器件接收到错误的 I2C 地址、因此示波器应显示完整的 NACK。  

    SDA 线看起来是推挽的、而不是开漏的、这可能是配置错误。  

    GPIOPinConfigure (GPIO_PL1_I2C2SCL);

    GPIOPinConfigure (GPIO_PL0_I2C2SDA);

    GPIOPinTypeI2C (GPIO_PORTL_BASE、GPIO_PIN_0);

    GPIOPinTypeI2CSCL (GPIO_PORTL_BASE、GPIO_PIN_1);

    您能否重新配置 I2C SDA 和 SCL 线路以首先配置、然后使用我提供的代码通过相应的 PORT_BASE 和 GPIO 引脚调整引脚类型?  (这来自 此处所附的文档第8页)

    如果这不起作用、请尝试将"A2"拉高、然后再次尝试重新发送命令。  

    让我们尝试使该系统以100kHz 的较慢速度工作。 如果我们可以让100kHz 工作、那么我们可以转到400kHz 的更快通信速度。

    此致、

    泰勒

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

    您好、Tyler:

    您正在使用什么外部振荡器? 您是否可以将其替换为其他振荡器/晶体?  

    >>  您指的是什么外部晶体、因为我们正在为微控制器 tm4c1292ncpdt (TI Launchpad)和 IO 扩展器 TCA9555pwr 使用评估板。 外部晶体已经置于板中。

    您能否将上拉电阻从2k 更改为10kohm?  

    >> 将上拉 电阻器更改为10k。

    I2C 总线仍发送错误地址。  

    0x27 = 0100111

    范围= 0100011

    >>  要发送的地址仅为0x23、而不是0x27。

    您能否重新配置 I2C SDA 和 SCL 线路以首先配置、然后使用我提供的代码通过相应的 PORT_BASE 和 GPIO 引脚调整引脚类型?   

    >> 请检查我是否按照您建议的方式配置了引脚。

    请参阅100kHz 频率的示波器捕获

    此致、

    Kiranjit

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

    请回应  

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

    Kiranjit,

    我的鸡巴在她的屁眼里滑了下来,拔出肉棒,插进她的屁眼里,让她大声尖叫。

    无视我关于外部振荡器的评论、出于某些原因、我认为您在设计中使用的是您自己的振荡器、而不是在 PCB 上实现的振荡器。  

    I2C 总线仍发送错误地址。  

    0x27 = 0100111

    范围= 0100011

    [/报价]

    您是否曾尝试过我在 TCA9555上外部设置 A2 =低电平的建议、以查看 I2C 控制器是否继续以正确的地址进行通信? VOL 的 ACK 位电压看起来也有点高。 这就是我建议采用较弱的上拉电阻器的原因、以查看驱动器是否可以将该电压推至更接近 GND。  

    代码中的更改与文档类似。 目前我能想到的唯一一件事就是查看我随附的 PDF 文件:

    https://www.ti.com/lit/an/spma073/spma073.pdf?ts=1676562493313&ref_url=https%253A%252F%252Fwww.google.com%252F

    并确保在代码中遵循每个步骤。  

    至于更多尝试事项:

    您是否可以在初始化 SysCtlPeripheralPresent (SYSCTL_Periph_GPIOB)后运行该命令来检查以确保返回"true"。 我要确保存在外设。  

    由于您的 init 函数看起来很可靠,我认为我们可以在 I2CSend()函数内的某个位置缩小问题的范围。 最初我认为设置中有问题、但现在我认为错误可能是在实际的事务中。  

    什么代码与该函数关联:  va_start ()?  

    I2CSend()函数的参数是什么?

    此致、

    泰勒

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

    您好!

    您是否曾尝试过我在 TCA9555上外部设置 A2 =低电平的建议、以查看 I2C 控制器是否继续以正确的地址进行通信? VOL 的 ACK 位电压看起来也有点高。 这就是我建议采用较弱的上拉电阻器的原因、以查看驱动器是否可以将该电压推至更接近 GND。  

    >>是的、我 从外部将 A2连接到了 GND。

    代码中的更改与文档类似。 目前我能想到的唯一一件事就是查看我随附的 PDF 文件:

    https://www.ti.com/lit/an/spma073/spma073.pdf?ts=1676562493313&ref_url=https%253A%252F%252Fwww.google.com%252F

    并确保在代码中遵循每个步骤。  

    >>在此 pdf 中、仅给出了示例代码的名称、而不给出实际代码、例如 ektm4c129_i2c_master_cpu_nofio、ektm4c129_i2c_master_cpu_fifo 等 这些示例代码是否有任何源代码文件?

    什么代码与该函数关联: va_start ()?  

    下面是"va_start"的定义

    I2CSend()函数的参数是什么?

    >> I2CSend 函数的定义为: void I2CSend (uint8_t slave_addr、uint8_t num_of_args、...)

    我要问的另一个问题是、我是否需要为 I2C 接收器添加中断、以便读取 I2C 接收到的 FIFO 是否已满?

    此致、

    Kiranjit

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

    Kiranjit,

    ]>本 pdf 中仅提供了示例代码的名称、而不提供实际代码、例如 ektm4c129_i2c_master_cpu_nonfio、ektm4c129_i2c_master_cpu_fifo 等 这些示例代码是否有任何源代码文件?

    TI 不提供这些器件的源代码。 我们的团队尚未为此器件生成任何代码。  

    虽然我们不提供代码、但我会尽力调试您遇到的代码、但请注意、帮助您的带宽是有限的。  

    TI 在此处提供 I2C_API 库:

    https://software-dl.ti.com/simplelink/esd/simplelink_msp432e4_sdk/2.30.00.14/docs/driverlib/msp432e4/html/group__i2c__api.html

    我认为这个库可用于 TM4C 系列。  

    Unknown 说:
    ]> I2CSend 函数的定义为: void I2CSend (uint8_t slave_addr、uint8_t num_of_args、...)

    我看到"uint8_tslave_addr、uint8_tnumof_args...) "但是、该函数调用中的其他参数是什么?

    另一个问题是我需要添加中断 以供 I2C 接收器读取是否接收到 I2C 的 FIFO 已满?

    中断(/INT)是由输入模式下端口输入的任何上升沿或下降沿生成的输出。 当 端口上的数据更改为原始设置或从生成中断的端口读取数据时、即可实现中断电路的复位。 复位发生在读取模式下的 ACK 位。  

    va_start 函数调用并不能真正告诉我任何信息。 我不知道这个调用来自哪里或者它对 I2Csend 函数做了什么。  

    是否可以在仅连接 TM4C 和 IO 扩展器而不连接 SPI 隔离器的情况下测试您的系统? 我不熟悉 ADUM3151、但该器件是否会导致 SDL/SCL 总线出现问题?  

    此致、

    泰勒

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

    您好、Tyler:

    是的、您是对的/看起来您对隔离器很正确。

    我在没有隔离器的情况下进行了检查、 结果如下。

    此外,我将代码更改为直接使用函数,在初始化之后直接在 main 内部发送数据,如下所示,这次没有使用函数 I2CSend()。

    InitI2C0 ();

    I2CMasterSlaveAddrSet (I2C0_BASE、DI_SLAVEADDRESS、FALSE);
    I2CMasterDataPut (I2C0_BASE、0x1);

    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);

    //开始从 MCU 发送数据

    //等待 MCU 完成传输。
    while (!(I2CMasterBusy (I2C0_base));
    while (I2CMasterBusy (I2C0_BASE));

    //I2CMasterDataPut (I2C0_BASE、g_ui8MasterTxData[g_ui8MasterBytes++]);

    while (1){};

    非常感谢您的帮助。

    我将再次进行检查、放置频率兼容隔离器。

    此致、

    Kiran

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

    尊敬的 Kiran:

    支持此问题的工程师目前不在。 他将在下周提供反馈(如需要)。 感谢您的耐心!


    此致、
    插孔  

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

    尊敬的 Kiran:

    在 main ()函数中编写代码而不是使用 I2CSend()是否对问题有任何积极影响? 我不明白这为什么会解决这个问题、因为代码几乎是相同的。  

    至于示波器捕获、I2C 信号看起来更糟。 您的系统是否具有良好的读写效果? 是否可以进行 I2C 通信?  

    是否有关于频率兼容隔离器的任何更新?  

    此致、

    泰勒

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

    您好、Tyler:

    在 main ()函数中编写代码而不是使用 I2CSend()是否对问题有任何积极影响? 我不明白这为什么会解决这个问题、因为代码几乎是相同的。  

    >>由于在 main ()函数中编写了代码,没有区别。

    至于示波器捕获、I2C 信号看起来更糟。 您的系统是否具有良好的读写效果? 是否可以进行 I2C 通信?  

    是否有关于频率兼容隔离器的任何更新?  

    >>是的、我们收到了新的隔离器 ADUM1250 EV-Board 并检查了输出。 以下是使用该隔离器在400kHz 频率下捕获的示波器。

    此致、

    Kiranjit

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

    Kiranjit,

    除了在 SDA 线上发生的几个伪影外、波形看起来不错。 根据您尝试发送的数据、这些电压尖峰是否符合预期? 我认为这些不是正确的 I2C 信号。  

    此致、

    泰勒