您好团队对话框,
我一直在努力通过I2C接口设置BMI270。Bosh BMI 270 IMU提供了一个API,可以从
https://github.com/BoschSensortec/BMI270-Sensor-API
对于DA14585,我遵循i2c_eeprom项目指令。如果能对下面的函数样本进行举例说明,我将不胜感激。
此致
* @brief通过I2C总线编写传感器寄存器的函数。
*
* @param[in] i2c_addr:传感器I2C地址。
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地址。
reg_addr:注册地址。
* @param[out] reg_data:指向数据缓冲区的指针,用于存储读取的数据。
* @param[in] length: No of bytes to read。
*
* @return执行状态
* @retval 0 ->成功
* @retval >0 ->故障信息
*
*/
Int8_t i2c_read (uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
{
/ *使用I2C从寄存器读取。返回0表示执行成功。*/
返回0;
}
嗨瘸子,
我们最近发布了一个示例,该示例显示了如何与Bosch BMP388接口:
//www.xmece.com/sites/default/files/da14531_ble_pre..。
这个例子是DA14531,但是DA14585共享相同的SDK,所以这个例子应该给你你正在寻找的API例子。
致以最亲切的问候
IM_Dialog
我使用了BMP388项目中建议的API i2c函数。但是,我没有在i2c总线上获得任何总线事务。请让我知道我可能做错了什么。
提前谢谢。
int8_t i2c_init(空白)
{
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 - >速度= I2C_SPEED_FAST;
cfg - >模式= I2C_MODE_MASTER;
cfg-> addr_mode = i2c_addressing_7b;
cfg - >地址= 0 x68;
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);
而(i2c_get_controller_status () ! = I2C_CONTROLLER_DISABLE);
i2c_set_int_mask (0 x0000);
// 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);
//设置速度模式
//设置bits16 (&i2c->I2C_CON_REGF, I2C_SPEED, cfg->speed);
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主控
i2c_setup_master (I2C_RESTART_ENABLE I2C_ADDRESSING_7B 0 x68);
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, const uint8_t *reg_data, uint32_t length, void *intf_ptr)
{
/*使用I2C写入寄存器。返回0表示执行成功。*/
Int ret = 0;
uint16_t bytes_written;
i2c_abort_t abrt_code;
uint32_t flags = I2C_F_NONE;
/*总线上的每个I2C设备都有一个唯一的地址,在我们通信之前设置这个地址*/
set_dev_addr (reg_addr);
/ *执行阻塞写* /
Bytes_written = i2c_master_transmit_buffer_sync(reg_data, length, &abrt_code, flags);
if (I2C_ABORT_NONE != abt_code) || (bytes_written != length);
RET = -1;
}
返回受潮湿腐烂;
}
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 flags = I2C_F_NONE;
set_dev_addr (reg_addr);
Bytes_read = i2c_master_receive_buffer_sync(reg_data, length, &abrt_code, flags);
if (abt_code != I2C_ABORT_NONE) || (bytes_read != length);
RET = -1;
}
返回受潮湿腐烂;
}
我使用了BMP388项目中建议的API i2c函数。但是,我没有在i2c总线上获得任何总线事务。请让我知道我可能做错了什么。
提前谢谢。
int8_t i2c_init(空白)
{
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 - >速度= I2C_SPEED_FAST;
cfg - >模式= I2C_MODE_MASTER;
cfg-> addr_mode = i2c_addressing_7b;
cfg - >地址= 0 x68;
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);
而(i2c_get_controller_status () ! = I2C_CONTROLLER_DISABLE);
i2c_set_int_mask (0 x0000);
// 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);
//设置速度模式
//设置bits16 (&i2c->I2C_CON_REGF, I2C_SPEED, cfg->speed);
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主控
i2c_setup_master (I2C_RESTART_ENABLE I2C_ADDRESSING_7B 0 x68);
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, const uint8_t *reg_data, uint32_t length, void *intf_ptr)
{
/*使用I2C写入寄存器。返回0表示执行成功。*/
Int ret = 0;
uint16_t bytes_written;
i2c_abort_t abrt_code;
uint32_t flags = I2C_F_NONE;
/*总线上的每个I2C设备都有一个唯一的地址,在我们通信之前设置这个地址*/
set_dev_addr (reg_addr);
/ *执行阻塞写* /
Bytes_written = i2c_master_transmit_buffer_sync(reg_data, length, &abrt_code, flags);
if (I2C_ABORT_NONE != abt_code) || (bytes_written != length);
RET = -1;
}
返回受潮湿腐烂;
}
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 flags = I2C_F_NONE;
set_dev_addr (reg_addr);
Bytes_read = i2c_master_receive_buffer_sync(reg_data, length, &abrt_code, flags);
if (abt_code != I2C_ABORT_NONE) || (bytes_read != length);
RET = -1;
}
返回受潮湿腐烂;
}
嗨瘸子,
检查您用于I2C接口的GPIO是否正确配置在user_外围_setup.c文件中的set_pad_functions函数中。
致以最亲切的问候
IM_Dialog
你好,对话框,
很抱歉给您带来不便。我检查了这个设置。我还是不能让它工作....
我只需要使用这三个函数
* @brief通过I2C总线编写传感器寄存器的函数。
*
* @param[in] i2c_addr:传感器I2C地址。
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地址。
reg_addr:注册地址。
* @param[out] reg_data:指向数据缓冲区的指针,用于存储读取的数据。
* @param[in] length: No of bytes to read。
*
* @return执行状态
* @retval 0 ->成功
* @retval >0 ->故障信息
*
*/
Int8_t i2c_read (uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
{
/ *使用I2C从寄存器读取。返回0表示执行成功。*/
返回0;
}
嗨瘸子,
请使用逻辑分析仪,探测I2C信号并共享快照?
你遵循了IM_Dialog已经建议的例子吗?
谢谢,PM_Dialog