diff --git a/klippy/extras/bus.py b/klippy/extras/bus.py index ceeed732..c07ec826 100644 --- a/klippy/extras/bus.py +++ b/klippy/extras/bus.py @@ -160,6 +160,8 @@ class MCU_I2C: self.bus = bus self.i2c_address = addr self.oid = self.mcu.create_oid() + self.speed = speed + self.config_fmt_ticks = None mcu.add_config_cmd("config_i2c oid=%d" % (self.oid,)) # Generate I2C bus config message if sw_pins is not None: @@ -167,6 +169,10 @@ class MCU_I2C: "i2c_set_software_bus oid=%d" " scl_pin=%s sda_pin=%s rate=%d address=%d" % (self.oid, sw_pins[0], sw_pins[1], speed, addr)) + self.config_fmt_ticks = ( + "i2c_set_sw_bus oid=%d" + " scl_pin=%s sda_pin=%s pulse_ticks=%%d address=%d" + % (self.oid, sw_pins[0], sw_pins[1], addr)) else: self.config_fmt = ( "i2c_set_bus oid=%d i2c_bus=%%s rate=%d address=%d" @@ -186,6 +192,12 @@ class MCU_I2C: if '%' in self.config_fmt: bus = resolve_bus_name(self.mcu, "i2c_bus", self.bus) self.config_fmt = self.config_fmt % (bus,) + if self.config_fmt_ticks: + if self.mcu.try_lookup_command("i2c_set_sw_bus oid=%c" + " scl_pin=%u sda_pin=%u" + " pulse_ticks=%u address=%u"): + pulse_ticks = self.mcu.seconds_to_clock(1./self.speed/2) + self.config_fmt = self.config_fmt_ticks % (pulse_ticks,) self.mcu.add_config_cmd(self.config_fmt) self.i2c_write_cmd = self.mcu.lookup_command( "i2c_write oid=%c data=%*s", cq=self.cmd_queue) diff --git a/src/i2c_software.c b/src/i2c_software.c index 805cef2d..01fce4c6 100644 --- a/src/i2c_software.c +++ b/src/i2c_software.c @@ -22,28 +22,21 @@ struct i2c_software { }; void -command_i2c_set_software_bus(uint32_t *args) +command_i2c_set_sw_bus(uint32_t *args) { struct i2cdev_s *i2c = i2cdev_oid_lookup(args[0]); struct i2c_software *is = alloc_chunk(sizeof(*is)); - uint32_t rate = args[3]; - is->ticks = CONFIG_CLOCK_FREQ / (100000 * 2); // 100KHz + is->ticks = args[3]; is->addr = (args[4] & 0x7f) << 1; // address format shifted is->scl_in = gpio_in_setup(args[1], 1); is->scl_out = gpio_out_setup(args[1], 1); is->sda_in = gpio_in_setup(args[2], 1); is->sda_out = gpio_out_setup(args[2], 1); - while (rate > 100000) { - rate = rate >> 1; - if (rate < 100000) - break; - is->ticks = is->ticks >> 1; - } i2cdev_set_software_bus(i2c, is); } -DECL_COMMAND(command_i2c_set_software_bus, - "i2c_set_software_bus oid=%c scl_pin=%u sda_pin=%u" - " rate=%u address=%u"); +DECL_COMMAND(command_i2c_set_sw_bus, + "i2c_set_sw_bus oid=%c scl_pin=%u sda_pin=%u" + " pulse_ticks=%u address=%u"); // The AVR micro-controllers require specialized timing #if CONFIG_MACH_AVR