与BOSH BMI270 IMU的I2C接口

了解更多常见问题解答教程

7个帖子/ 0新
最后一篇
瘸子
离线
最后一次露面:4个月5天前
加入:2018-11-18 04:54
与BOSH BMI270 IMU的I2C接口

Hello Team Dialog,

我一直在努力通过I2C接口设置BMI270。BOSH BMI 270 IMU提供了可以从中重试的API

https://github.com/boschsensortec/bmi270-sensor-api.

对于DA14585,我遵循了I2C_EEPROM项目指令。如果可以用例子说明以下功能的样本,我将非常理解。

是st Regards

* @brief函数通过i2c总线编写传感器的寄存器。
*
* @param [in] i2c_addr:传感器I2C地址。
* @param [in] reg_addr:注册地址。
* @param [in] reg_data:指向要写入值的数据缓冲区。
* @param [in]长度:编写的no字节。
*
* @return执行状态
* @retval 0 - >成功
* @retval> 0 - >失败信息
*
* /
INT8_T I2C_REG_WRITE(UINT8_T I2C_ADDR,UINT8_T REG_ADDR,CONSS UINT8_T * REG_DATA,UINT16_T长度)
{

/ *使用i2c写入寄存器。返回0以成功执行。* /
返回0;
}

/ *!
*@brief Function for reading the sensor's registers through I2C bus.
*
* @param [in] i2c_addr:传感器I2C地址。
* @param [in] reg_addr:注册地址。
* @param [out] reg_data:指向数据缓冲区以存储读取数据。
* @param [in]长度:读取的no字节。
*
* @return执行状态
* @retval 0 - >成功
* @retval> 0 - >失败信息
*
* /
INT8_T I2C_REG_READ(UINT8_T I2C_ADDR,UINT8_T REG_ADDR,UINT8_T * REG_DATA,UINT16_T长度)
{

/ *使用I2C从寄存器读取。返回0以成功执行。* /
返回0;
}

设备:
im_dialog.
离线
最后一次露面:6天8小时前
加入:2016-12-06 22:25
嗨,瘸子帮,

嗨,瘸子帮,

我们最近发布了一个示例,该示例显示了如何与Bosch BMP388接口:

https://www.dialog-seminile.com/sites/default/files/da14531_ble_pre ...

此示例适用于DA14531,但DA14585共享相同的SDK,因此示例应该为您提供您正在寻找的API示例。

最好的祝福

im_dialog.

瘸子
离线
最后一次露面:4个月5天前
加入:2018-11-18 04:54
I used the suggested API i2c

我使用了BMP388项目的建议API I2C功能。但是,我没有在I2C总线上获得任何总线交易。请告诉我我可能做错了什么。
提前致谢。

Int8_t i2c_init(void)

{

GPIO_ConfigurePin(I2C_GPIO_PORT, I2C_SCL_PIN, INPUT, PID_I2C_SCL, false);
GPIO_ConfigurePin(I2C_GPIO_PORT, I2C_SDA_PIN, INPUT, PID_I2C_SDA, false);
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-> speed = i2c_speed_fast;
cfg-> mode = i2c_mode_master;
cfg - > addr_mode = I2C_ADDRESSING_7B;
cfg->地址= 0x68;
cfg-> tx_fifo_level = cfg-> rx_fifo_level = 32;

global_int_disable();

//Enable i2c clock to R/W i2c registers
i2c_set_clock_status(i2c_clock_enable);

// Enable interrupts
global_int_restore();

i2c_set_controller_status(I2C_CONTROLLER_DISABLE);
while(i2c_get_controller_status()!= i2c_controller_disable);

i2c_set_int_mask(0x0000);

// 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);

// Set speed mode
// setBits16(&i2c-> i2c_con_regf,i2c_speed,cfg->速度);
SetBits16(&i2c->I2C_CON_REGF, I2C_SPEED, I2C_SPEED_FAST);

//设置FIFO级别
ASSERT_WARNING(32 != 0);
ASSERT_WARNING(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,0x68);

i2c_set_controller_status(i2c_controller_enable);
//启用或禁用控制器时有两个IC_CLK延迟
while ((i2c_get_controller_status() != I2C_CONTROLLER_ENABLE));

//将I2C中断的优先级设置为级别2
NVIC_SetPriority(I2C_IRQn, 2);
//启用I2C中断
nvic_enableirq(i2c_irqn);
/ *根据目标机器实现I2C总线初始化。* /
返回0;
}

INT8_T REG_WRITE(UINT8_T REG_ADDR,CONSS UINT8_T * REG_DATA,UINT32_T长度,VOID * INTF_PTR)
{

/ *使用i2c写入寄存器。返回0以成功执行。* /

int ret = 0;
uint16_t bytes_written;
i2c_abort_t abrt_code;

UINT32_T标志= I2C_F_NONE;

/ *总线上的每个I2C设备都有一个唯一的地址,在我们沟通之前设置为* /

set_dev_addr(reg_addr);

/* Perform blocking write */
yytes_written = i2c_master_transmit_buffer_sync(reg_data,length,hight_code,flags);

if((i2c_abort_none!= = abrt_code)||(bytes_written!= length)){
ret = -1;
}
返回Ret;
}

int8_t i2c_reg_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr)
{
int ret = 0;
uint16_t bytes_read;
i2c_abort_t abrt_code;
UINT32_T标志= I2C_F_NONE;

set_dev_addr(reg_addr);

bytes_read = i2c_master_receive_buffer_sync(reg_data,length,&abrt_code,flags);

if((abrt_code!= i2c_abort_none)||(bytes_read!= length)){
ret = -1;
}

返回Ret;
}

