Easyi3C is a leading supplier of embedded system tools that simplify the development and debugging of various communication protocols. The company offers a range of products designed to help engineers and developers use I3C/I2C , USB and MIPI, JEDEC, MCTP and other protocols more efficiently.
Testing DDR5 RCD based on Tower I3C Host Adapter (3)
Based on the JEDEC Spec I2C write and read formats excerpted in the previous section, we have summarized the following APIs specifically for DDR5 RCD I2C:

With our supported APIs, you can easily test DDR5 RCD I2C.
The test environment is set up using the Tower I3C Host Adapter as shown in the following figure:

First, connect the Easyi3C Host I3C/I2C adapter to your computer using a USB Type-C cable, install the necessary USB drivers, and then connect it to the target using the cable provided by the manufacturer.
From Official website Download the corresponding software package: Easyi3C Tower I3C Host Adapter DDR5 Device API.
Easyi3C provides a Python API for DDR5 devices. Users must install Python before using the API. Easyi3C supports Python versions 3.8 to 3.13.
Notes: The Easyi3C DDR5 device API is based on the Easyi3C standard API. Before installation, you must ensure that the standard Easyi3C API package is installed.
The Easyi3C DDR5 device API is provided as a Python wheel package. Its name is:
After installing Python on the user's computer, execute the following command to install the Easyi3C DDR5 device package API:
Notes: The red box indicates the corresponding Python version. For example, if your Python version is 3.8, you must install ddr5-xxx-cp38-cp38-win-amd64.whl.
The above commands can also be used to upgrade to new versions of API packages.
To uninstall the package, please run:
# ==========================================================================
# Easyi3C Tower USB to I3C Host Adapter Interface Library
# --------------------------------------------------------------------------
# Copyright © 2026 by Easyi3C, Inc.
# All rights reserved.
# --------------------------------------------------------------------------
# ==========================================================================
import sys
from ezi3c.api import *
from ddr5 import Rcd
from ddr5 import Pmic0
import time
from ezi3c import crc
ez = ez_open()
if not ez:
print("Cannot open Adapter")
sys.exit(-1)
clk = ez_set_bus_clk_freq(ez, 1000, 4000)
print("Cur Clk Freq: {}".format(clk))
ret = ez_set_io_voltage(ez, 1.0)
assert ret == 0, "Faield to set IO voltage"
hid = 7
pmic0 = Pmic0(ez, hid=hid)
rcd = Rcd(ez, hid=hid)
try:
print("switch to i2c")
rcd.switch_to_i2c(send_ccc=True)
assert ret == 0, "Failed to reset DAA: addr:{:02X}".format(rcd.addr)
# VR Enable
pmic0.i2c_write_reg(0x32, 0xa0)
time.sleep(1) # make sure power is ready
print("I2C Read Test")
channel = 0
page = 3
device_id_reg = 0x6c
DEVICE_ID = (0x00, 0x51)
print("I2C Block Mode Read Test")
ret, data = rcd.i2c_block_read(channel, page, device_id_reg)
assert data[2:] == DEVICE_ID
print("I2C Block Mode Read Test with PEC")
rcd.enable_pec(send_ccc=False) # I2C enable pec no need send ccc
ret, data = rcd.i2c_block_read(channel, page, device_id_reg)
assert data[2:] == DEVICE_ID
rcd.disable_pec(send_ccc=False) # I2C disable pec no need send ccc
print("I2C Block Mode Read optimized Test")
ret, data = rcd.i2c_block_read_optimized(channel, page, device_id_reg)
assert data[2:] == DEVICE_ID
print("I2C Byte Mode Read Test")
ret, data = rcd.i2c_byte_read(channel, page, device_id_reg)
assert data[2:] == DEVICE_ID
print("I2C Byte Mode Read Test with PEC")
rcd.enable_pec(send_ccc=False) # I2C enable pec no need send ccc
ret, data = rcd.i2c_byte_read(channel, page, device_id_reg)
assert data[2:] == DEVICE_ID
rcd.disable_pec(send_ccc=False) # I2C disable pec no need send ccc
print("I2C Block Mode Write Byte Test")
channel = 0
page = 0
reg = 0x40
value = 0x50
ret = rcd.i2c_block_write_byte(channel, page, reg, value)
ret, data = rcd.i2c_block_read(channel, page, reg)
assert value == data[3]
print("I2C Block Mode Write Byte Test with PEC")
rcd.enable_pec(send_ccc=False) # I2C enable pec no need send ccc
value = 0x51
ret = rcd.i2c_block_write_byte(channel, page, reg, value)
ret, data = rcd.i2c_block_read(channel, page, reg)
assert value == data[3]
rcd.disable_pec(send_ccc=False) # I2C disable pec no need send ccc
print("I2C Block Mode Write Word Test")
value = 0x5152
ret = rcd.i2c_block_write_word(channel, page, reg, value)
ret, data = rcd.i2c_block_read(channel, page, reg)
assert value == data[2] << 8 | data[3]
print("I2C Block Mode Write Word Test with PEC")
rcd.enable_pec(send_ccc=False) # I2C enable pec no need send ccc
value = 0x5354
ret = rcd.i2c_block_write_word(channel, page, reg, value)
ret, data = rcd.i2c_block_read(channel, page, reg)
assert value == data[2] << 8 | data[3]
rcd.disable_pec(send_ccc=False) # I2C disable pec no need send ccc
print("I2C Block Mode Write DWord Test")
value = 0x55565758
ret = rcd.i2c_block_write_dword(channel, page, reg, value)
ret, data = rcd.i2c_block_read(channel, page, reg)
assert value == data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]
print("I2C Block Mode Write DWord Test with PEC")
rcd.enable_pec(send_ccc=False) # I2C enable pec no need send ccc
value = 0x50515253
ret = rcd.i2c_block_write_dword(channel, page, reg, value)
ret, data = rcd.i2c_block_read(channel, page, reg)
assert value == data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]
rcd.disable_pec(send_ccc=False) # I2C disable pec no need send ccc
finally:
rcd.ccc_rstdaa()
ez_close(ez)
print("Adapter closed.")Using the official API of the Tower I3C Host Adapter, the RCD I2C protocol can be easily tested, and engineers can perform many complex tests using our API. Next, we will explain how to test the RCD I3C protocol using the Tower I3C Host Adapter.