diff --git a/firmware/src/main.c b/firmware/src/main.c index b87e3c8..5c8aeef 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -56,9 +56,10 @@ static void core1_loop() static void read_spin() { uint16_t angle = tmag5273_read_angle(); - printf("%5d:", angle); + float deg = angle / 16.0f; + printf("%7.2f:", deg); - angle /= 10; + angle /= 160; for (int i = 0; i < 36; i++) { char c = (i == angle) ? '*' : ' '; printf("%c", c); @@ -135,8 +136,14 @@ void init() gpio_pull_up(BUS_I2C_SDA); gpio_pull_up(BUS_I2C_SCL); - tmag5273_init(0, BUS_I2C, 0); - tmag5273_use(0); + gpio_init(21); + gpio_set_dir(21, GPIO_OUT); + gpio_put(21, 1); + + sleep_ms(1); + + tmag5273_init(1, BUS_I2C); + tmag5273_use(1); tmag5273_init_sensor(); cli_init("musec_pico>", "\n << Musec Pico Controller >>\n" diff --git a/firmware/src/tmag5273.c b/firmware/src/tmag5273.c index 30bf8be..0b39b61 100644 --- a/firmware/src/tmag5273.c +++ b/firmware/src/tmag5273.c @@ -20,14 +20,15 @@ static struct { i2c_inst_t *port; uint8_t addr; + uint16_t cache; } instances[16] = { { i2c0, TMAG5273_DEF_ADDR } }; +#define INSTANCE_NUM count_of(instances) static int current_instance = 0; +#define INSTANCE instances[current_instance] -#define INSTANCE_NUM (sizeof(instances) / sizeof(instances[0])) -#define I2C_PORT instances[current_instance].port -#define I2C_ADDR instances[current_instance].addr - +#define I2C_PORT INSTANCE.port +#define I2C_ADDR INSTANCE.addr static void write_reg(uint8_t reg, uint8_t value) { @@ -36,23 +37,6 @@ static void write_reg(uint8_t reg, uint8_t value) time_us_64() + IO_TIMEOUT_US); } -/* -static void write_reg16(uint8_t reg, uint16_t value) -{ - uint8_t data[3] = { reg, value >> 8, value & 0xff }; - i2c_write_blocking_until(I2C_PORT, I2C_ADDR, data, 3, false, - time_us_64() + IO_TIMEOUT_US); -} - -static void write_reg_list(const uint16_t *list) -{ - const uint16_t *regs = list + 1; - for (int i = 0; i < *list; i++) { - write_reg(regs[i] >> 8, regs[i] & 0xff); - } -} -*/ - static uint8_t read_reg(uint8_t reg) { uint8_t value; @@ -63,25 +47,6 @@ static uint8_t read_reg(uint8_t reg) return value; } -static uint16_t read_reg16(uint8_t reg) -{ - uint8_t value[2]; - i2c_write_blocking_until(I2C_PORT, I2C_ADDR, ®, 1, true, - time_us_64() + IO_TIMEOUT_US); - i2c_read_blocking_until(I2C_PORT, I2C_ADDR, value, 2, false, - time_us_64() + IO_TIMEOUT_US); - return (value[0] << 8) | value[1]; -} - -/* -static void write_many(uint8_t reg, const uint8_t *src, uint8_t len) -{ - i2c_write_blocking_until(I2C_PORT, I2C_ADDR, ®, 1, true, - time_us_64() + IO_TIMEOUT_US); - i2c_write_blocking_until(I2C_PORT, I2C_ADDR, src, len, false, - time_us_64() + IO_TIMEOUT_US); -} - static void read_many(uint8_t reg, uint8_t *dst, uint8_t len) { i2c_write_blocking_until(I2C_PORT, I2C_ADDR, ®, 1, true, @@ -89,13 +54,16 @@ static void read_many(uint8_t reg, uint8_t *dst, uint8_t len) i2c_read_blocking_until(I2C_PORT, I2C_ADDR, dst, len, false, time_us_64() + IO_TIMEOUT_US * len); } -*/ -void tmag5273_init(unsigned instance, i2c_inst_t *i2c_port, uint8_t i2c_addr) +void tmag5273_init(unsigned instance, i2c_inst_t *i2c_port) { if (instance < INSTANCE_NUM) { - instances[instance].port = i2c_port; - instances[instance].addr = i2c_addr ? i2c_addr : TMAG5273_DEF_ADDR; + current_instance = instance; + INSTANCE.port = i2c_port; + INSTANCE.addr = TMAG5273_DEF_ADDR; + if (instance > 0) { + tmag5273_change_addr(TMAG5273_DEF_ADDR + instance); + } } } @@ -114,7 +82,7 @@ bool tmag5273_is_present() bool tmag5273_change_addr(uint8_t i2c_addr) { tmag5273_write_reg(0x0c, (i2c_addr << 1) | 0x01); - instances[current_instance].addr = i2c_addr; + INSTANCE.addr = i2c_addr; uint8_t new_addr = tmag5273_read_reg(0x0c) >> 1; return new_addr == i2c_addr; } @@ -139,5 +107,11 @@ void tmag5273_write_reg(uint8_t addr, uint8_t value) uint16_t tmag5273_read_angle() { - return (read_reg16(0x19) & 0x1fff) >> 4; + uint8_t buf[3] = { 0 }; + read_many(0x18, buf, sizeof(buf)); + if (buf[0] & 0x01) { + INSTANCE.cache = (buf[1] << 8 | buf[2]) & 0x1fff; + } + printf("%4d(%d) ", INSTANCE.addr, current_instance); + return INSTANCE.cache; } diff --git a/firmware/src/tmag5273.h b/firmware/src/tmag5273.h index 26ef039..589a226 100644 --- a/firmware/src/tmag5273.h +++ b/firmware/src/tmag5273.h @@ -12,7 +12,7 @@ #include "hardware/i2c.h" -void tmag5273_init(unsigned instance, i2c_inst_t *i2c_port, uint8_t i2c_addr); +void tmag5273_init(unsigned instance, i2c_inst_t *i2c_port); void tmag5273_use(unsigned instance); bool tmag5273_is_present(); bool tmag5273_change_addr(uint8_t i2c_addr);