您好团队对话框,
我一直在努力通过I2C接口设置BMI270。BOSH BMI 270 IMU提供了可以从中重试的API
https://github.com/boschsensortec/bmi270-sensor-api.
对于DA14585,我遵循了I2C_EEPROM项目指令。如果可以用例子说明以下功能的样本,我将非常理解。
此致
* @brief函数通过i2c总线编写传感器的寄存器。
*
* @param [in] i2c_addr:传感器I2C地址。
* @param [in] 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地址。
* @param [in] reg_addr:注册地址。
* @param [out] reg_data:指向数据缓冲区以存储读取数据。
* @param [in]长度:读取的no字节。
*
* @return执行状态
* @retval 0 - >成功
* @retval> 0 - >失败信息
*
* /
INT8_T I2C_REG_READ(UINT8_T I2C_ADDR,UINT8_T REG_ADDR,UINT8_T * REG_DATA,UINT16_T长度)
{
/ *使用I2C从寄存器读取。返回0以成功执行。* /
返回0;
}
嗨瘸子,
我们最近发布了一个示例,该示例显示了如何与Bosch BMP388接口:
https://www.dialog-seminile.com/sites/default/files/da14531_ble_pre ...
此示例适用于DA14531,但DA14585共享相同的SDK,因此示例应该为您提供您正在寻找的API示例。
此致
im_dialog.
我使用了BMP388项目的建议API I2C功能。但是,我没有在I2C总线上获得任何总线交易。请告诉我我可能做错了什么。
提前致谢。
Int8_t i2c_init(void)
{
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-> speed = i2c_speed_fast;
cfg-> mode = i2c_mode_master;
cfg-> addr_mode = i2c_addressing_7b;
cfg->地址= 0x68;
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);
while(i2c_get_controller_status()!= i2c_controller_disable);
i2c_set_int_mask(0x0000);
// 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);
//设置速度模式
// setBits16(&i2c-> i2c_con_regf,i2c_speed,cfg->速度);
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 master
i2c_setup_master(i2c_restart_enable,i2c_addressing_7b,0x68);
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,CONSS UINT8_T * REG_DATA,UINT32_T长度,VOID * INTF_PTR)
{
/ *使用i2c写入寄存器。返回0以成功执行。* /
int ret = 0;
uint16_t bytes_written;
i2c_abort_t abrt_code;
UINT32_T标志= I2C_F_NONE;
/ *总线上的每个I2C设备都有一个唯一的地址,在我们沟通之前设置为* /
set_dev_addr(reg_addr);
/ *执行阻塞写* /
yytes_written = i2c_master_transmit_buffer_sync(reg_data,length,hight_code,flags);
if((i2c_abort_none!= = abrt_code)||(bytes_written!= length)){
RET = -1;
}
返回Ret;
}
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标志= I2C_F_NONE;
set_dev_addr(reg_addr);
bytes_read = i2c_master_receive_buffer_sync(reg_data,length,&abrt_code,flags);
if((abrt_code!= i2c_abort_none)||(bytes_read!= length)){
RET = -1;
}
返回Ret;
}
我使用了BMP388项目的建议API I2C功能。但是,我没有在I2C总线上获得任何总线交易。请告诉我我可能做错了什么。
提前致谢。
Int8_t i2c_init(void)
{
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-> speed = i2c_speed_fast;
cfg-> mode = i2c_mode_master;
cfg-> addr_mode = i2c_addressing_7b;
cfg->地址= 0x68;
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);
while(i2c_get_controller_status()!= i2c_controller_disable);
i2c_set_int_mask(0x0000);
// 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);
//设置速度模式
// setBits16(&i2c-> i2c_con_regf,i2c_speed,cfg->速度);
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 master
i2c_setup_master(i2c_restart_enable,i2c_addressing_7b,0x68);
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,CONSS UINT8_T * REG_DATA,UINT32_T长度,VOID * INTF_PTR)
{
/ *使用i2c写入寄存器。返回0以成功执行。* /
int ret = 0;
uint16_t bytes_written;
i2c_abort_t abrt_code;
UINT32_T标志= I2C_F_NONE;
/ *总线上的每个I2C设备都有一个唯一的地址,在我们沟通之前设置为* /
set_dev_addr(reg_addr);
/ *执行阻塞写* /
yytes_written = i2c_master_transmit_buffer_sync(reg_data,length,hight_code,flags);
if((i2c_abort_none!= = abrt_code)||(bytes_written!= length)){
RET = -1;
}
返回Ret;
}
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标志= I2C_F_NONE;
set_dev_addr(reg_addr);
bytes_read = i2c_master_receive_buffer_sync(reg_data,length,&abrt_code,flags);
if((abrt_code!= i2c_abort_none)||(bytes_read!= length)){
RET = -1;
}
返回Ret;
}
嗨瘸子,
检查您使用的GPIO在US2C Intereface中是否正确配置了user_periph_setup.c文件中的set_pad_functions函数中。
此致
im_dialog.
你好对话框,
任何不便敬请谅解。我已经检查过这个设置。我仍然无法努力工作....
我只需要使用这3个功能
* @brief函数通过i2c总线编写传感器的寄存器。
*
* @param [in] i2c_addr:传感器I2C地址。
* @param [in] 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地址。
* @param [in] reg_addr:注册地址。
* @param [out] reg_data:指向数据缓冲区以存储读取数据。
* @param [in]长度:读取的no字节。
*
* @return执行状态
* @retval 0 - >成功
* @retval> 0 - >失败信息
*
* /
INT8_T I2C_REG_READ(UINT8_T I2C_ADDR,UINT8_T REG_ADDR,UINT8_T * REG_DATA,UINT16_T长度)
{
/ *使用I2C从寄存器读取。返回0以成功执行。* /
返回0;
}
嗨瘸子,
请使用逻辑分析仪,探测I2C信号并共享快照?
您是否遵循IM_DIALOG已经建议的示例?
谢谢,PM_DIALOG.