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.
The following shows more complex automated test code for engineers to refer to and build more complex test code.
Because our Pro+ contains two I3C controllers, we can use the APIs of the two controllers together to complete more complex functions. For example, we can use the ez_debug_i3c_write() of the debug controller with adjusted parameters to perform a write operation, and then use the ez_i3c_write_read() of the main controller to read back the data. This can reversely verify whether the adjusted parameters affect the reading and writing of the bus:
# ========================================================================== # -------------------------------------------------------------------------- # Copyright © 2025 by Easyi3C, Inc. # All rights reserved. # ========================================================================== import sys from ezi3c.api import * from ezi3c.api_debug import * # Notes: You must make modifications based on your actual salve address slave_addr = 0x70 ez = ez_open() if not ez: print("Cannot open Adapter") sys.exit(-1) try: version = ez_get_version(ez) print("version:{:08X}".format(version)) clk = ez_get_bus_clk_freq(ez) print("POR Default Clk Freq(100, 1000): {}".format(clk)) clk = ez_set_bus_clk_freq(ez, 1000, 4000) print("Cur Clk Freq: {}".format(clk)) duty = ez_get_bus_clk_duty(ez) print("POR Default Clk Duty(50, 50): {}".format(duty)) duty = ez_set_bus_clk_duty(ez, 50, 40) print("Cur Clk Duty: {}".format(duty)) ret = ez_set_io_voltage(ez, 1.0) assert ret == 0 print("> RSTDAA ...") ez_ccc_rstdaa(ez) print("> i2c debug change timing parameter ...") ret = ez_debug_get_bus_od_clk_freq(ez) print("> i2c Default OD freq: {}".format(ret)) ez_debug_set_bus_od_clk_freq(ez, clk_khz=800, clk_duty=50, tSU_DAT=180) ret = ez_debug_get_bus_od_clk_freq(ez) print("> i2c Cur OD freq: {}".format(ret)) ret = ez_debug_get_od_ac_characteristics(ez, "tSU_STA") print("Default tSU_STA: {}ns".format(ret)) ez_debug_set_od_ac_characteristics(ez, "tSU_STA", 1000) ret = ez_debug_get_od_ac_characteristics(ez, "tSU_STA") print("Cur tSU_STA: {}ns".format(ret)) print("> i2c debug write & read ...") ret = ez_debug_i2c_write(ez, slave_addr, [0x40, 0xa1, 0xa2]) assert ret == E_OK ret, data = ez_debug_i2c_write_read(ez, slave_addr, 0x40, 2) assert ret == 0 assert data == (0xa1, 0xa2) print("> i2c debug insert spike ...") ret = ez_debug_i2c_write(ez, slave_addr, [0x40, 0xa1], spike_line="SDA", addr_spike=[['20%', 10]], wave_preview=True) print("> SETAASA ...") ez_ccc_setaasa(ez) print("> i3c debug change timing parameter ...") ret = ez_debug_get_bus_pp_clk_freq(ez) print("> i3c Default PP freq: {}".format(ret)) ret = ez_debug_set_bus_pp_clk_freq(ez, clk_khz=4000, clk_duty=50, tSU_DAT=20) ret = ez_debug_get_bus_pp_clk_freq(ez) print("> i3c Cur PP freq: {}".format(ret)) print("> i3c debug write & read ...") ret = ez_debug_i3c_write(ez, slave_addr, [0x40, 0xb3, 0xb4]) assert ret == 0 ret, data = ez_debug_i3c_write_read(ez, slave_addr, 0x40, 2) assert ret == 0 assert data == (0xb3, 0xb4) print("> i3c debug insert spike ...") ret = ez_debug_i3c_write(ez, slave_addr, [0x40, 0xa1], spike_line="SDA", addr_spike=[['20%', 10]], wave_preview=True) print("> i3c debug write & main controller read ...") ret = ez_debug_i3c_write(ez, slave_addr, [0x40, 0xb3, 0xb4]) assert ret == 0 ret, data = ez_i3c_write_read(ez, slave_addr, 0x40, 2) assert ret == 0 assert data == (0xb3, 0xb4) finally: ez_close(ez)