与Bosh BMI270 IMU的I2C接口

⚠️
您好,谢谢您来到论坛。令人兴奋的消息!我们正在迁移到新的论坛平台,该平台将提供更好的功能,并包含在主对话网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量-请在//www.xmece.com/support.我们将在未来几天内修复bug/优化搜索和标记。
7个员额/0个新员额
最后一篇文章
怯懦的
离线
最后一次见到:8个月1周前
加入:2018-11-18 04:54
与Bosh BMI270 IMU的I2C接口

你好,团队对话,

我一直在努力通过I2C接口设置BMI270。波什BMI270 IMU提供了一个可以从

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

对于DA14585,我遵循了i2c_eeprom项目说明。如果下面的函数示例可以用示例加以说明,我将不胜感激。

顺致敬意,

*@通过I2C总线写入传感器寄存器的简短功能。
*
*@param[in]i2c地址:传感器i2c地址。
*@param[in]注册地址:注册地址。
*@param[in]reg_data:指向要写入其值的数据缓冲区的指针。
*@param[in]长度:要写入的字节数。
*
*@返回执行状态
*@retval 0->成功
*@retval>0->失败信息
*
*/
int8_t i2c_reg_写入(uint8_t i2c_addr、uint8_t reg_addr、常量uint8_t*reg_数据、uint16_t长度)
{

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

/*!
*@通过I2C总线读取传感器寄存器的简短功能。
*
*@param[in]i2c地址:传感器i2c地址。
*@param[in]注册地址:注册地址。
*@param[out]reg_data:指向存储读取数据的数据缓冲区的指针。
*@param[in]长度:要读取的字节数。
*
*@返回执行状态
*@retval 0->成功
*@retval>0->失败信息
*
*/
int8_t i2c_reg_读取(uint8_t i2c_addr、uint8_t reg_addr、uint8_t*reg_数据、uint16_t长度)
{

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

设备:
即时通讯对话
离线
最后一次见到:2个月3周前
加入:2016-12-06 22:25
嗨,可怜虫,

嗨,可怜虫,

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

//www.xmece.com/sites/default/files/da14531_ble_pre...

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

顺致敬意,

即时通讯对话

怯懦的
离线
最后一次见到:8个月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、假);
设置16(CLK_16M_REG,XTAL16_BIAS_SH_ENABLE,1);


cfg->clock\u cfg.ss\u hcnt=I2C\u ss\u SCL\u hcnt\u REG;
cfg->clock\u cfg.ss\u lcnt=I2C\u ss\u SCL\u lcnt\u REG;
cfg->clock\u cfg.fs\u hcnt=I2C\u fs\u SCL\u hcnt\u REG;
cfg->clock\u cfg.fs\u lcnt=I2C\u fs\u SCL\u lcnt\u REG;

cfg->speed=I2C\u speed\u FAST;
cfg->mode=I2C\u mode\u MASTER;
cfg->addr_mode=I2C_寻址_7B;
cfg->address=0x68;
cfg->tx\u fifo\u level=cfg->rx\u fifo\u level=32;

全局_INT_DISABLE();

//启用到R/W i2c寄存器的i2c时钟
i2c设置时钟状态(i2c时钟启用);

//启用中断
全局_INT_RESTORE();

i2c设置控制器状态(i2c控制器禁用);
而(i2c_获取_控制器_状态()!=i2c_控制器_禁用);

i2c设置内部屏蔽(0x0000);

//SCL时钟设置
SetWord16(&i2c->i2c\U SS\U SCL\U HCNT\U REGF,cfg->clock\U cfg.SS\U HCNT);
设置字16(&i2c->i2c\U SS\U SCL\U LCNT\U REGF,cfg->clock\U cfg.SS\U LCNT);

SetWord16(&i2c->i2c\U FS\U SCL\U HCNT\U REGF,cfg->clock\U cfg.FS\U HCNT);
SetWord16(&i2c->i2c\U FS\U SCL\U LCNT\U REGF,cfg->clock\U cfg.FS\U LCNT);

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

//设置fifo级别
断言警告(32!=0);
断言警告(32!=0);
设置16(&i2c->i2c\u TX\u TL\u REGF,RX\u TL,32-1);
设置16(&i2c->i2c\uRx\uTL\uRegf,RX\uTL,32-1);

//设置I2C主机
i2c_设置_主机(i2c_重启_启用,i2c_寻址_7B,0x68);

i2c设置控制器状态(i2c控制器启用);
//启用或禁用控制器时,有两个ic_时钟延迟
而((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_数据,uint32_t长度,void*intf_ptr)
{

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

int-ret=0;
写入的uint16字节;
i2c_abort_t abrt_码;

uint32\u t标志=I2C\u F\u无;

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

设置开发地址(注册地址);

/*执行分块写入*/
字节写入=i2c主机传输缓冲同步(寄存器数据、长度和abrt码、标志);

if((I2C_ABORT_NONE!=abrt_代码)| |(字节数_writed!=长度)){
ret=-1;
}
返回ret;
}

int8_t i2c_reg_读取(uint8_t reg_addr,uint8_t*reg_数据,uint32_t长度,void*intf_ptr)
{
int-ret=0;
uint16字节读取;
i2c_abort_t abrt_码;
uint32\u t标志=I2C\u F\u无;

设置开发地址(注册地址);

字节读取=i2c主机接收缓冲区同步(reg数据、长度和abrt代码、标志);

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(无效)

{

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


cfg->clock\u cfg.ss\u hcnt=I2C\u ss\u SCL\u hcnt\u REG;
cfg->clock\u cfg.ss\u lcnt=I2C\u ss\u SCL\u lcnt\u REG;
cfg->clock\u cfg.fs\u hcnt=I2C\u fs\u SCL\u hcnt\u REG;
cfg->clock\u cfg.fs\u lcnt=I2C\u fs\u SCL\u lcnt\u REG;

cfg->speed=I2C\u speed\u FAST;
cfg->mode=I2C\u mode\u MASTER;
cfg->addr_mode=I2C_寻址_7B;
cfg->address=0x68;
cfg->tx\u fifo\u level=cfg->rx\u fifo\u level=32;

全局_INT_DISABLE();

//启用到R/W i2c寄存器的i2c时钟
i2c设置时钟状态(i2c时钟启用);

//启用中断
全局_INT_RESTORE();

i2c设置控制器状态(i2c控制器禁用);
而(i2c_获取_控制器_状态()!=i2c_控制器_禁用);

i2c设置内部屏蔽(0x0000);

//SCL时钟设置
SetWord16(&i2c->i2c\U SS\U SCL\U HCNT\U REGF,cfg->clock\U cfg.SS\U HCNT);
设置字16(&i2c->i2c\U SS\U SCL\U LCNT\U REGF,cfg->clock\U cfg.SS\U LCNT);

SetWord16(&i2c->i2c\U FS\U SCL\U HCNT\U REGF,cfg->clock\U cfg.FS\U HCNT);
SetWord16(&i2c->i2c\U FS\U SCL\U LCNT\U REGF,cfg->clock\U cfg.FS\U LCNT);

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

//设置fifo级别
断言警告(32!=0);
断言警告(32!=0);
设置16(&i2c->i2c\u TX\u TL\u REGF,RX\u TL,32-1);
设置16(&i2c->i2c\uRx\uTL\uRegf,RX\uTL,32-1);

//设置I2C主机
i2c_设置_主机(i2c_重启_启用,i2c_寻址_7B,0x68);

i2c设置控制器状态(i2c控制器启用);
//启用或禁用控制器时,有两个ic_时钟延迟
而((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_数据,uint32_t长度,void*intf_ptr)
{

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

int-ret=0;
写入的uint16字节;
i2c_abort_t abrt_码;

uint32\u t标志=I2C\u F\u无;

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

设置开发地址(注册地址);

/*执行分块写入*/
字节写入=i2c主机传输缓冲同步(寄存器数据、长度和abrt码、标志);

if((I2C_ABORT_NONE!=abrt_代码)| |(字节数_writed!=长度)){
ret=-1;
}
返回ret;
}

int8_t i2c_reg_读取(uint8_t reg_addr,uint8_t*reg_数据,uint32_t长度,void*intf_ptr)
{
int-ret=0;
uint16字节读取;
i2c_abort_t abrt_码;
uint32\u t标志=I2C\u F\u无;

设置开发地址(注册地址);

字节读取=i2c主机接收缓冲区同步(reg数据、长度和abrt代码、标志);

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

返回ret;
}

即时通讯对话
离线
最后一次见到:2个月3周前
加入:2016-12-06 22:25
嗨,可怜虫,

嗨,可怜虫,

检查用于I2C接口的GPIO是否在user_periph_setup.c文件中的set_pad_functions功能中正确配置。

顺致敬意,

即时通讯对话

怯懦的
离线
最后一次见到:8个月1周前
加入:2018-11-18 04:54
你好,对话,

你好,对话,

很抱歉给您带来不便。我已检查此设置。我仍然无法使其工作。。。。

我只需要使用这3个函数

*@通过I2C总线写入传感器寄存器的简短功能。
*
*@param[in]i2c地址:传感器i2c地址。
*@param[in]注册地址:注册地址。
*@param[in]reg_data:指向要写入其值的数据缓冲区的指针。
*@param[in]长度:要写入的字节数。
*
*@返回执行状态
*@retval 0->成功
*@retval>0->失败信息
*
*/
int8_t i2c_reg_写入(uint8_t i2c_addr、uint8_t reg_addr、常量uint8_t*reg_数据、uint16_t长度)
{

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

/*!
*@通过I2C总线读取传感器寄存器的简短功能。
*
*@param[in]i2c地址:传感器i2c地址。
*@param[in]注册地址:注册地址。
*@param[out]reg_data:指向存储读取数据的数据缓冲区的指针。
*@param[in]长度:要读取的字节数。
*
*@返回执行状态
*@retval 0->成功
*@retval>0->失败信息
*
*/
int8_t i2c_reg_读取(uint8_t i2c_addr、uint8_t reg_addr、uint8_t*reg_数据、uint16_t长度)
{

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

PM_对话框
离线
最后一次见到:10小时4分钟前
工作人员
加入:2018-02-08 11:03
嗨,可怜虫,

嗨,可怜虫,

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

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

谢谢,下午好