I2C接口与Bosh BMI270 IMU

了解更多常见问题教程

7个职位/ 0个新职位
最后发表
瘸子帮
离线
最后看到:4个月1个星期前
加入:2018-11-18 04:54
I2C接口与Bosh BMI270 IMU

你好,团队对话,

我一直在努力设置BMI270超过I2C接口。Bosh BMI 270 IMU提供了一个API,可以从

https://github.com/BoschSensortec/BMI270-Sensor-API

对于DA14585,我遵循了i2c_eeprom项目指令。如果下面的函数可以用例子来说明,我将非常感激。

致意

* @brief通过I2C总线写入传感器寄存器的功能。

* @param[in] i2c_addr:传感器I2C地址。
* @param[in] reg_addr:寄存器地址。
* @param[in] reg_data:指向要写入的数据缓冲区的指针。
* @param[in] length:要写入的字节数。

* @return执行状态
* @retval 0 ->成功
* @retval >0 ->故障信息

*/
Int8_t i2c_reg_write(uint8_t i2c_addr, uint8_t reg_addr, const uint8_t *reg_data, uint16_t length)

/*使用I2C写入寄存器。返回0表示执行成功。*/
返回0;

/*!
*@通过I2C总线读取传感器寄存器的简短功能。

* @param[in] i2c_addr:传感器I2C地址。
* @param[in] reg_addr:寄存器地址。
* @param[out] reg_data:指向存储读取数据的数据缓冲区的指针。
* @param[in] length:要读取的字节数。

* @return执行状态
* @retval 0 ->成功
* @retval >0 ->故障信息

*/
Int8_t i2c_reg_read(uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)

/*使用I2C读取寄存器。返回0表示执行成功。*/
返回0;

设备:
IM_Dialog
离线
最后看到:6天6小时前
加入:2016-12-06 22:25
嗨,瘸子帮,

嗨,瘸子帮,

我们最近发布了一个例子,展示了如何与博世BMP388接口:

//www.wsdof.com/sites/default/files/da14531_ble_pre..。

这个例子是针对DA14531的,但是DA14585共享相同的SDK,所以这个例子应该会给你你正在寻找的API例子。

致以最亲切的问候

IM_Dialog

瘸子帮
离线
最后看到:4个月1个星期前
加入:2018-11-18 04:54
我使用了建议的API i2c

我使用了BMP388项目中建议的API i2c函数。但是,我没有在i2c总线上得到任何总线事务。请让我知道我可能做错了什么。
提前谢谢。

int8_t i2c_init(空白)

GPIO_配置引脚(I2C_GPIO_端口、I2C_SCL_引脚、输入、PID_I2C_SCL、假);
GPIO_配置引脚(I2C_GPIO_端口、I2C_SDA_引脚、输入、PID_I2C_SDA、假);
SetBits16 (CLK_16M_REG XTAL16_BIAS_SH_ENABLE 1);


cfg - > clock_cfg。ss_hcnt = I2C_SS_SCL_HCNT_REG;
cfg - > clock_cfg。ss_lcnt = I2C_SS_SCL_LCNT_REG;
cfg - > clock_cfg。fs_hcnt = I2C_FS_SCL_HCNT_REG;
cfg - > clock_cfg。fs_lcnt = I2C_FS_SCL_LCNT_REG;

cfg - >速度= I2C_SPEED_FAST;
cfg - >模式= I2C_MODE_MASTER;
cfg - > addr_mode = I2C_ADDRESSING_7B;
cfg - >地址= 0 x68;
Cfg ->tx_fifo_level = Cfg ->rx_fifo_level = 32;

GLOBAL_INT_DISABLE ();

//启用到R/W i2c寄存器的i2c时钟
i2c_set_clock_status (I2C_CLOCK_ENABLE);

//启用中断
GLOBAL_INT_RESTORE ();

i2c设置控制器状态(i2c控制器禁用);
而(i2c_get_controller_status () ! = I2C_CONTROLLER_DISABLE);

i2c_set_int_mask (0 x0000);

// SCL时钟设置
SetWord16 (i2c - > I2C_SS_SCL_HCNT_REGF cfg - > clock_cfg.ss_hcnt);
SetWord16 (i2c - > I2C_SS_SCL_LCNT_REGF cfg - > clock_cfg.ss_lcnt);

SetWord16 (i2c - > I2C_FS_SCL_HCNT_REGF cfg - > clock_cfg.fs_hcnt);
SetWord16 (i2c - > I2C_FS_SCL_LCNT_REGF cfg - > clock_cfg.fs_lcnt);

