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.

[参考译文] DS90UB949-Q1EVM:接口论坛

Guru**** 2578945 points
Other Parts Discussed in Thread: DS90UB949-Q1EVM, USB2ANY, ALP

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1226004/ds90ub949-q1evm-interface-forum

器件型号:DS90UB949-Q1EVM
主题中讨论的其他器件: USB2ANYALP

我将  DS90UB949-Q1EVM 串行器(器件 ID:0x18)与   连接到 S32K 平台中的 DLPC3030的 DS90UB926解串器(器件 ID:0x5A)一起使用(器件 ID:0x36)、图像投影部件正常工作。 但我们无法连接到 i2c 远程从器 件,即 S32K 平台(设备 ID : 0x36)。 我们试图 将从器件 ID[0]寄存器0x07和从器件别名 ID 0x08写入作为我们的远程从器件地址0x36,但未进行通信。

代码:这是我们的准则。 与远程从器件进行 I2C 通信。

int vl2= u2aI2C_RegisterWrite (handle、0x0C、0x07、0x36);//从器件 ID[0]
int vl3= u2aI2C_RegisterWrite (handle、0x0C、0x08、0x36);//从器件别名 ID[0]
//读取 I2C
//远程从机7位地址0x1B --> 8位地址0x36
RET = u2aI2C_InternalRead (Handle、0x1B、0x00、1、1、 数据);  
如果(ret >= 0)
RET =(int) data[0];
如果(ret >= 0)
qDebug ()<<从从 I2C 从器件读取值。 "<<(字节) ret;
}
否则
qDebug()<<"I2C 读取失败-错误"<< ret;
}
 
