带Bosh BMI270 IMU的I2C接口

了解更多常见问题教程

7个职位/0个新职位
最后一篇文章
畏缩的
离线
最后一次见到:4个月4天前
已加入:2018-11-18 04:54
带Bosh BMI270 IMU的I2C接口

你好,团队对话,

我一直在努力建立BMI270的I2C接口。Bosh BMI 270 IMU提供了一个API,可以从

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

对于DA14585,我遵循i2cèeeprom项目说明。如果能举例说明下面函数的示例,我将不胜感激。

致以最诚挚的问候

*@通过I2C总线写入传感器寄存器的简短功能。
*
*@param[in]i2c地址:传感器i2c地址。
*@param[in]寄存器地址:寄存器地址。
*@param[in]reg\u data:指向要写入其值的数据缓冲区的指针。
*@param[in]length:要写入的字节数。
*
*@返回执行状态
*@retval 0->成功
*@retval>0->失败信息
*
*/
int8\t i2c\u reg\u写入(uint8\t i2c\u addr,uint8\u t reg\u addr,const uint8\u t*reg\u data,uint16\u t length)
{

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

/*!
*@通过I2C总线读取传感器寄存器的简短功能。
*
*@param[in]i2c地址:传感器i2c地址。
*@param[in]寄存器地址:寄存器地址。
*@param[out]reg\u data:指向存储读取数据的数据缓冲区的指针。
*@param[in]length:要读取的字节数。
*
*@返回执行状态
*@retval 0->成功
*@retval>0->失败信息
*
*/
int8\t i2c\u reg\u read(uint8\t i2c\u addr、uint8\u t reg\u addr、uint8\u t*reg\u data、uint16\u t length)
{

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

设备:
即时消息对话框
离线
最后一次见到:5天6小时前
已加入:2016-12-06 22:25
嗨,可悲的是,

嗨,可悲的是,

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

//www.wsdof.com/sites/default/files/da14531\u ble\u pre。。。

这个例子是针对DA14531的,但是DA14585共享同一个SDK,所以这个例子应该给你提供你想要的API例子。

致以最诚挚的问候

即时消息对话框

畏缩的
离线
最后一次见到:4个月4天前
已加入:2018-11-18 04:54
我使用了建议的API i2c

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

int8\t i2c\u init(无效)

{

GPIO\ U配置引脚(I2C\ U GPIO\ U端口、I2C\ U SCL\ U引脚、输入、PID\ U I2C\ U SCL、false);
GPIO\ U配置引脚(I2C\ U GPIO\ U端口、I2C\ U SDA\ U引脚、输入、PID\ U I2C\ U SDA、假);
SetBits16(CLK\ U 16M\ U REG,XTAL16\ U BIAS\ U SH\ U ENABLE,1);


cfg->时钟_cfg.ss\hcnt文件=I2C\U SS\U SCL\U HCNT\U REG;
cfg->时钟_cfg.ss\lcnt文件=I2C\U SS\U SCL\U LCNT\U REG;
cfg->时钟_cfg.fs\hcnt文件=I2C\U FS\U SCL\U HCNT\U REG;
cfg->时钟_cfg.fs\u lcnt文件=I2C\U FS\U SCL\U LCNT\U REG;

cfg->速度=I2C\u速度\u快;
cfg->mode=I2C\u mode\u MASTER;
cfg->addr\u mode=I2C\u寻址\u 7B;
cfg->地址=0x68;
cfg->tx\u fifo\u level=cfg->rx\u fifo\u level=32;

全局\u INT \u DISABLE();

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

//启用中断
全局\u INT \u RESTORE();

i2c\设置\控制器\状态(i2c\控制器\禁用);
while(i2c\u get\u controller\u status()!=I2C(控制器禁用);

i2c\设置\内部\掩码(0x0000);

//SCL时钟设置
设置字16(&i2c->i2c\U SS\U SCL\U HCNT\U REGF,cfg->时钟_cfg.ss\hcnt文件);
设置字16(&i2c->i2c\U SS\U SCL\U LCNT\U REGF,cfg->时钟_cfg.ss\lcnt文件);

设置字16(&i2c->i2c\U FS\U SCL\U HCNT\U REGF,cfg->时钟_cfg.fs\hcnt文件);
设置字16(&i2c->i2c\U FS\U SCL\U LCNT\U REGF,cfg->时钟_cfg.fs\u lcnt文件);

//设置速度模式
//设置16(&i2c->i2c\U CON\U REGF,i2c\U SPEED,cfg->SPEED);
SetBits16(&i2c->i2c\u CON\u REGF,i2c\u SPEED,i2c\u SPEED\u FAST);

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

//设置I2C主机
i2c\设置\主控(i2c\重启\启用,i2c\寻址\ 7B,0x68);

i2c\设置\控制器\状态(i2c\控制器\启用);
//在启用或禁用控制器时,有一个双ic时钟延迟
while((i2c\u get\u controller\u status()!=I2C(控制器启用);

//将I2C中断的优先级设置为2级
NVIC\u SetPriority(I2C\u IRQn,2);
//启用I2C中断
NVIC启用IRQ(I2C\U IRQn);
/*根据目标机实现I2C总线初始化。*/
返回0;
}

int8\t reg\u写入(uint8\t reg\u addr,const uint8\t*reg\u data,uint32\u t length,void*intf\u ptr)
{

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

int ret=0;
写入的uint16字节;
i2c\中断\ abrt\代码;

uint32\u t flags=I2C\u F\u NONE;

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

设置地址(reg\u addr);

/*执行阻塞写入*/
字节\写入=i2c \主机\传输\缓冲区\同步(reg \ U数据、长度和abrt \ U代码、标志);

如果((I2C)\u中止\u无!=abrt|u码)| |(写入字节)|!=长度){
ret=-1;
}
返回ret;
}

int8\t i2c\U reg\U read(uint8\U t reg\U addr,uint8\U t*reg\U data,uint32\U t length,void*intf\U ptr)
{
int ret=0;
读取16字节;
i2c\中断\ abrt\代码;
uint32\u t flags=I2C\u F\u NONE;

设置地址(reg\u addr);

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

如果((abrt\u代码!=I2C|u中止|u无)| |(字节|u读取!=长度){
ret=-1;
}

返回ret;
}

畏缩的
离线
最后一次见到:4个月4天前
已加入:2018-11-18 04:54
我使用了建议的API i2c

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

int8\t i2c\u init(无效)

{

GPIO\ U配置引脚(I2C\ U GPIO\ U端口、I2C\ U SCL\ U引脚、输入、PID\ U I2C\ U SCL、false);
GPIO\ U配置引脚(I2C\ U GPIO\ U端口、I2C\ U SDA\ U引脚、输入、PID\ U I2C\ U SDA、假);
SetBits16(CLK\ U 16M\ U REG,XTAL16\ U BIAS\ U SH\ U ENABLE,1);


cfg->时钟_cfg.ss\hcnt文件=I2C\U SS\U SCL\U HCNT\U REG;
cfg->时钟_cfg.ss\lcnt文件=I2C\U SS\U SCL\U LCNT\U REG;
cfg->时钟_cfg.fs\hcnt文件=I2C\U FS\U SCL\U HCNT\U REG;
cfg->时钟_cfg.fs\u lcnt文件=I2C\U FS\U SCL\U LCNT\U REG;

cfg->速度=I2C\u速度\u快;
cfg->mode=I2C\u mode\u MASTER;
cfg->addr\u mode=I2C\u寻址\u 7B;
cfg->地址=0x68;
cfg->tx\u fifo\u level=cfg->rx\u fifo\u level=32;

全局\u INT \u DISABLE();

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

//启用中断
全局\u INT \u RESTORE();

i2c\设置\控制器\状态(i2c\控制器\禁用);
while(i2c\u get\u controller\u status()!=I2C(控制器禁用);

i2c\设置\内部\掩码(0x0000);

//SCL时钟设置
设置字16(&i2c->i2c\U SS\U SCL\U HCNT\U REGF,cfg->时钟_cfg.ss\hcnt文件);
设置字16(&i2c->i2c\U SS\U SCL\U LCNT\U REGF,cfg->时钟_cfg.ss\lcnt文件);

设置字16(&i2c->i2c\U FS\U SCL\U HCNT\U REGF,cfg->时钟_cfg.fs\hcnt文件);
设置字16(&i2c->i2c\U FS\U SCL\U LCNT\U REGF,cfg->时钟_cfg.fs\u lcnt文件);

//设置速度模式
//设置16(&i2c->i2c\U CON\U REGF,i2c\U SPEED,cfg->SPEED);
SetBits16(&i2c->i2c\u CON\u REGF,i2c\u SPEED,i2c\u SPEED\u FAST);

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

//设置I2C主机
i2c\设置\主控(i2c\重启\启用,i2c\寻址\ 7B,0x68);

i2c\设置\控制器\状态(i2c\控制器\启用);
//在启用或禁用控制器时,有一个双ic时钟延迟
while((i2c\u get\u controller\u status()!=I2C(控制器启用);

//将I2C中断的优先级设置为2级
NVIC\u SetPriority(I2C\u IRQn,2);
//启用I2C中断
NVIC启用IRQ(I2C\U IRQn);
/*根据目标机实现I2C总线初始化。*/
返回0;
}

int8\t reg\u写入(uint8\t reg\u addr,const uint8\t*reg\u data,uint32\u t length,void*intf\u ptr)
{

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

int ret=0;
写入的uint16字节;
i2c\中断\ abrt\代码;

uint32\u t flags=I2C\u F\u NONE;

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

设置地址(reg\u addr);

/*执行阻塞写入*/
字节\写入=i2c \主机\传输\缓冲区\同步(reg \ U数据、长度和abrt \ U代码、标志);

如果((I2C)\u中止\u无!=abrt|u码)| |(写入字节)|!=长度){
ret=-1;
}
返回ret;
}

int8\t i2c\U reg\U read(uint8\U t reg\U addr,uint8\U t*reg\U data,uint32\U t length,void*intf\U ptr)
{
int ret=0;
读取16字节;
i2c\中断\ abrt\代码;
uint32\u t flags=I2C\u F\u NONE;

设置地址(reg\u addr);

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

如果((abrt\u代码!=I2C|u中止|u无)| |(字节|u读取!=长度){
ret=-1;
}

返回ret;
}

即时消息对话框
离线
最后一次见到:5天6小时前
已加入:2016-12-06 22:25
嗨,可悲的是,

嗨,可悲的是,

检查用于I2C接口的GPIO是否在user\u periph\u setup.c文件中的set\u pad\u functions函数中正确配置。

致以最诚挚的问候

即时消息对话框

畏缩的
离线
最后一次见到:4个月4天前
已加入:2018-11-18 04:54
你好Dialog,

你好Dialog,

很抱歉给您带来不便。我已经检查了这个设置。我还是不能让它工作。。。。

我只需要使用这3个函数

*@通过I2C总线写入传感器寄存器的简短功能。
*
*@param[in]i2c地址:传感器i2c地址。
*@param[in]寄存器地址:寄存器地址。
*@param[in]reg\u data:指向要写入其值的数据缓冲区的指针。
*@param[in]length:要写入的字节数。
*
*@返回执行状态
*@retval 0->成功
*@retval>0->失败信息
*
*/
int8\t i2c\u reg\u写入(uint8\t i2c\u addr,uint8\u t reg\u addr,const uint8\u t*reg\u data,uint16\u t length)
{

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

/*!
*@通过I2C总线读取传感器寄存器的简短功能。
*
*@param[in]i2c地址:传感器i2c地址。
*@param[in]寄存器地址:寄存器地址。
*@param[out]reg\u data:指向存储读取数据的数据缓冲区的指针。
*@param[in]length:要读取的字节数。
*
*@返回执行状态
*@retval 0->成功
*@retval>0->失败信息
*
*/
int8\t i2c\u reg\u read(uint8\t i2c\u addr、uint8\u t reg\u addr、uint8\u t*reg\u data、uint16\u t length)
{

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

PM\U对话框
离线
最后一次见到:2天15小时前
工作人员
已加入:2018-02-08 11:03
嗨,可悲的是,

嗨,可悲的是,

你能使用逻辑分析仪,探测I2C信号并分享一个快照吗?

您是否遵循了imu Dialog已经建议的示例?

谢谢,下午好