Automatic tmag5273 multiple address handling

This commit is contained in:
whowechina
2024-10-03 14:14:51 +08:00
parent 242acffc96
commit 1f1d8de15b
3 changed files with 32 additions and 51 deletions
+11 -4
View File
@@ -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"
+20 -46
View File
@@ -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, &reg, 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, &reg, 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, &reg, 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;
}
+1 -1
View File
@@ -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);