mirror of
https://github.com/whowechina/geki_pico.git
synced 2024-11-30 18:24:29 +01:00
Auto slave address for instances
This commit is contained in:
parent
0205c3f71c
commit
e370fcc4a2
Binary file not shown.
@ -64,8 +64,8 @@ void airkey_init()
|
|||||||
gpio_pull_up(scl);
|
gpio_pull_up(scl);
|
||||||
gpio_pull_up(sda);
|
gpio_pull_up(sda);
|
||||||
|
|
||||||
vl53l0x_init(i, tof_ports[i], 0);
|
vl53l0x_init(i, tof_ports[i]);
|
||||||
vl53l1x_init(i, tof_ports[i], 0);
|
vl53l1x_init(i, tof_ports[i]);
|
||||||
vl53l0x_use(i);
|
vl53l0x_use(i);
|
||||||
vl53l1x_use(i);
|
vl53l1x_use(i);
|
||||||
|
|
||||||
|
@ -148,6 +148,7 @@ static int current_instance = 0;
|
|||||||
#define INSTANCE_NUM (sizeof(instances) / sizeof(instances[0]))
|
#define INSTANCE_NUM (sizeof(instances) / sizeof(instances[0]))
|
||||||
#define I2C_PORT instances[current_instance].port
|
#define I2C_PORT instances[current_instance].port
|
||||||
#define I2C_ADDR instances[current_instance].addr
|
#define I2C_ADDR instances[current_instance].addr
|
||||||
|
#define INSTANCE instances[current_instance]
|
||||||
|
|
||||||
static void write_reg(uint8_t reg, uint8_t value)
|
static void write_reg(uint8_t reg, uint8_t value)
|
||||||
{
|
{
|
||||||
@ -216,14 +217,24 @@ const uint16_t reg_tuning[] = { 80,
|
|||||||
0xff00, 0x8001, 0x01f8, 0xff01, 0x8e01, 0x0001, 0xff00, 0x8000,
|
0xff00, 0x8001, 0x01f8, 0xff01, 0x8e01, 0x0001, 0xff00, 0x8000,
|
||||||
};
|
};
|
||||||
|
|
||||||
void vl53l0x_init(unsigned instance, i2c_inst_t *i2c_port, uint8_t i2c_addr)
|
void vl53l0x_init(unsigned instance, i2c_inst_t *i2c_port)
|
||||||
{
|
{
|
||||||
if (instance < INSTANCE_NUM) {
|
if (instance < INSTANCE_NUM) {
|
||||||
instances[instance].port = i2c_port;
|
current_instance = instance;
|
||||||
instances[instance].addr = i2c_addr ? i2c_addr : VL53L0X_DEF_ADDR;
|
INSTANCE.port = i2c_port;
|
||||||
|
INSTANCE.addr = VL53L0X_DEF_ADDR;
|
||||||
|
vl53l0x_change_addr(VL53L0X_DEF_ADDR + 1 + instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool vl53l0x_change_addr(uint8_t i2c_addr)
|
||||||
|
{
|
||||||
|
write_reg(I2C_SLAVE_DEVICE_ADDRESS, i2c_addr);
|
||||||
|
INSTANCE.addr = i2c_addr;
|
||||||
|
read_reg(I2C_SLAVE_DEVICE_ADDRESS); // Dummy read
|
||||||
|
return read_reg(I2C_SLAVE_DEVICE_ADDRESS) == i2c_addr;
|
||||||
|
}
|
||||||
|
|
||||||
void vl53l0x_use(unsigned instance)
|
void vl53l0x_use(unsigned instance)
|
||||||
{
|
{
|
||||||
if (instance < INSTANCE_NUM) {
|
if (instance < INSTANCE_NUM) {
|
||||||
|
@ -13,7 +13,9 @@
|
|||||||
|
|
||||||
#include "hardware/i2c.h"
|
#include "hardware/i2c.h"
|
||||||
|
|
||||||
void vl53l0x_init(unsigned instance, i2c_inst_t *i2c_port, uint8_t i2c_addr);
|
void vl53l0x_init(unsigned instance, i2c_inst_t *i2c_port);
|
||||||
|
bool vl53l0x_change_addr(uint8_t i2c_addr);
|
||||||
|
|
||||||
void vl53l0x_use(unsigned instance);
|
void vl53l0x_use(unsigned instance);
|
||||||
bool vl53l0x_is_present();
|
bool vl53l0x_is_present();
|
||||||
bool vl53l0x_init_tof();
|
bool vl53l0x_init_tof();
|
||||||
|
@ -1387,14 +1387,23 @@ static void read_many(uint16_t reg, uint8_t *dst, uint8_t len)
|
|||||||
false, time_us_64() + IO_TIMEOUT_US * len);
|
false, time_us_64() + IO_TIMEOUT_US * len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vl53l1x_init(unsigned instance, i2c_inst_t *i2c_port, uint8_t i2c_addr)
|
void vl53l1x_init(unsigned instance, i2c_inst_t *i2c_port)
|
||||||
{
|
{
|
||||||
if (instance < INSTANCE_NUM) {
|
if (instance < INSTANCE_NUM) {
|
||||||
instances[instance].port = i2c_port;
|
current_instance = instance;
|
||||||
instances[instance].addr = i2c_addr ? i2c_addr : VL53L1X_DEF_ADDR;
|
INSTANCE.port = i2c_port;
|
||||||
|
INSTANCE.addr = VL53L1X_DEF_ADDR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool vl53l1x_change_addr(uint8_t i2c_addr)
|
||||||
|
{
|
||||||
|
write_reg(I2C_SLAVE__DEVICE_ADDRESS, i2c_addr);
|
||||||
|
INSTANCE.addr = i2c_addr;
|
||||||
|
read_reg(I2C_SLAVE__DEVICE_ADDRESS); // dummy read
|
||||||
|
return read_reg(I2C_SLAVE__DEVICE_ADDRESS) == I2C_ADDR;
|
||||||
|
}
|
||||||
|
|
||||||
void vl53l1x_use(unsigned instance)
|
void vl53l1x_use(unsigned instance)
|
||||||
{
|
{
|
||||||
if (instance < INSTANCE_NUM) {
|
if (instance < INSTANCE_NUM) {
|
||||||
@ -1421,6 +1430,7 @@ bool vl53l1x_init_tof()
|
|||||||
// call below and the Arduino 101 doesn't seem to handle that well
|
// call below and the Arduino 101 doesn't seem to handle that well
|
||||||
sleep_us(1000);
|
sleep_us(1000);
|
||||||
|
|
||||||
|
vl53l1x_change_addr(VL53L1X_DEF_ADDR + 1 + current_instance);
|
||||||
// VL53L1_poll_for_boot_completion() begin
|
// VL53L1_poll_for_boot_completion() begin
|
||||||
|
|
||||||
uint64_t start = time_us_64();
|
uint64_t start = time_us_64();
|
||||||
|
@ -12,7 +12,8 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "hardware/i2c.h"
|
#include "hardware/i2c.h"
|
||||||
|
|
||||||
void vl53l1x_init(unsigned instance, i2c_inst_t *i2c_port, uint8_t i2c_addr);
|
void vl53l1x_init(unsigned instance, i2c_inst_t *i2c_port);
|
||||||
|
bool vl53l1x_change_addr(uint8_t i2c_addr);
|
||||||
void vl53l1x_use(unsigned instance);
|
void vl53l1x_use(unsigned instance);
|
||||||
bool vl53l1x_is_present();
|
bool vl53l1x_is_present();
|
||||||
bool vl53l1x_init_tof();
|
bool vl53l1x_init_tof();
|
||||||
|
Loading…
Reference in New Issue
Block a user