这是我们的一项重要任务,因此,我们非常感谢任何帮助。
谢谢  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sundar:

    对于这些行:

    int vl2= u2aI2C_RegisterWrite (handle、0x0C、0x07、0x36);//从器件  ID[0]
    int vl3= u2aI2C_RegisterWrite (handle、0x0C、0x08、0x36);//从器件别名 ID[0]

    vl2、vl3的值是什么?

    0x0C 是您的主器件的地址吗?

    对于此行:

    RET = u2aI2C_InternalRead (Handle、0x1B、0x00、1、1、 数据);  

    第二个参数可以保存16位。 为什么不使用0x36?

    此致、

    Gil Abarca

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

    您好!

    0x0C 是串行器的地址、采用7位表示(8位表示为0x18)。

    我已经将我的 PC 与串行器连接。 我正在使用 USB2ANY API 访问解串器侧连接的 I2C 从器件(A MCU)。

    USB2ANY API 仅采用7位地址格式。

    我 也用于 u2aI2C_InternalRead 的相同7位格式、0x1B (8位表示为0x36)。

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

    此外 、vl2的值为0。

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

    尊敬的 Sundar:

    是否启用了 I2C 直通?

    此致、

    Gil Abarca

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

    是的、将0x03寄存器设置为"0xDA"作为数据

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

    尊敬的 Sundar:

    您是否可以更改此行:rett = u2aI2C_InternalRead (handle、0x1B、0x00、1、1、 数据);  

    对于此行:RET = u2aI2C_RegisterRead (handle、0x0C、0x0);

    此致、

    Gil Abarca

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

    我更改了这一行、得到"ret"的值为0x18。 此外、我还发现、我必须将 Slave[0]和 Slave_Alias[0]寄存器值用作0x6C、该值是正确的从器件地址。 现在、通信发生了几次、但不是每次都发生。 在对从器件0x6C 进行任何读取或写入期间、整个 I2C 通信都发生了挂起。 我必须复位串行器 EVM 才能再次启动。 您能否提供任何示例脚本、以便与连接到解串器的远程从器件进行通信、我可以直接在 ALP 应用中运行远程从器件。

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

    尊敬的 Sundar:

    下面是一个示例脚本:

    SerAddr = 0x18如需要#update
    DesAddr = 0x5A 如需要#update
    slaveID = 0x6C #update as needed.
    slaveAlias = 0x6C #update as needed.

    #设置 I2C 直通
    I2C_pass_through = board.ReadI2C (serAddr、0x03、1)
    I2C_pass_through = I2C_pass_through | 0xDA
    board.WriteI2C (serAddr、0x03、I2C_pass_through)

    #设置从 ID 和别名
    board.WriteI2C (serAddr、0x07、slaveID)
    board.WriteI2C (serAddr、0x08、slaveAlias)

    此致、

    Gil Abarca

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

    您好、我已按照上述配置设置串行器寄存器、现在正在写入 I2C 从器件。 当我尝试从 I2C 从设备读取时、显示"Error -46:read timeout"。 如果我使用 S32k144 MCU、我可能会在代码中看到 txbuff 设置正确、但仍然没有获取 I2C 读取值。 对此有什么想法吗?

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

    尊敬的 Sundar:

    您能否向我提供您要为从 I2C 从器件中读取进行什么编码?

    此致、

    Gil Abarca

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

    您好!

    我 使用 I2C 快速模式(400KHz)将 s32k144用作从 MCU、默认情况下会启用时钟延展。

            LPI2C_Set_SlaveIgnoreNACK(baseAddr, LPI2C_SLAVE_NACK_END_TRANSFER);
            LPI2C_Set_SlaveTransmitNACK(baseAddr, LPI2C_SLAVE_TRANSMIT_ACK);
            /* Enable clock stretching except ACKSTALL (we don't need to send ACK/NACK manually) */
            LPI2C_Set_SlaveACKStall(baseAddr, false);
            LPI2C_Set_SlaveTXDStall(baseAddr, true);
            LPI2C_Set_SlaveRXStall(baseAddr, true);
            LPI2C_Set_SlaveAddrStall(baseAddr, true);


    在这里、我将 lpi2c0_tx_buf 的数据设置为"52 0F 05 08 6E"。

    	uint8_t checksum = 0;
    	if((NULL == p_data) || (0 == data_len) || (data_len >= LPI2C0_TX_BUF_SIZE))
       	{
        	printf("\nSTATUS_ERROR......\n");
            return STATUS_ERROR;
        }
    
        memcpy(lpi2c0_tx_buf, p_data, data_len);
    	checksum = DeviceDS90UB926_CalcChecksum(lpi2c0_tx_buf, data_len);
    	lpi2c0_tx_buf[data_len] = checksum;
    	lpi2c0_tx_len = data_len + 1;
    	for(int tv = 0; tv<lpi2c0_tx_len; tv++)
    		printf("lpi2c0_tx_buf %d : %x\n", tv, lpi2c0_tx_buf[tv]);
    	printf("\nSetTxData done......\n");
        return STATUS_SUCCESS;

    对于从属读/写操作、我正在使用 QT 工具编写应用。 我使用的是 USB2ANY I2C 库中的写入和读取 API。

    I2C 写入函数:Addr= 0x6C、reg= 0x83、len = 5、数据= 52 0F 05 08 6E

        int ret = 0;
    
        ret = u2aI2C_InternalWrite(handle, addr, reg, 1, len, (BYTE*) data);
    
        if (ret < 0)
        {
            QString str1 = QString("Write -> addr = %1 reg = %2 error").arg(hex2str(addr)).arg(hex2str(reg));
            emit sgnl_DisplayError(str1);
            qDebug("I2C write failed - Error %d: %s", ret, u2aGetStatusText(ret, NULL, 0));
            return false;
        }
    
        QString str = QString("Write -> addr = %1 reg = %2 \ndata = %3").arg(hex2str(addr)).arg(hex2str(reg)).arg(hex2text(data, len));
        emit sgnl_DisplayTxInfo(str);
        return true;

    写入数据正在正确写入从 MCU。 我可以在 MCU 中使用打印命令进行验证。 以下是信号响应。

    I2C 读取函数: Addr= 0x6C、reg= 0x83、len = 5  

        int ret = 0;
    
        ret = u2aI2C_InternalRead(handle, addr, reg, 1, len, data);
    
        if (ret < 0)
        {
            QString str1 = QString("Read -> addr = %1 reg = %2 error").arg(hex2str(addr)).arg(hex2str(reg));
            emit sgnl_DisplayError(str1);
            qDebug("I2C read failed - Error %d: %s", ret, u2aGetStatusText(ret, NULL, 0));
            return false;
        }
    
        QString str = QString("Read -> addr = %1 reg = %2 \ndata = %3").arg(hex2str(addr)).arg(hex2str(reg)).arg(hex2text(data, len));
        emit sgnl_DisplayRxInfo(str);
        return true;

    这里、我正在从 MCU 读取、但未执行读取函数。 在执行读取命令之后、串行器会挂起、并且它没有正确响应。 需要复位串行器才能再次启动该过程。

    我不知道为什么阅读不正确,有什么建议?

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

    尊敬的 Sundar:

    您能否提供 SER I2C 总线和 DES I2C 总线的屏幕截图?

    当您在写文章时、您是否尝试立即阅读?  

    您的 MCU 是否支持时钟延展?

    此致、

    Gil Abarca

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

    您好!

    是的、在我的 MCU 代码中启用了时钟延展、我已经在上面回复中粘贴了 MCU 代码。 我也不是写后立即阅读。  

    以下是从 MCU 端和串行器端的示波器输出、

    MCU 侧:SCL -黄色、SDA -绿松石色。

    串行器侧:SCL -紫色、SDA -蓝色。

    远程从器件  I2C 写入:

    远程从器件 I2C 读取:

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

    尊敬的 Sundar:

    是否满足 I2C 启动条件? 所提供的图像中不清楚、但在启动事务时、SCL 和 SDA 似乎同时变为低电平。 您能否放大启动和停止条件?

    此致、

    Gil Abarca

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

    您好、请参考以下图片、

    用于读取 I2C 的 MCU 侧信号:

    读取 I2C 的串行器侧信号:

    建立时序延迟。

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

    尊敬的 Sundar:

    您是否在没有 FPD-Link 器件仅使用 USB2ANY 和 MCU 的情况下在 MCU 中测试了 I2C 协议?

    此致、

    Gil Abarca

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、我将 MCU I2C 直接连接到 EVM 中的 MSP430 (USB2ANY) I2C 引脚、串行器和解串器的 PDB 保持低电平。 我使用了 USB2ANY SDK 示例代码中的"Example_USB2ANY_I2C_GUI"应用程序。 写入和读取函数按预期工作。 我还通过启用串行器的 PDB 进行测试、同时  MCU I2C 连接到  EVM 中的 MSP430 (USB2ANY) I2C。 我将 ALP 脚本用于读取和写入、这也很有效。
    每当我连接串行器和解串器之间的 FPD 链路、并将 MCU I2C 作为从器件连接到解串器时、 读取 I2C 完全不起作用、我都会收到"Read timeout Error"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果可能、您能否为我提供串行器(DS90UB949)和解串器的默认寄存器配置  
    (DS90UB926).NRD 文件。

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

    尊敬的 Sundar:

    我认为您的 MCU 有一个问题。 当显示"Read timeout Error"时、您知道 MCU 的超时是多少? 如果您将其直接连接到 MSP430、则可以正常工作、因为没有延迟;但是、如果您在系统中实施 FPD-Link 器件、 即使启用时钟延展、也会导致通信出现延迟。 您的 MCU 可能无法处理您的应用所需的速度。

    此致、

    Gil Abarca