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.

[参考译文] TPS65987D:I2C 读取"数据字节"在补丁包流时始终为0xFF

Guru**** 2616675 points

Other Parts Discussed in Thread: TPS65988, TPS65987DDJ, TPS65987D

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1034037/tps65987d-i2c-read-data-byte-is-always-0xff-when-patch-bundle-flow

器件型号:TPS65987D
主题中讨论的其他器件:TPS65988TPS65987

我们的平台是不带闪存 ROM 且具有外部 MPU 的 PTS65987D。

我们正在尝试补丁包流程、如 slva972a.pdf 第5页所示(TPS65987和 TPS65988 I 2C 上的无 SPI 主机编程)。

在"ReadyForPatch Notification Received?"处、我们读取寄存器0x14、得到的"字节计数"=0x0B 正确、但"数据字节1~11"全部为0xFF。

接下来是"Command Execution Successful?"、 我们读取寄存器0x08、我们正确地得到了"Byte Count"= 0x04、但"Data Byte 1~4"全部为0xFF。

我们认为0xFF 的值不正确。  请告知我们应采取哪些措施来读取正确的值。

此致、

Hirosawa

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

    Hirosawa、您好!

    您是否可以确认您遵循第6页上显示的流程? 必须按照所示顺序写入4CC 命令、DataX 寄存器中命令的数据、然后在 CMDx 寄存器中写入4CC 代码。

    谢谢、

    哈里

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

    您好 Hari、

    感谢你的答复。

    是的、我们 首先在 Data1寄存器(0x09)中写入数据(0x0300)、然后在 Cmd1寄存器(0x08)中写入4CC 命令"PTC"(0x50544373)。

    (我发现错误、应该是0x03、而不是0x0300)

    如果是、请查看我们的以下代码吗?

    我还找到了 ADCIN1端口(BUSPOWERZ 配置)设置0.60~0.68 (配置4)。

    它是否应设置0.30~0.38 (BP_ECWait_Internal)以下载修补程序包?

    //---------------------------------------
    U8 PD_Init1(void)
    //Initialization
    //=0:OK,  =1:Error,  =2:ReadyForPatch Error
    {
    	volatile U8 i1 , i2;
    	volatile U16 areano , array_rng;
    	
    	areano = 0;
    	FW_timer = 10000;	//10 seconds Timer Set
    	PD_Flag = 0;		//0 means PowerDelivery Not supported
    	array_rng = 13120;	//Number of table 
    
    	while(1){
    		i1 = TPS65987_RegRead(0x14);
    		if (i1 == 0){
    			if ((IICBuf[10] & BIT1) == BIT1) break;
    		}
    		if (FW_timer == 0)return 2;
    	}
    	//Write 2 byte data(0x0300) into Register 0x09(Data1)
    	IICBuf[0] = 0x03;
    	IICBuf[1] = 0x00;
    	if (TPS65987_RegWrite(0x09,2) == 1) return 1;
    	//Write PTCs command (“PTCs”(0x50544373) into Register 0x08(Cmd1)
    	IICBuf[0] = 0x50;
    	IICBuf[1] = 0x54;
    	IICBuf[2] = 0x43;
    	IICBuf[3] = 0x73;
    	if (TPS65987_RegWrite(0x08,4) == 1) return 1;
    	//Poling Register 0x08, it means success if 0x0000_0000,  it means fail if ”!CMD”
    	i1 = TPS65987_RegRead(0x08);
    	if (i1 == 0){
    		if ((IICBuf[0] != 0) || (IICBuf[1] != 0) || (IICBuf[2] != 0) || (IICBuf[3] == 0)) return 1;
    	}
    	else{
    		return 1;
    	}
    	while(1){
    		//Write each 64 bytes of Patch_bundle.c into Register 0x09(Data1)
    		for(i1 = 0; i1 < 64; i1++){
    			IICBuf[i1] = tps65987x_lowregion_i2c_array[areano];
    			areano ++;
    		}
    		if (TPS65987_RegWrite(0x09,64) == 1) return 1;
    		//Write PTCd command(“PTCd”(0x50544364) into Register 0x08(Cmd1)
    		IICBuf[0] = 0x50;
    		IICBuf[1] = 0x54;
    		IICBuf[2] = 0x43;
    		IICBuf[3] = 0x64;
    		if (TPS65987_RegWrite(0x08,4) == 1) return 1;
    		//Poling Register 0x08, it means success if 0x0000_0000,  it means fail if ”!CMD”
    		i1 = TPS65987_RegRead(0x08);
    		if (i1 == 0){
    			if ((IICBuf[0] != 0) || (IICBuf[1] != 0) || (IICBuf[2] != 0) || (IICBuf[3] == 0)) return 1;
    		}
    		else{
    			return 1;
    		}
    		if (areano >= array_rng)break;
    	}
    	//Write PTCs command (“PTCc”(0x50544363) into Register 0x08(Cmd1)
    	IICBuf[0] = 0x50;
    	IICBuf[1] = 0x54;
    	IICBuf[2] = 0x43;
    	IICBuf[3] = 0x63;
    	if (TPS65987_RegWrite(0x80,4) == 1) return 1;
    	//Read Register 0x09(Data1),  it means success if Byte3 = 0x00 and Byte4 = 0x00
    	i1 = TPS65987_RegRead(0x09);
    	if (i1 == 0){
    			if ((IICBuf[2] != 0) || (IICBuf[3] != 0)) return 1;
    		}
    	else{
    		return 1;
    	}
    	PD_Flag = 1;   //PowerDelivery supported
    	return 0;
    }
    //---------------------------------------
    //Read reg data Write IICBuf()
    //=0:OK,  =1:Error
    U8 TPS65987_RegRead(U8 reg)	
    {
    	volatile U8 slvadd;
    	volatile U8 i1 , i2;
    	
    	slvadd = 0x70;
    
    	IICStart();	//Start condition
    	if (IICWriteOne(slvadd) == 1)return 1;  //Slave address
    	if (IICWriteOne(reg) == 1)return 1;      //Regster Address
    	
    	IICReStart();	//Start condition
    	if (IICWriteOne((slvadd | 1)) == 1) return 1;  //Slave address (bit0=1 , Read)
    	
    	//Data recieved
    	ACKDT1 = 0;//AckSet
    	i2 = IICReadByte();   //Get Data byte
    	for(i1 = 0; i1 < i2; i1++){
    		IICBuf[i1] = IICReadByte();   //get 1 byte
    		IICAckTx();//Ackout
    	}
    	//Last 1 byte
    	ACKDT1 = 1;   //NoAckSet
    	IICBuf[i1] = IICReadByte();  //Get 1 byte
    	//NoAckout
    	IICAckTx();
    
    	IICStop();
    	return 0;
    }
    //---------------------------------------
    U8 TPS65987_RegWrite(U8 reg , U8 lng)
    //Write IICBuf() into reg
    //=0: ok,  =1:Error
    {
    	volatile U8 slvadd;
    	volatile U8 i1 , i2;
    	
    	slvadd = 0x70;
    
    	IICStart();
    	if (IICWriteOne(slvadd) == 1)return 1;
    	if (IICWriteOne(reg) == 1)return 1;  //Regster Address
    	
    	for(i1 = 0; i1 < lng; i1++){
    		if (IICWriteOne(IICBuf[i1]) == 1)return 1;
    	}
    	IICStop();
    	return 0;
    }
    //---------------------------------------
    

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

    您好、Koji、

    我无法过多地查看代码、因为每个系统的代码可能会有所不同。 但是、如果您遵循数据表中显示的4CC 命令的 I2C 格式、则应该可以。

    要通过 EC 加载补丁、您需要将其设置为  BP_ECWait_Internal 或 BP_ECWait_External。

    谢谢、

    哈里

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

    您好 Hari、

    感谢你的答复。

    但我们还没有解决。 我可以逐一确认吗?

    我们 将  I2C2端口用于路径捆绑包、它可以吗?

    2."BP_ECWait_Internal" 由 ADCIN1 DIV R2/(R1+R2)=(0.30~0.38)设置。 没关系吗?

    在批处理捆绑包的第一步中、在"READY_FOR_PATCHICE"处 、如果寄存器0x14 (IntEvent1)中字节11的位1 (ReadyForPatch) 为1、我们将进行轮询。 它是否是正确的程序

    在轮询寄存器0x14时、 设置为"BP_ECWait_Internal"后、我们始终得到"byte count"= 0x00、而不是0x0B。 出什么问题了?

    此致、

    Hirosawa  

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

    您好、Koji、

    是的、没问题。

    1.是的、没关系。

    2.是的,此配置正常。

    我相信、由于您使用的是 I2C2、您实际上需要轮询0x15字节11。

    我认为由于步骤3、您可能看不到这一点、因为它与 I2C1相关、所以请检查0x15、并告诉我您是否能够看到此更新。

    谢谢、

    哈里

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

    您好 Hari、

    感谢你的答复。

    但我们已经尝试查询寄存器0x15、但结果相同、"字节计数"= 0x00。

    5、我们按如下方式进行了轮询、没问题吧?  (下划线是 TPS65987的数据表)

       S+唯一地址(0111000)+WR (0)、ACK、寄存器(0x15)、ACK、SR+ 唯一地址(0111000)+Rd (1)、 ACK字节计数= 0x00、ACK、P

    6、  上电后、我们是否可以很快轮询0x15?  或者我们应该等待几秒钟吗?

    请提供我们应该做什么的建议。

    此致、

    Hirosawa

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

    您好、您能确认您正在读取 reg。 价值? 我不确定为什么它会不断提供字节计数。 您是否能够按照数据表图8-27中的 I2C 读取协议发送 I2C 消息? 如果 PD 控制器由 VBUS 供电、那么您应该能够读取、但也可以尝试增加较小的延迟。

    谢谢、

    哈里

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

    您好 Hari、

    是的、我们遵循此协议进行 I2C 读取。   (我发现文档已于今年8月修订、我的文档为图30、而不是8-27)

    首先、我们可以得到"字节计数"(请参阅下面的红色矩形)、其中显示了后续读取数据字节的数量。

    如果 Byte count 为0x00、则无法再读取任何内容。 我们现在将重点介绍字节计数。  

    我们的环境没有 VBUS 电源、但我们为 VIN3V3 (#5引脚)提供3.3V 电压。 我认为这对于 I2C 访问来说已经足够了。  

    我们是否仍然需要 VBUS 电源?   

    我们尝试增加延迟。 但在注册号之后没有 ACK。。。 变得更糟了。  HU~~~m

    此致、

    Hirosawa

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

    您好!

    是的 VIN_3V3应该正常、该信号也应该为 LDO_3V3供电、您能否确认您的设计中是否正确?

    当您不处于应用模式时、PD 控制器可能不允许主机访问某些寄存器信息、因此您可以安全地假设第一个 I2C IRQ 通知是 ReadyForPatch 中断。 此时、主机可以启动 PTCx 补丁下载过程。

    需要注意的另一点是、由于您使用的是 BP_ECWait_Internal 配置、因此需要确保 PD 控制器处于 PTCH 模式、以便从主机接受补丁。 或者、您可以确保主机保持在 PTCH 模式的一种方法是将配置更改为 Infinite_Wait。

    谢谢、

    哈里

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

    您好 Hari、  

    是的、我确认 LDO_3V3为3.3V。

    我很困惑。  您的意思是它如下所示?

    首先、PD 控制器处于应用模式、我们可以访问0x15以检查  ReadyForPatch。 之后、我们发送 PTC 4CC 命令。

    然后、PD 控制器更改为补丁模式、主机发送补丁捆绑包数据。 对吧?

    如何将 PD 控制器设置为应用模式或补丁模式?  我认为它是根据 是否存在外部闪存自动设置的。

    如果存在外部闪存、则会设置应用模式。 如果没有外部闪存(我们的环境案例)、则为补丁模式。 对吧?

    此致、

    Hirosawa

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

    您好、Koji、

    不、很抱歉、PD 控制器将以 PTCH 模式启动、然后 根据您的 ADC 配置、它将加载默认配置或从主机加载。 在此 PTCH 模式期间、EC 需要将补丁推送到 PD 控制器。 但是、如果您的默认配置未设置为 Infinite_Wait、则可能发生的情况是 EC 未及时推送补丁、则 PD 控制器将进入应用模式并加载默认配置。 当 PD 控制器进入应用模式时、EC 将无法加载补丁。 因此、如果有 EC 将配置推送到 PD、则建议使用 Infinite_Wait 设置。

    谢谢、

    哈里

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

    您好 Hari、

    正如我之前所写的那样、我们   通过 ADCIN1 DIV =(0.30~0.38)来设置"BP_ECWait_Internal (Infinite_Wait")"。 我确认 ADCIN1为 1.13V (=3.3V*0.34)。

    但主机无法通过 I2C2进行访问。  

    以防万一、您能否检查 我们的电路图中是否存在任何错误?  (CN5是 USB3端子)

    此致、

    Hirosawa

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

    您好!

    您似乎有很多不同的东西、我不知道。 通常、TPS65987D 是指 DH 版本、但我看到您使用的是 TPS65987DDJ 版本的器件。 我建议使用 DH、因为 DJ 版本仅适用于 Thunderbolt 设备。

    此外、我注意到您的一些引脚未遵循数据表中的建议、您能否仔细检查数据表中的引脚功能和规格部分? 您还可以将数据表与数据表中的典型应用原理图进行比较。 我看到 VBUS1和 VBUS2没有连接在一起、也没有看到任何电容器连接到 LDO_3V3或 LDO_1V8。 您是否能够测量 LDO_3V3并验证您是否能够在插入其他器件时看到该电压?

    此外、我相信默认情况下、PPHV1将用于从另一个器件接收功率、但您似乎将此引脚保持断开状态。

    谢谢、

    哈里

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

    您好 Hari、

    感谢你的答复。

    供参考、我们的平台适用于 PD 源设备。  

    我按照您提到的内容对电路板进行了返工、并对数据表进行了如下电路图(红色字母)所示的修改。

    但症状仍然相同、  当 MCU 读取 TPS65987寄存 器0x15时、TPS65987始终发送"字节计数"= 0x00 (应为0x0B)、后续数据全部为0xFF。

    我尝试读取其他寄存器0x04 ((Type)、读回数据为0x04 FF FF FF FF FF FF FF FF FF FF。   0x04为"字节计数"、它是正确的值、但接下来的4个字节应为 ASCII "I2C"。

    寄存器0x05也与0x04 FF FF FF FF FF FF FF 相同。  

    发生什么事了?

    [返工项目]

     - TPS65987DDJ -> TPS65987DDH  (只是电路图错误)

     - VBUS1和 VBUS2被连接

     -连接到 LDO_3V3或 LDO_1V8的10uF 电容器。

     - PPHV1 和 PPHV2已连接

     - SPI_MOSI、CLK 和 SS 连接到 GND

     - I2C1_SDA 和 SCL 通过10k 寄存器上拉。  

    此致、

    Hirosawa

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

    您好!

    是否可以在启动后尝试在不读取寄存器的情况下发送 PTCx 命令? PD 控制器不允许在 PTCH 模式下读取该寄存器、因此您需要在不执行此步骤的情况下首先发送 PTC 来启动该过程。

    谢谢、

    哈里

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

    您好 Hari、

    我在启动后尝试发送 PTC 命令、但没有读取。 但 NACK 在发送"字节计数"后接收、如下所示。

    S、0x38 (UniqueAdrs)+WR、ACK

    0x09 (寄存器 Data1)、ACK、

    0x01 (ByteCount)、NACK

    0x03、NACK P

    S、0x38 (UniqueAdrs)+WR、 ACK

    0x08 (寄存器 Cmd1)、ACK

    0x04 (ByteCount)、NACK

    0x50 ("P")、NACK

    0x54 ("T")、NACK

    0x43 ("C")、NACK

    0x73 ("s")、NACKP

    我尝试通过 I2C1 (UniquAdrs=0x22)发送 cmd2/ data2寄存器= 0x10/0x11)和/或。 结果都相同。

    此致、

    Hirosawa

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

    您好!

    您能否捕获 I2C 日志文件以便我可以查看它?

    谢谢、

    哈里

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

    您好 Hari、

    我们没有 I2C 分析器、因此我得到了示波器逐一捕获。

    请检查随附的 pdf 文件。

    e2e.ti.com/.../4834.I2C.pdf

    此致、

    Hirosawa

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

    您好!

    我将查看是否可以发现任何 I2C 问题。

    谢谢、

    哈里