//设定速度模式
// SetBits16(&i2c->I2C_CON_REGF, I2C_SPEED, cfg->speed);
设置16(&i2c->i2c控制寄存器,i2c速度,i2c速度快);

//设置fifo级别
断言警告(32!=0);
断言警告(32!=0);
SetBits16(&i2c->I2C_TX_TL_REGF, RX_TL, 32- 1);
SetBits16(&i2c->I2C_RX_TL_REGF, RX_TL, 32 - 1);

//设置I2C master
i2c_setup_master (I2C_RESTART_ENABLE I2C_ADDRESSING_7B 0 x68);

i2c_set_controller_status (I2C_CONTROLLER_ENABLE);
//启用或禁用控制器有两个ic_clk延迟
而((i2c_获取_控制器_状态()!=i2c_控制器_启用));

//设置I2C中断的优先级为2级
NVIC_设置优先级(I2C_IRQn,2);
//开启I2C中断
NVIC_EnableIRQ (I2C_IRQn);
/*根据目标机实现I2C总线初始化。*/
返回0;

Int8_t reg_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr)

/*使用I2C写入寄存器。返回0表示执行成功。*/

Int ret = 0;
uint16_t bytes_written;
i2c_abort_t abrt_code;

uint32_t flags = I2C_F_NONE;

/*总线上的每个I2C设备都有一个唯一的地址,在通信之前设置这个地址*/

set_dev_addr (reg_addr);

/*执行分块写入*/
bytes_write = i2c_master_transmit_buffer_sync(reg_data, length, & abt_code, flags);

