与BOSH BMI270 IMU的I2C接口

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
7个帖子/ 0新
最后一篇
瘸子
离线
最后一次露面:8个月1周前
加入:2018-11-18 04:54
与BOSH BMI270 IMU的I2C接口

您好团队对话框,

我一直在努力通过I2C接口设置BMI270。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]长度:编写的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;
}

/ *!
*通过I2C总线读取传感器寄存器的@BRIFIE函数。
*
* @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.
离线
最后一次露面:2个月3周前
加入:2016-12-06 22:25
嗨瘸子,

嗨瘸子,

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

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

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

此致

im_dialog.

瘸子
离线
最后一次露面:8个月1周前
加入:2018-11-18 04:54
我使用了建议的API I2C

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

Int8_t i2c_init(void)

{

gpio_configurepin(i2c_gpio_port,i2c_scl_pin,输入,pid_i2c_scl,false);
gpio_configurepin(i2c_gpio_port,i2c_sda_pin,输入,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();

//将I2C时钟启用到R / W I2C寄存器
i2c_set_clock_status(i2c_clock_enable);

//启用中断
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);

//设置速度模式
// 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);

/ *执行阻塞写* /
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长度,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;
}

瘸子
离线
最后一次露面:8个月1周前
加入:2018-11-18 04:54
我使用了建议的API I2C

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

Int8_t i2c_init(void)

{

gpio_configurepin(i2c_gpio_port,i2c_scl_pin,输入,pid_i2c_scl,false);
gpio_configurepin(i2c_gpio_port,i2c_sda_pin,输入,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();

//将I2C时钟启用到R / W I2C寄存器
i2c_set_clock_status(i2c_clock_enable);

//启用中断
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);

//设置速度模式
// 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);

/ *执行阻塞写* /
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长度,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.
离线
最后一次露面:2个月3周前
加入:2016-12-06 22:25
嗨瘸子,

嗨瘸子,

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

此致

im_dialog.

瘸子
离线
最后一次露面:8个月1周前
加入: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;
}

/ *!
*通过I2C总线读取传感器寄存器的@BRIFIE函数。
*
* @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.
离线
最后一次露面:19小时44分钟前
职员
加入:2018-02-08 11:03
嗨瘸子,

嗨瘸子,

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

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

谢谢,PM_DIALOG.