你好,团队对话,
我一直在努力建立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;
}


嗨,可悲的是,
我们最近发布了一个示例,展示了如何与Bosch BMP388接口:
//www.wsdof.com/sites/default/files/da14531\u ble\u pre。。。
这个例子是针对DA14531的,但是DA14585共享同一个SDK,所以这个例子应该给你提供你想要的API例子。
致以最诚挚的问候
即时消息对话框
我使用了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;
}
我使用了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;
}
嗨,可悲的是,
检查用于I2C接口的GPIO是否在user\u periph\u setup.c文件中的set\u pad\u functions函数中正确配置。
致以最诚挚的问候
即时消息对话框
你好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;
}
嗨,可悲的是,
你能使用逻辑分析仪,探测I2C信号并分享一个快照吗?
您是否遵循了imu Dialog已经建议的示例?
谢谢,下午好