Hello Team Dialog,
我一直在努力通过I2C接口设置BMI270。BOSH BMI 270 IMU提供了可以从中重试的API
https://github.com/boschsensortec/bmi270-sensor-api.
对于DA14585,我遵循了I2C_EEPROM项目指令。如果可以用例子说明以下功能的样本,我将非常理解。
Best Regards
* @brief函数通过i2c总线编写传感器的寄存器。
*
* @param [in] i2c_addr:传感器I2C地址。
* @param [in] reg_addr:注册地址。
* @param [in] reg_data:指向要写入值的数据缓冲区。
*@param[in] length : No of bytes to write.
*
* @return执行状态
* @retval 0 - >成功
* @retval> 0 - >失败信息
*
* /
int8_t i2c_reg_write(uint8_t i2c_addr, uint8_t reg_addr, const uint8_t *reg_data, uint16_t length)
{
/ *使用i2c写入寄存器。返回0以成功执行。* /
返回0;
}
/ *!
*@brief Function for reading the sensor's registers through I2C bus.
*
* @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长度)
{
/* Read from registers using I2C. Return 0 for a successful execution. */
返回0;
}
Hi cripsly,
We have recently published an example that shows how to interface with the 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, INPUT, PID_I2C_SCL, false);
GPIO_ConfigurePin(I2C_GPIO_PORT, I2C_SDA_PIN, INPUT, 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();
//Enable i2c clock to R/W i2c registers
i2c_set_clock_status(i2c_clock_enable);
// Enable interrupts
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);
// Set speed mode
// 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);
/* Perform blocking write */
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 length, 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, INPUT, PID_I2C_SCL, false);
GPIO_ConfigurePin(I2C_GPIO_PORT, I2C_SDA_PIN, INPUT, 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();
//Enable i2c clock to R/W i2c registers
i2c_set_clock_status(i2c_clock_enable);
// Enable interrupts
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);
// Set speed mode
// 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);
/* Perform blocking write */
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 length, 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;
}
Hi cripsly,
检查您使用的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] length : No of bytes to write.
*
* @return执行状态
* @retval 0 - >成功
* @retval> 0 - >失败信息
*
* /
int8_t i2c_reg_write(uint8_t i2c_addr, uint8_t reg_addr, const uint8_t *reg_data, uint16_t length)
{
/ *使用i2c写入寄存器。返回0以成功执行。* /
返回0;
}
/ *!
*@brief Function for reading the sensor's registers through I2C bus.
*
* @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长度)
{
/* Read from registers using I2C. Return 0 for a successful execution. */
返回0;
}
Hi cripsly,
Could you please use a logic analyzer, probe the I2C signals and share a snapshot?
您是否遵循IM_DIALOG已经建议的示例?
谢谢,PM_DIALOG.