您好!
我正在尝试使用 Raspberry Pi 上的 I2C 打开和关闭 UCD90320上的电源轨。 我想知道是否可以这样做、如果可以、使用 I2C/PMBus 与 UCD 进行通信的命令格式是什么。
有人能向正确的方向指出我吗?
谢谢
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 命令逐个开启电源轨。
对于每个目标电源轨、请执行以下步骤
1. 使用正确的索引(0->rail1、1->rail2发送 page_command( write byte command)。 (笑声) 一个)来选择目标电源轨
2. 发送 ON_OFF_CONIG (写入字节 c 命令)、并设置位4和位3。 这是为了允许电源轨由操作命令控制。 请参阅第12.2节 https://470q2hhkn9g15l4bc2btbal1-wpengine.netdna-ssl.com/wp-content/uploads/2021/05/PMBus-Specification-Rev-1-2-Part-II-20100906.pdf
3.发出操作(写入字节命令)以打开或关闭电源轨。 请参阅 https://470q2hhkn9g15l4bc2btbal1-wpengine.netdna-ssl.com/wp-content/uploads/2021/05/PMBus-Specification-Rev-1-2-Part-II-20100906.pdf 的第12.1节
此致
Yihe
你(们)好
您可以参阅 http://smbus.org/specs/smbus20.pdf 的第5.5节 、了解 基于 I2C 协议的 SMBus/PMBus 协议。
此致
Yihe
感谢您的回答、但我仍然对 Page Command 感到困惑。 第11.10节没有多说。 我看不到任何示例或我需要为 PAGE 命令设置的位。我应该参阅第11.14和11.15节。 如果是,那么我如何知道这些部分(PG 52)所示示示例中的参数? page_plus 命令代码、页码、命令代码使用什么?
您是否有任何通过 I2C 与 UCD 通信的示例代码? 这将真的有帮助。
在我的系统中、默认情况下所有电源轨都处于开启状态、为了实现测试自动化、我希望一次关闭一个电源轨。 请提供任何帮助。 这是我与 UCD90320进行通信的示例代码。
import smbus import sys import time Channel = 1 I2C = smbus.SMBus(Channel) Address = 0x68 ################################################################################## def I2C_Write(PAGE_COMMAND, ON_OFF_CONFIG, OPERATION_OFF): I2C.write_i2c_block_data(Address, PAGE_COMMAND, ON_OFF_CONFIG, OPERATION_OFF) ################################################################################## ON_OFF_CONFIG = 0b00001011 OPERATION_ON = 0b10000000 #ON OPERATION_OFF = 0b00000000 #OFF PAGE_COMMAND = ?? I2C_Write(PAGE_COMMAND, ON_OFF_CONFIG, OPERATION_OFF)
你好
您可以参阅 https://www.ti.com/lit/ug/slvuaw9c/slvuaw9c.pdf 的 v6.1部分。
请注意、表3中有一个拼写错误、UCD90320上的最大电源轨数为32、而不是24。
PAGE 命令是一个写入字节命令、例如、如果您要选择第4个轨、命令代码为0x00。 您必须 通过 i2c 软件发送以下内容
0x65 (地址)+ 0x00 (命令代码)+ 0x03 (选择第4轨的索引)。
此外、
ON_OFF_CONFIG = 0b00001011这似乎不正确。 您必须使用 OPERATION 而不是 CONTROL PIN、它需要设置为0b00011000。
PAGE、ON_OFF_CONFIG、OPERATION 是三个单独的命令、您必须按照原始答复中所述的顺序逐个发送这三个命令。
请 参阅 http://smbus.org/specs/smbus20.pdf 的第5.5节 、了解 SMBus/PMBus 协议。
此致
Yihe
你(们)好
您可以参阅以下内容、使用 PAGE、ON_OFF_CONFIG 和 OPERATION 来开启和关闭电源轨#5。
地址 | CMD ID | CMD_Code | 相位 | 值编码 | value_text |
101. | 页面 | 0x00 | 写入 | 0x04 | 电源轨#5/页0x04 |
101. | ON_OFF_CONFIG | 0x02 | 写入 | 0x18 | 模式:仅运行 |
101. | 操作 | 0x01 | 写入 | 0x80 | 单位:开;边距:无 |
101. | 操作 | 0x01 | 写入 | 0x00 | 单位:ImmedateOff;边距:无 |
此致
Yihe
你(们)好
是的、请参阅本应用手册的第4节: https://www.ti.com/lit/pdf/slva385
此致
Yihe
感谢您的指导、我能够读取所有电源轨的电压和电流。
至于温度读数、有3个温度读数命令(0x8D、0x8E、0x8F)、我不确定哪一个是 UCD90320的正确命令。 此外 、我在 下面的文档表3中看不到 UCD90320的列。 如何知道哪个命令适用于 UCD90320? 是否有此文档的更新版本?
是否还有任何命令可查看所有电源轨的故障状态?
另一个问题是我正在尝试使用表3中列出的命令从 UCD 读取 MFN ID、MFL_MODEL 等。 但是、我得到了一个大数字、我不确定如何理解它。 它似乎也会在现在和之后发生变化、例如下面的 MFN 位置。
MFN_ID:19718
MFN_型号:19721
MFN_修订版:19724
MFN_位置:19724
MFN_日期:22790
MFN_串行:22790
MFN_ID:19718
MFN_型号:19721
MFN_修订版:19724
MFN_位置:19852.
MFN_日期:22790
MFN_串行:22790
MFN_ID:19718
MFN_型号:19721
MFN_修订版:19724
MFN_位置:19724
MFN_日期:22918
MFN_串行:22790
用于轮询的代码:
MFN_ID = 0x99 MFN_MODEL = 0x9A MFN_REVISION = 0x9B MFN_LOCATION = 0x9C MFN_DATE = 0x9D MFN_SERIAL = 0x9D MFN_ID_get = I2C.read_word_data(ADDRESS, MFN_ID) print("MFN_ID: {}".format(MFN_ID_get)) MFN_MODEL_get = I2C.read_word_data(ADDRESS, MFN_MODEL) print("MFN_MODEL: {}".format(MFN_MODEL_get)) MFN_REVISION_get = I2C.read_word_data(ADDRESS, MFN_REVISION) print("MFN_REVISION: {}".format(MFN_REVISION_get)) MFN_LOCATION_get = I2C.read_word_data(ADDRESS, MFN_LOCATION) print("MFN_LOCATION: {}".format(MFN_LOCATION_get)) MFN_DATE_get = I2C.read_word_data(ADDRESS, MFN_DATE) print("MFN_DATE: {}".format(MFN_DATE_get)) MFN_SERIAL_get = I2C.read_word_data(ADDRESS, MFN_SERIAL) print("MFN_SERIAL: {}".format(MFN_SERIAL_get))
你(们)好
UCD90320具有其自己的文档 https://www.ti.com/lit/ug/slvuaw9c/slvuaw9c.pdf
这些数字由客户编程。 您是否对它们进行了编程?
此致
Yihe
是的、我按如下方式对其进行编程:
https://drive.google.com/file/d/14g_p3WxabDeY-Unr7OWU0PEArksrvX6o/view?usp=sharing
是否还有任何命令可查看所有电源轨的故障状态?
感谢您指引我正确的方向。 我能够读取 STATUS_VOUT、STATUS_IOUT 和 STATUS_BYTE
最后一个问题是、当我读取 输出电压、输出电流或温度状态字节时、有时即使没有故障、我也会设置随机故障。
在下面的示例中、您可以看到在第一个通道上设置了 STATUS_VOUT 和 STATUS_IOUT 的最左侧位、然后在 第二个通道中消失。 此外、它是随机的、有时它显示故障、有时它不显示故障。 请提供建议。
输出:
Measuring: VCC5 Voltage/Current/Temp: 5.135 / 0.002 / 36.812 *** VOUT_OV_FAULT *** IOUT_OC_FAULT STATUS_VOUT: 10000000 STATUS_IOUT: 10000000 STATUS_TEMP: 0 Vout_status/Iout_status/Temp_status: NOT OK / NOT OK / OK Measuring: VCC5 Voltage/Current/Temp: 5.137 / 0.000 / 36.812 STATUS_VOUT: 0 STATUS_IOUT: 0 STATUS_TEMP: 0 Vout_status/Iout_status/Temp_status: OK / OK / OK
Python 代码:
STATUS_VOUT = 0x7A STATUS_IOUT = 0x7B STATUS_TEMPERATURE = 0x7D def faults(): STATUS_VOUT_get = I2C.read_byte_data(ADDRESS, STATUS_VOUT) if STATUS_VOUT_get != 0: Vout_status = "NOT OK" if STATUS_VOUT_get >> 7 & 1: print("*** VOUT_OV_FAULT") if STATUS_VOUT_get >> 6 & 1: print("*** VOUT_OV_WARNING") if STATUS_VOUT_get >> 5 & 1: print("*** VOUT_UV_WARNING") if STATUS_VOUT_get >> 4 & 1: print("*** VOUT_UV_FAULT") else: Vout_status = "OK" print("STATUS_VOUT: {0:b}".format(STATUS_VOUT_get)) ..... and so on for Iout and Temperature return Vout_status, Iout_status, Temp_status #Main Vout_status, Iout_status, Temp_status = faults() print("Vout_status/Iout_status/Temp_status: {} / {} / {}".format(Vout_status, Iout_status, Temp_status))
你(们)好
您是否有其他 I2C 主机同时访问 UCD? 我建议您读回 PAGE 命令、以确保您访问了正确的电源轨。 此外、波形可以判断是否存在任何信号完整性问题。
您还可以使用 GUI 的低级 SMBus& I2C 工具测试。 请观看以下视频
此致
Yihe
我终于拿到了 I2C 分析仪(Picoscope)。 我看不到波形会带来失真或任何东西、它们对我来说很好。 请参见下面的最后一张图片。
我在读取电压、电流或温度时没有看到错误。 我可以从 UCD 读取正确的数据。
问题在于读取 Vout_Status Iout_status 和 Page 命令时。 似乎 MSB 在某种程度上设置为每几次传输1次。 我没有看到 Picoscope 波形上设置了这些 MSB。
例如、这里是我必须读取状态的代码:
def faults(rail): print("Page set to:", rail) I2C.write_byte_data(ADDRESS, PAGE_COMMAND, rail) time.sleep(0.5) PAGE = I2C.read_byte_data(ADDRESS, PAGE_COMMAND) print("Page read back: ", PAGE) time.sleep(0.5) # Vout Status STATUS_VOUT_get = I2C.read_byte_data(ADDRESS, STATUS_VOUT) if STATUS_VOUT_get != 0: Vout_status = "NOT OK" if STATUS_VOUT_get >> 7 & 1: print("*** VOUT_OV_FAULT") if STATUS_VOUT_get >> 6 & 1: print("*** VOUT_OV_WARNING") if STATUS_VOUT_get >> 5 & 1: print("*** VOUT_UV_WARNING") if STATUS_VOUT_get >> 4 & 1: print("*** VOUT_UV_FAULT") else: Vout_status = "OK" time.sleep(0.5) # Iout Status STATUS_IOUT_get = I2C.read_byte_data(ADDRESS, STATUS_IOUT) if STATUS_IOUT_get != 0: Iout_status = "NOT OK" if STATUS_IOUT_get >> 7 & 1: print("*** IOUT_OC_FAULT") if STATUS_IOUT_get >> 6 & 1: print("*** IOUT_OC_LV_FAULT") if STATUS_IOUT_get >> 5 & 1: print("*** IOUT_OC_WARNING") if STATUS_IOUT_get >> 4 & 1: print("*** IOUT_UC_FAULT") else: Iout_status = "OK" time.sleep(0.5) # Iout Status STATUS_TEMP_get = I2C.read_byte_data(ADDRESS, STATUS_TEMPERATURE) if STATUS_TEMP_get != 0: Temp_status = "NOT OK" if STATUS_TEMP_get >> 7 & 1: print("*** OT_FAULT") if STATUS_TEMP_get >> 6 & 1: print("*** OT_WARNING") else: Temp_status = "OK" print("STATUS_VOUT: {0:b} - 0x{0:x}".format(STATUS_VOUT_get, STATUS_VOUT_get)) print("STATUS_IOUT: {0:b} - 0x{0:x}".format(STATUS_IOUT_get, STATUS_IOUT_get)) print("STATUS_TEMP: {0:b} - 0x{0:x}".format(STATUS_TEMP_get, STATUS_TEMP_get)) return Vout_status, Iout_status, Temp_status ######################################################## Main for i in range(0, 6): print("\nMeasuring: {}".format(array_rail_name[i])) Vout_status, Iout_status, Temp_status = faults(array_rail[i]) print("Vout_status/Iout_status/Temp_status: {} / {} / {}".format(Vout_status, Iout_status, Temp_status)) time.sleep(1)
这里是终端的输出、您可以看到 VCC7电源轨 STATUS_TEMP 位的 MSB 设置、VCC5电源轨 STATUS_VOUT 的 MSB 设置了 MSN。 我不知道为什么 MSB 在根本没有故障时设置为1?
Measuring: VCC12 Page set to: 0 Page read back: 0 STATUS_VOUT: 0 - 0x0 STATUS_IOUT: 0 - 0x0 STATUS_TEMP: 0 - 0x0 Vout_status/Iout_status/Temp_status: OK / OK / OK Measuring: VCC7 Page set to: 1 Page read back: 1 *** OT_FAULT STATUS_VOUT: 0 - 0x0 STATUS_IOUT: 0 - 0x0 STATUS_TEMP: 10000000 - 0x80 Vout_status/Iout_status/Temp_status: OK / OK / NOT OK Measuring: VCC5 Page set to: 2 Page read back: 2 *** VOUT_OV_FAULT STATUS_VOUT: 10000000 - 0x80 STATUS_IOUT: 0 - 0x0 STATUS_TEMP: 0 - 0x0 Vout_status/Iout_status/Temp_status: NOT OK / OK / OK Measuring: VCC_3p3 Page set to: 3 Page read back: 3 STATUS_VOUT: 0 - 0x0 STATUS_IOUT: 0 - 0x0 STATUS_TEMP: 0 - 0x0 Vout_status/Iout_status/Temp_status: OK / OK / OK
PicoScope 示波器图像和波形: