From 2466b7a2c6544fb585acb47871c75f2816629a2b Mon Sep 17 00:00:00 2001 From: "Dr. Matthew Swabey" Date: Tue, 21 Mar 2023 15:02:58 -0400 Subject: [PATCH] avr: Allow I2C bus speed to be set by Klipper (#6111) Allow I2C bus speed to be set by appropriate Klipper commands. Signed-off-by: Matthew Swabey --- docs/Config_Reference.md | 16 ++++++++-------- src/avr/i2c.c | 36 ++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/docs/Config_Reference.md b/docs/Config_Reference.md index 494a4733..4e648847 100644 --- a/docs/Config_Reference.md +++ b/docs/Config_Reference.md @@ -4508,20 +4508,20 @@ SPI bus. The following parameters are generally available for devices using an I2C bus. -Note that Klipper's current micro-controller support for i2c is -generally not tolerant to line noise. Unexpected errors on the i2c +Note that Klipper's current micro-controller support for I2C is +generally not tolerant to line noise. Unexpected errors on the I2C wires may result in Klipper raising a run-time error. Klipper's support for error recovery varies between each micro-controller type. -It is generally recommended to only use i2c devices that are on the +It is generally recommended to only use I2C devices that are on the same printed circuit board as the micro-controller. Most Klipper micro-controller implementations only support an -`i2c_speed` of 100000. The Klipper "linux" micro-controller supports a -400000 speed, but it must be +`i2c_speed` of 100000 (*standard mode*, 100kbit/s). The Klipper "Linux" +micro-controller supports a 400000 speed (*fast mode*, 400kbit/s), but it must be [set in the operating system](RPi_microcontroller.md#optional-enabling-i2c) and the `i2c_speed` parameter is otherwise ignored. The Klipper -"rp2040" micro-controller supports a rate of 400000 via the -`i2c_speed` parameter. All other Klipper micro-controllers use a +"RP2040" micro-controller and ATmega AVR family support a rate of 400000 +via the `i2c_speed` parameter. All other Klipper micro-controllers use a 100000 rate and ignore the `i2c_speed` parameter. ``` @@ -4539,5 +4539,5 @@ and the `i2c_speed` parameter is otherwise ignored. The Klipper # The I2C speed (in Hz) to use when communicating with the device. # The Klipper implementation on most micro-controllers is hard-coded # to 100000 and changing this value has no effect. The default is -# 100000. +# 100000. Linux, RP2040 and ATmega support 400000. ``` diff --git a/src/avr/i2c.c b/src/avr/i2c.c index 370582cc..658a30a1 100644 --- a/src/avr/i2c.c +++ b/src/avr/i2c.c @@ -27,31 +27,27 @@ static const uint8_t SCL = GPIO('D', 0), SDA = GPIO('D', 1); DECL_CONSTANT_STR("BUS_PINS_twi", "PD0,PD1"); #endif -static void -i2c_init(void) -{ - if (TWCR & (1<= 400000) + TWBR = ((CONFIG_CLOCK_FREQ / 400000) - 16) / 2; + else + TWBR = ((CONFIG_CLOCK_FREQ / 100000) - 16) / 2; + + // Enable interface + TWCR = (1<