Thread 中讨论的其他器件:C2000WARE
工具与软件:
您好!
我正在尝试否定确认 PMBus 帧(写入字节)。 我将使用 PMBus 示例代码[C2000Ware_5_02_00_00\libraries\communications\PMBus\c28]、更改如下所示、

我对帧(写入字节)的观察结果如下:
第一个写入字节(器件发送 ACK)

a)第一帧:[预期 NACK、但收到来自器件的 ACK)

b)第二帧:[似乎器件在此处发送了 NACK]

请提供帮助吗?
谢谢、hari
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.
工具与软件:
您好!
我正在尝试否定确认 PMBus 帧(写入字节)。 我将使用 PMBus 示例代码[C2000Ware_5_02_00_00\libraries\communications\PMBus\c28]、更改如下所示、

我对帧(写入字节)的观察结果如下:
第一个写入字节(器件发送 ACK)

a)第一帧:[预期 NACK、但收到来自器件的 ACK)

b)第二帧:[似乎器件在此处发送了 NACK]

请提供帮助吗?
谢谢、hari
嗨、Hari、
NACK 通常用于专门检测 PMBus 硬件内的错误消息。 为了 NACK、PMBACK 必须向其写入一个0、并且只能在模块等待确认时完成。 如果该位在任何其它时间被写入、则 NACK 将出现下一条消息。 读取 PMBSTS 时。 NACK、何时设置该位? 那么 PMBus 应该在什么情况下 发送 NACK?
如果您 想进行时钟延展、请 查看 PMBSTS。 DATA_Request/DATA_READY 寄存器值。 PMBus 模块已经负责在发出 ACK 之前延展时钟、因此在这种情况下、您似乎需要添加某种延迟来保持时钟低电平。

此致、
Aishwarya.
尊敬的 Aishwarya:
感谢您的答复。 我的方案是在收到具有无效数据位字段的命令时实现 NACK。 是的、我正在写入 PMBACK 寄存器。
实际上、代码与 C2000WARE 中的示例代码相同- C2000Ware_5_02_00_00\libraries\communications\PMBus\c28\examples\28p55x_PMBus_target。
我所做的就是采用 PMBus_stack_handler_target_idle.c 并进行更改
//
//调用 SENDBYTE 事务的处理程序
//
(void) handle->
TransactionHandle[PMBUS_TRANSACTION_SENDBYTE](handle);
//
//确认整个事务
//
PMBus_ NACK Transaction(base );<--我将其更改为 NACK
在编译和测试时,没有看到 NACK ;事实上,每一个其他帧都是 NACK。 i2c 分析器的快照在我的上一条消息中。
您认为我需要使用 GPIO 探测 PMBACK 吗? ACK 时隙丢失并发送到下一条消息??
Hari、
如果您 改为使用 PMBus_ackTransaction (),会出现什么情况? PMBus 负责硬件中的 NACK、因此即使您尝试确认错误的事务、也应该返回 NACK。 请参考这些线程作为起点、我将在平均时间内进行一些挖掘:
(+) TMS320F280039C:PMBus 模块问题的从器件地址的手动确认/ NACK
(+) TMS320F280025C:PMBus 在重新启动命令时未发送 ACK?
此致、
Aishwarya.
Aishwarya,
使用 PMBus_ackTransaction ()时,我看到一个 ACK。 这里、在下面的 SNAP 中、我先切换了 GPIO、当接收到第二个 IRQ 时)、当 ACK PMBACK 被写入 NACK 时。 如您所见、IRQ 只在 ACK 时隙之后出现。 如果是这种情况,如何否定应答,为什么设备不时钟串行直到固件写入 PMBACK 寄存器?

我的初始值如下所示、
void myPMBUS0_init (){
uint32_t moduleFreq = 0u;
PMBUS_disableModule (myPMBUS0_BASE);
PMBus_disableI2CMode (myPMBUS0_BASE);
PMBUS_disableZeroHoldTime (myPMBUS0_BASE);
PMBus_deassertAlertLine (myPMBUS0_BASE);
PMBUS_setOwnAddress (myPMBUS0_BASE、myPMBUS0_own_address);
moduleFreq = PMBus_configModuleClock (myPMBUS0_BASE、myPMBUS0_BAUDRATE、DEVICE_SYSCLK_FREQ);
PMBUS_configBusClock (myPMBUS0_BASE、myPMBUS0_CLOCKMODE、moduleFreq);
PMBUS_initTargetMode (myPMBUS0_BASE、myPMBUS0_TARGET_ADDRESS、myPMBUS0_TARGET_MASK);
PMBUS_configTarget (myPMBUS0_BASE、/* PMBUS_TARGET_AUTO_ACK_4_BYTES |*/ PMBUS_TARGET_ENABLE_PEC_processing);
PMBUS_disableInterrupt (myPMBUS0_BASE、PMBUS_INT_DATA_READY | PMBUS_INT_DATA_REQUEST | PMBUS_INT_EOM);
PMBUS_enableInterrupt (myPMBUS0_BASE、PMBUS_INT_DATA_READY | PMBUS_INT_DATA_REQUEST | PMBUS_INT_EOM);
PMBus_enableModule (myPMBUS0_BASE);
}
我如何使器件时钟延展直到 ACK/NACK 被写入 PMBACK 寄存器?
Hari、
根据您随附的图像、在 ACK 之后、模块将拉 低数据线并释放与您的代码一致且正确的时钟。 您是否正在使用写入字/字节函数? 请参阅此图、尤其是突出显示的部分。

此外、向 PMBACK 位写入0仅在模块等待确认时发送 NACK。 否则、NACK 将在下一条消息 FYI 期间发送
如果您有兴趣、还请参阅 I2C 自动时钟延展部分(类似原理适用于 PMBus)以了解一般概念。
此致、
Aishwarya.
Hari、
我认为现在的情况是、由于 启用了每4个字节后自动确认的选项、PMBus 硬件将根据默认的 PMBus 确认/确认规则 (可在 TRM 中找到的信息)处理确认/确认。 当您在第一个传输结束时 NACK 时、您将 NACK 所有以下命令、因为设置第一个传输的 NACK 的机会 已结束、这将打破已设置的自动确认设置。 这与 I2C 是一致的 、因为它们确实共享同一个基本设计层。
您想要做的是使用手动 ACK/NACK、这样就会在发送 x 个数据字节后和 ACK/NACK 时隙之前触发中断。
此致、
Aishwarya.