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.
工具与软件:
1.使用 LP-MSPM0G3507 PMBus 时、我发现当 API 使用 PMB_BLOCK_WRITE 或 PMB_BLOCK_READ 进行读取/写入操作时、事务会遇到问题。 应如何解决该问题?
2.即使我对基础 API 事务进行了硬编码以使用 PMB_MFR_REVISION 命令进行测试、此命令仍然会出现错误。 应该如何解决这一问题?
尊敬的 OE J:
此致、
Luke
尊敬的 Luke:
当您停止代码时、您是否正在等待某个位置?
` uint8_t `=(Bus_Commands、commandId]& 0x0F)存在问题;`、因此我们将其硬编码为`0x40 μ s、发生了以下情况。
使用代码时PMB_MFR_REVISION (9B)
、获得的状态为SMBus_State_Controller_NACK
、然后返回、-1
导致读取失败。
当您在示波器上查看这些线路时、您是否看到任何时钟信号?
我们目前仅打印消息、尚未连接示波器。 我们也不认为这是信号问题、尤其是因为将上述方法与命令9C 配合使用非常成功。
另一端的另一个器件是什么?
我们在同一电路板上连接了 I2C0和 I2C1。
是否提供了适当的上拉电阻?
由于 I2C 直接连接、因此我们只使用一组上拉电阻器。
尊敬的 OE J:
您可以调整通信线路的范围吗?
可能会发生一些时钟扩展、在线路不应连接时保持不变。
此致、
Luke
尊敬的 Luke:
您需要波形图吗?
`uint8_t`=(Bus_Commands、commandId]& 0x0F)存在问题;`、因此我们将其硬编码为` 0x40 、
使用 PMBus 块读取来执行0x9B 命令会导致错误、并且信号确实没有发出。
FC 可以正常使用。
尊敬的 OE J:
我将尝试在我这边复制这些、然后回复给您。
在 uint8_t 事务中=(Bus_Commands [commandId]& 0x0F);。 按位运算将仅允许下半字节传递、而您将尝试发送0x40、它仅在上半字节中包含数据。
此致、
Luke
尊敬的 Luke:
如果未完成此操作、在事务后的9b PMB_BLOCK_READ 将与开关情况下的 PMB_BLOCK_READ 不匹配。
如何解决该问题?
还是使用不当?
当我们使用此方法进行测试时、9C (命令)能够起作用。
尊敬的 OE j:
查看 PMBus.c 文件、PMB_BLOCK_READ 被定义为0x40 (第48行)、 我想这是一个拼写错误、块读取应该设置为0x04。
如果你看看库中的内容、所有读取命令都在下半字节中、而写入命令在上半字节中。 这样、在执行位操作时、它将屏蔽相应的命令。
因此、MFR_REVISION 命令将以0x50和0x40之间的 OR 运算结束、从而导致0x90。稍后、当这个被屏蔽时、您将以 PMB_RESERVED 作为读取、这会进入 PMBus 返回错误。
我将在下一个 SDK 版本中解决这个问题。
此致、
Luke
尊敬的 Luke:
因此0x9B 的问题仍然没有得到解决。 即使在调整交易后、它仍然不起作用。
它是否需要执行初始化步骤?
此致、
Joe
尊敬的 OE J:
你能否确认已经发生了针对 block_read 的更改? 您可以将断点设置为调用事务的位置、并检查 Bus_Commands 387[commandId]中的返回值。 该值应为0x54 (块写入+块读取)。
示波器部分看起来会发送命令0x9B、因此一旦我们解决了0x40拼写错误、问题可能出在目标部分、而不是目标部分。
此致、
Luke
尊敬的 Luke:
以下是您的文本的英文翻译:
"纠正0x40错误后、它可以操作。 我想`s、` SMBusTarget.NWK.txBuffPtr[0]= 0x08;`s和` SMBusTarget.NWk.txLen = 9; 之间的关系是什么?"
案例0x9C://mfr 版本
sSMBusTarget.Nwk.txBuffPtr[0]= 0x08;
sSMBusTarget.Nwk.txBuffPtr[1]= 0x02;
sSMBusTarget.Nwk.txBuffPtr[2]= 0x03;
sSMBusTarget.Nwk.txBuffPtr[3]= 0x04;
sSMBusTarget.Nwk.txBuffPtr[4]= 0x05;
sSMBusTarget.Nwk.txBuffPtr[5]= 0x06;
sSMBusTarget.Nwk.txBuffPtr[6]= 0x07;
sSMBusTarget.Nwk.txBuffPtr[7]= 0x08;
sSMBusTarget.Nwk.txBuffPtr[8]= 0x09;
sSMBusTarget.Nwk.txLen = 9;
休息;
这是我在测试期间输入的值、
尊敬的 OE J:
SMBus 具有特定的数据包结构(SMBus 协议)
目标给出的第一个数据将是块计数、它是发送的数据数。 因此、 sSMBusTarget.Nwk.txBuffPtr[0]= 0x08;与有8个数据字节出现相关。 sSMBusTarget.Nwk.txLen = 9、这是因为整个传输的字节计数+数据、因此整个事务的长度应等于字节计数+ 1。
如果 sSMBusTarget.Nwk.txBuffPtr[0]= 0x0A、则 sSMBusTarget.Nwk.txLen = 11。
此致、
Luke
如果其中一条命令块读取正常工作、则问题将出在目标(从器件)端的命令实现上。