一个灵活的软件I2C总线库函数,支持8/16位寄存器,支持一些非标准读写时序的I2C设备操作
原作者:https://schkorea.tistory.com/437 参考实现:https://github.com/liyanboy74/soft-i2c
#include "si2c.h"
#include "si2c_port.h"
// 定义总线句柄和总线接口
si2c_t si2c;
si2c_port_t si2c_port = { GPIOB, LL_GPIO_PIN_7, GPIOB, LL_GPIO_PIN_6 };
//初始化软件I2C接口
void Bsp_Si2c_Init(void)
{
Si2c_Init(&si2c, &si2c_port);
}
// 初始化传感器
uint8_t Bsp_Opt4001_Init(void)
{
uint8_t chip_id[2] = {0};
uint8_t opt4001_config[2] = {0x32, 0xF0};
//复位全局I2C芯片
Si2c_General_Call_Reset(&si2c);
HAL_Delay(20);
//读取并检查芯片ID
if(Si2c_Read(&si2c, OPT4001_I2C_ADDR, OPT4001_DEVICE_ID_REG, chip_id, 2, SI2C_REG8) != SI2C_OK)
return OPT4001_ERROR_CHIPID;
if((chip_id[0] != 0x01) || (chip_id[1] != 0x21))
return OPT4001_ERROR_CHIPID;
//写入传感器配置
if(Si2c_Write(&si2c, OPT4001_I2C_ADDR, OPT4001_CONFIG_REG, opt4001_config, 2, SI2C_REG8) != SI2C_OK)
return OPT4001_ERROR_WRITE;
HAL_Delay(20);
return OPT4001_SUCCESS;
}