diff --git a/lib/cube/i2c_master.py b/lib/cube/i2c_master.py index 1b6ffd24aa3fc32eff6c5a51343a7906a6c1c636..029c807073a9d9998f6078f2a8c5f362afed7885 100644 --- a/lib/cube/i2c_master.py +++ b/lib/cube/i2c_master.py @@ -7,7 +7,7 @@ from lib.hw_defs.pins import UTZ_I2C_SDA_PIN, UTZ_I2C_SCK_PIN, I2C_STRONG_PULL_R from lib.robot_consts import I2C_MULTICUBE_FREQ, I2C_NXT_UTZ_BUS I2C_TIME_TRIGGER_REG = const(256-4) - +I2C_TIME_TRIGGER_WRITE_TIME = const(900) # us class I2C_master: def __init__(self, pcf_buttons): self.pcf_buttons = pcf_buttons @@ -38,11 +38,11 @@ class I2C_master: except Exception as e: return False return True - - def trigger(self, add, time_us, callback=None): + + def trigger(self, time_us, address, callback=None): try: time_start = time.ticks_us() - self.i2c.writeto_mem(add, I2C_TIME_TRIGGER_REG, time_us.to_bytes(4, 'little')) + self.i2c.writeto_mem(address, I2C_TIME_TRIGGER_REG, time_us.to_bytes(4, 'little')) time_diff = time_us-time.ticks_diff(time.ticks_us(), time_start) print("Time diff: ", time_diff) if callback: @@ -55,6 +55,31 @@ class I2C_master: return False return True + def trigger_all(self, time_us, addresses=None, callback=None): + try: + time_start = time.ticks_us() + if not addresses: + addresses = self.i2c.scan() + time_scan = time_start-time.ticks_us() + time_reserve = time_scan - len(addresses)*I2C_TIME_TRIGGER_WRITE_TIME + if time_reserve < 0: + return False + + time_next = time_scan + for i in range(len(addresses)): + time_slave = time.ticks_us() + self.i2c.writeto_mem(addresses[0], I2C_TIME_TRIGGER_REG, time_next.to_bytes(4, 'little')) + time_next = time_next - time.ticks_diff(time.ticks_us(), time_slave) + print("Time diff: ", time_next) + if callback: + if time_next > 0: + self.trigger_timer.init(freq=1000000/time_next, mode=Timer.ONE_SHOT, callback=callback) + else: + callback(None) + except Exception as e: + return False + return True + def deinit(self): self.trigger_timer.deinit() self.i2c = None diff --git a/menu_programs/i2c_master.py b/menu_programs/i2c_master.py index 9d633247f17a5e2ec49334df233b2cd0a689038c..2c99e61aca29c5b924e75598cca92963fa22d648 100644 --- a/menu_programs/i2c_master.py +++ b/menu_programs/i2c_master.py @@ -80,7 +80,9 @@ def i2c_master_run(robot): data_sending = data_sending % 26 debounce = True if buttons[Button.OK]: - robot.i2c_master.trigger(slave_add, SLAVE_TRIGGER_TIME, callback=master_trigger_callback) + trigger = robot.i2c_master.trigger_all(SLAVE_TRIGGER_TIME, adressed=all_add, callback=master_trigger_callback) + if not trigger: + break debounce = True if buttons[Button.RIGHT]: #robot.buttons.set_pin(I2C_STRONG_PULL_RPIN_BIT, True)