你好,团队对话,
我一直在努力通过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;
}
设备:
嗨,可怜虫,
我们最近发布了一个示例,展示了如何与博世BMP388接口:
//www.xmece.com/sites/default/files/da14531_ble_pre...
本示例适用于DA14531,但DA14585共享同一SDK,因此本示例应提供您正在寻找的API示例。
顺致敬意,
即时通讯对话
我使用了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;
}
我使用了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;
}
嗨,可怜虫,
检查用于I2C接口的GPIO是否在user_periph_setup.c文件中的set_pad_functions功能中正确配置。
顺致敬意,
即时通讯对话
你好,对话,
很抱歉给您带来不便。我已检查此设置。我仍然无法使其工作。。。。
我只需要使用这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;
}
嗨,可怜虫,
请您使用逻辑分析仪,探测I2C信号并共享快照好吗?
您是否遵循IM_Dialog已经建议的示例?
谢谢,下午好