瘸子
离线
最后一次露面:4个月5天前
加入:2018-11-18 04:54
I used the suggested API i2c

我使用了BMP388项目的建议API I2C功能。但是,我没有在I2C总线上获得任何总线交易。请告诉我我可能做错了什么。
提前致谢。

Int8_t i2c_init(void)

{

GPIO_ConfigurePin(I2C_GPIO_PORT, I2C_SCL_PIN, INPUT, PID_I2C_SCL, false);
GPIO_ConfigurePin(I2C_GPIO_PORT, I2C_SDA_PIN, INPUT, PID_I2C_SDA, false);
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-> speed = i2c_speed_fast;
cfg-> mode = i2c_mode_master;
cfg - > addr_mode = I2C_ADDRESSING_7B;
cfg->地址= 0x68;
cfg-> tx_fifo_level = cfg-> rx_fifo_level = 32;

global_int_disable();

//Enable i2c clock to R/W i2c registers
i2c_set_clock_status(i2c_clock_enable);

// Enable interrupts
global_int_restore();

i2c_set_controller_status(I2C_CONTROLLER_DISABLE);
while(i2c_get_controller_status()!= i2c_controller_disable);

i2c_set_int_mask(0x0000);

// 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);

// Set speed mode
// setBits16(&i2c-> i2c_con_regf,i2c_speed,cfg->速度);
SetBits16(&i2c->I2C_CON_REGF, I2C_SPEED, I2C_SPEED_FAST);

//设置FIFO级别
ASSERT_WARNING(32 != 0);
ASSERT_WARNING(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,0x68);

i2c_set_controller_status(i2c_controller_enable);
//启用或禁用控制器时有两个IC_CLK延迟
while ((i2c_get_controller_status() != I2C_CONTROLLER_ENABLE));

//将I2C中断的优先级设置为级别2
NVIC_SetPriority(I2C_IRQn, 2);
//启用I2C中断
nvic_enableirq(i2c_irqn);
/ *根据目标机器实现I2C总线初始化。* /
返回0;
}

INT8_T REG_WRITE(UINT8_T REG_ADDR,CONSS UINT8_T * REG_DATA,UINT32_T长度,VOID * INTF_PTR)
{

/ *使用i2c写入寄存器。返回0以成功执行。* /

int ret = 0;
uint16_t bytes_written;
i2c_abort_t abrt_code;

UINT32_T标志= I2C_F_NONE;

/ *总线上的每个I2C设备都有一个唯一的地址,在我们沟通之前设置为* /

set_dev_addr(reg_addr);

/* Perform blocking write */
yytes_written = i2c_master_transmit_buffer_sync(reg_data,length,hight_code,flags);

if((i2c_abort_none!= = abrt_code)||(bytes_written!= length)){
ret = -1;
}
返回Ret;
}

int8_t i2c_reg_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr)
{
int ret = 0;
uint16_t bytes_read;
i2c_abort_t abrt_code;
UINT32_T标志= I2C_F_NONE;

set_dev_addr(reg_addr);

bytes_read = i2c_master_receive_buffer_sync(reg_data,length,&abrt_code,flags);

if((abrt_code!= i2c_abort_none)||(bytes_read!= length)){
ret = -1;
}

返回Ret;
}

im_dialog.
离线
最后一次露面:6天8小时前
加入:2016-12-06 22:25
嗨,瘸子帮,

嗨,瘸子帮,

检查您使用的GPIO在US2C Intereface中是否正确配置了user_periph_setup.c文件中的set_pad_functions函数中。

最好的祝福

im_dialog.

瘸子
离线
最后一次露面:4个月5天前
加入:2018-11-18 04:54
你好对话框,

你好对话框,

任何不便敬请谅解。我已经检查过这个设置。我仍然无法努力工作....

我只需要使用这3个功能

* @brief函数通过i2c总线编写传感器的寄存器。
*
* @param [in] i2c_addr:传感器I2C地址。
* @param [in] reg_addr:注册地址。
* @param [in] reg_data:指向要写入值的数据缓冲区。
* @param [in]长度:编写的no字节。
*
* @return执行状态
* @retval 0 - >成功
* @retval> 0 - >失败信息
*
* /
INT8_T I2C_REG_WRITE(UINT8_T I2C_ADDR,UINT8_T REG_ADDR,CONSS UINT8_T * REG_DATA,UINT16_T长度)
{

/ *使用i2c写入寄存器。返回0以成功执行。* /
返回0;
}

/ *!
*@brief Function for reading the sensor's registers through I2C bus.
*
* @param [in] i2c_addr:传感器I2C地址。
* @param [in] reg_addr:注册地址。
* @param [out] reg_data:指向数据缓冲区以存储读取数据。
* @param [in]长度:读取的no字节。
*
* @return执行状态
* @retval 0 - >成功
* @retval> 0 - >失败信息
*
* /
INT8_T I2C_REG_READ(UINT8_T I2C_ADDR,UINT8_T REG_ADDR,UINT8_T * REG_DATA,UINT16_T长度)
{

/ *使用I2C从寄存器读取。返回0以成功执行。* /
返回0;
}

PM_DIALOG.
离线
最后一次露面:9小时2分钟前
员工
加入:2018-02-08 11:03
嗨,瘸子帮,

嗨,瘸子帮,

Could you please use a logic analyzer, probe the I2C signals and share a snapshot?

您是否遵循IM_DIALOG已经建议的示例?

谢谢,PM_DIALOG.