From 9fc894b66a2d923587152aab7bb32826a956925d Mon Sep 17 00:00:00 2001 From: whowechina Date: Thu, 27 Nov 2025 14:11:49 +0800 Subject: [PATCH] I2C speed options --- Production/Firmware/musec_pico.uf2 | Bin 102912 -> 102400 bytes firmware/src/board_defs.h | 3 ++- firmware/src/commands.c | 32 ++++++++++++++++++++++++++--- firmware/src/config.c | 1 + firmware/src/config.h | 4 +++- firmware/src/spin.c | 17 ++++++++++----- 6 files changed, 47 insertions(+), 10 deletions(-) diff --git a/Production/Firmware/musec_pico.uf2 b/Production/Firmware/musec_pico.uf2 index 0f06d1734916303633e4bb957c31662534e122dc..27a0f99797bb58435e57b7d0c6964a9cd88dec1e 100644 GIT binary patch delta 13752 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 diff --git a/firmware/src/board_defs.h b/firmware/src/board_defs.h index f81077b..0ca745a 100644 --- a/firmware/src/board_defs.h +++ b/firmware/src/board_defs.h @@ -12,7 +12,8 @@ #define BUS_I2C i2c0 #define BUS_I2C_SDA 0 #define BUS_I2C_SCL 1 -#define BUS_I2C_FREQ 266*1000 +#define BUS_I2C_FREQ 166*1000 +#define BUS_I2C_FAST_FREQ 400*1000 #define SPIN_DEF { 13, 12, 11, 10, 9 } diff --git a/firmware/src/commands.c b/firmware/src/commands.c index 2590084..76a25af 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -27,11 +27,12 @@ static void disp_light() static void disp_spin() { printf("[Spin]\n"); + printf(" Fast I2C: %s.\n", musec_cfg->spin.fast_i2c ? "ON" : "OFF"); printf(" Units Per Turn: %d.\n", musec_cfg->spin.units_per_turn); for (int i = 0; i < 5; i++) { printf(" Spinner %d: %s, %s.\n", i + 1, spin_present(i) ? "OK" : "ERROR", - musec_cfg->spin.reversed[i] ? "Reversed" : "Forward"); + musec_cfg->spin.reversed & (1 << i) ? "Reversed" : "Forward"); } } @@ -137,15 +138,36 @@ static void handle_spin_invert(int id, const char *dir) return; } - musec_cfg->spin.reversed[id] = match; + if (match == 0) { + musec_cfg->spin.reversed &= ~(1 << id); + } else if (match == 1) { + musec_cfg->spin.reversed |= (1 << id); + } config_changed(); disp_spin(); } +static void handle_i2c_option(const char *option) +{ + const char *usage = "Usage: spin fast_i2c \n"; + const char *choices[] = {"off", "on"}; + int match = cli_match_prefix(choices, count_of(choices), option); + if (match < 0) { + printf(usage); + return; + } + + musec_cfg->spin.fast_i2c = match; + save_request(true); // immediate save + disp_spin(); + printf("Note: Please reboot the device to apply I2C speed change.\n"); +} + static void handle_spin(int argc, char *argv[]) { const char *usage = "Usage: spin rate \n" + " spin fast_i2c \n" " spin \n" " units_per_turn: 20..255\n" " id: 1..5\n"; @@ -154,7 +176,7 @@ static void handle_spin(int argc, char *argv[]) return; } - const char *choices[] = { "1", "2", "3", "4", "5", "rate" }; + const char *choices[] = { "1", "2", "3", "4", "5", "fast_i2c", "rate" }; int match = cli_match_prefix(choices, count_of(choices), argv[0]); if (match < 0) { printf(usage); @@ -162,6 +184,10 @@ static void handle_spin(int argc, char *argv[]) } if (match == 5) { + handle_i2c_option(argv[1]); + return; + } + if (match == 6) { handle_spin_rate(argv[1]); return; } diff --git a/firmware/src/config.c b/firmware/src/config.c index a6c38de..2398cde 100644 --- a/firmware/src/config.c +++ b/firmware/src/config.c @@ -13,6 +13,7 @@ musec_cfg_t *musec_cfg; static musec_cfg_t default_cfg = { .spin = { + .fast_i2c = false, .units_per_turn = 80, }, .light = { diff --git a/firmware/src/config.h b/firmware/src/config.h index 5649c01..012e3f6 100644 --- a/firmware/src/config.h +++ b/firmware/src/config.h @@ -17,7 +17,9 @@ typedef struct { typedef struct __attribute__((packed)) { struct { uint8_t units_per_turn; - uint8_t reversed[5]; + bool fast_i2c; + uint8_t reversed; + uint8_t reserved[3]; } spin; struct { bool internal; diff --git a/firmware/src/spin.c b/firmware/src/spin.c index e5ababa..4f47ac6 100644 --- a/firmware/src/spin.c +++ b/firmware/src/spin.c @@ -31,7 +31,12 @@ void spin_init() gpio_init(BUS_I2C_SCL); gpio_set_function(BUS_I2C_SCL, GPIO_FUNC_I2C); gpio_pull_up(BUS_I2C_SCL); - i2c_init(BUS_I2C, BUS_I2C_FREQ); + + if (musec_cfg->spin.fast_i2c) { + i2c_init(BUS_I2C, BUS_I2C_FAST_FREQ); + } else { + i2c_init(BUS_I2C, BUS_I2C_FREQ); + } for (int i = 0; i < SPIN_NUM; i++) { uint8_t ce = spin_enablers[i]; @@ -66,19 +71,21 @@ static uint16_t spin_reading[SPIN_NUM]; void spin_update() { - static bool flip = false; - flip = !flip; + static int count = 0; for (int i = 0; i < SPIN_NUM; i++) { - if (flip ^ (i % 2)) { + if (!musec_cfg->spin.fast_i2c && (i != count)) { continue; } + tmag5273_use(i); spin_reading[i] = tmag5273_read_angle(); - if (musec_cfg->spin.reversed[i]) { + if (musec_cfg->spin.reversed & (1 << i)) { spin_reading[i] = FULL_SCALE - spin_reading[i]; } } + + count = (count + 1) % SPIN_NUM; } uint16_t spin_read(uint8_t index)