if ((I2C_ABORT_NONE != abt_code) || (bytes_write != length)) {
ret=-1;

返回受潮湿腐烂;

int8_t i2c_reg_读取(uint8_t reg_addr,uint8_t*reg_数据,uint32_t长度,void*intf_ptr)

int ret = 0;
uint16_t bytes_read;
i2c_abort_t abrt_code;
uint32_t flags = I2C_F_NONE;

set_dev_addr (reg_addr);

Bytes_read = i2c_master_receive_buffer_sync(reg_data, length, & abt_code, flags);

if ((abt_code != I2C_ABORT_NONE) || (bytes_read != length)) {
ret=-1;

返回受潮湿腐烂;

瘸子帮
离线
最后看到:4个月1个星期前
加入:2018-11-18 04:54
我使用了建议的API i2c

我使用了BMP388项目中建议的API i2c函数。但是,我没有在i2c总线上得到任何总线事务。请让我知道我可能做错了什么。
提前谢谢。

int8_t i2c_init(空白)

GPIO_配置引脚(I2C_GPIO_端口、I2C_SCL_引脚、输入、PID_I2C_SCL、假);
GPIO_配置引脚(I2C_GPIO_端口、I2C_SDA_引脚、输入、PID_I2C_SDA、假);
SetBits16 (CLK_16M_REG XTAL16_BIAS_SH_ENABLE 1);


cfg - > clock_cfg。ss_hcnt = I2C_SS_SCL_HCNT_REG;
cfg - > clock_cfg。ss_lcnt = I2C_SS_SCL_LCNT_REG;
cfg - > clock_cfg。fs_hcnt = I2C_FS_SCL_HCNT_REG;
cfg - > clock_cfg。fs_lcnt = I2C_FS_SCL_LCNT_REG;

cfg - >速度= I2C_SPEED_FAST;
cfg - >模式= I2C_MODE_MASTER;
cfg - > addr_mode = I2C_ADDRESSING_7B;
cfg - >地址= 0 x68;
Cfg ->tx_fifo_level = Cfg ->rx_fifo_level = 32;

GLOBAL_INT_DISABLE ();

//启用到R/W i2c寄存器的i2c时钟
i2c_set_clock_status (I2C_CLOCK_ENABLE);

//启用中断
GLOBAL_INT_RESTORE ();

i2c设置控制器状态(i2c控制器禁用);
而(i2c_get_controller_status () ! = I2C_CONTROLLER_DISABLE);

i2c_set_int_mask (0 x0000);

// SCL时钟设置
SetWord16 (i2c - > I2C_SS_SCL_HCNT_REGF cfg - > clock_cfg.ss_hcnt);
SetWord16 (i2c - > I2C_SS_SCL_LCNT_REGF cfg - > clock_cfg.ss_lcnt);

SetWord16 (i2c - > I2C_FS_SCL_HCNT_REGF cfg - > clock_cfg.fs_hcnt);
SetWord16 (i2c - > I2C_FS_SCL_LCNT_REGF cfg - > clock_cfg.fs_lcnt);

//设定速度模式
// SetBits16(&i2c->I2C_CON_REGF, I2C_SPEED, cfg->speed);
设置16(&i2c->i2c控制寄存器,i2c速度,i2c速度快);

//设置fifo级别
断言警告(32!=0);
断言警告(32!=0);
SetBits16(&i2c->I2C_TX_TL_REGF, RX_TL, 32- 1);
SetBits16(&i2c->I2C_RX_TL_REGF, RX_TL, 32 - 1);

//设置I2C master
i2c_setup_master (I2C_RESTART_ENABLE I2C_ADDRESSING_7B 0 x68);

i2c_set_controller_status (I2C_CONTROLLER_ENABLE);
//启用或禁用控制器有两个ic_clk延迟
而((i2c_获取_控制器_状态()!=i2c_控制器_启用));

//设置I2C中断的优先级为2级
NVIC_设置优先级(I2C_IRQn,2);
//开启I2C中断
NVIC_EnableIRQ (I2C_IRQn);
/*根据目标机实现I2C总线初始化。*/
返回0;

Int8_t reg_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr)

/*使用I2C写入寄存器。返回0表示执行成功。*/

Int ret = 0;
uint16_t bytes_written;
i2c_abort_t abrt_code;

uint32_t flags = I2C_F_NONE;

/*总线上的每个I2C设备都有一个唯一的地址,在通信之前设置这个地址*/

set_dev_addr (reg_addr);

/*执行分块写入*/
bytes_write = i2c_master_transmit_buffer_sync(reg_data, length, & abt_code, flags);

if ((I2C_ABORT_NONE != abt_code) || (bytes_write != length)) {
ret=-1;

返回受潮湿腐烂;

int8_t i2c_reg_读取(uint8_t reg_addr,uint8_t*reg_数据,uint32_t长度,void*intf_ptr)

int ret = 0;
uint16_t bytes_read;
i2c_abort_t abrt_code;
uint32_t flags = I2C_F_NONE;

set_dev_addr (reg_addr);

Bytes_read = i2c_master_receive_buffer_sync(reg_data, length, & abt_code, flags);

if ((abt_code != I2C_ABORT_NONE) || (bytes_read != length)) {
ret=-1;

返回受潮湿腐烂;

IM_Dialog
离线
最后看到:6天6小时前
加入:2016-12-06 22:25
嗨,瘸子帮,

嗨,瘸子帮,

检查您用于I2C接口的GPIO是否在user_periph_setup.c文件中找到的set_pad_functions函数中正确配置。

致以最亲切的问候

IM_Dialog

瘸子帮
离线
最后看到:4个月1个星期前
加入:2018-11-18 04:54
你好,对话框,

你好,对话框,

不便之处,敬请原谅。我已经检查了这个设置。我还是不能让它工作....

我只需要用到这三个函数

* @brief通过I2C总线写入传感器寄存器的功能。

* @param[in] i2c_addr:传感器I2C地址。
* @param[in] reg_addr:寄存器地址。
* @param[in] reg_data:指向要写入的数据缓冲区的指针。
* @param[in] length:要写入的字节数。

* @return执行状态
* @retval 0 ->成功
* @retval >0 ->故障信息

*/
Int8_t i2c_reg_write(uint8_t i2c_addr, uint8_t reg_addr, const uint8_t *reg_data, uint16_t length)

/*使用I2C写入寄存器。返回0表示执行成功。*/
返回0;

/*!
*@通过I2C总线读取传感器寄存器的简短功能。

* @param[in] i2c_addr:传感器I2C地址。
* @param[in] reg_addr:寄存器地址。
* @param[out] reg_data:指向存储读取数据的数据缓冲区的指针。
* @param[in] length:要读取的字节数。

* @return执行状态
* @retval 0 ->成功
* @retval >0 ->故障信息

*/
Int8_t i2c_reg_read(uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)

/*使用I2C读取寄存器。返回0表示执行成功。*/
返回0;

PM_Dialog
离线
最后看到:13小时10分钟前
工作人员
加入:2018-02-08 11:03
嗨,瘸子帮,

嗨,瘸子帮,

请您使用逻辑分析仪,探测I2C信号并共享快照好吗?

你是否遵循了IM_Dialog所建议的示例?

谢谢,PM_Dialog