您好!
我正在尝试使用 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 示波器图像和波形: