一、前言
zephyr调用硬件的i2c驱动是通过调用HAL库形式,硬件参数设置更多的是在工程的配置文件中设置,比如dts、.conf、.overlay文件,这里主要是介绍下调试官方demo过程中涉及到的一些工程配置和关键api介绍。
二、I2C启动流程
简单梳理下I2C驱动在zephyr的初始化,关键函数会在流程中列出。
三、关键API
static const struct i2c_driver_api api_funcs = {
.configure = i2c_stm32_runtime_configure,
.transfer = i2c_stm32_transfer,
#if defined(CONFIG_I2C_SLAVE)
.slave_register = i2c_stm32_slave_register,
.slave_unregister = i2c_stm32_slave_unregister,
#endif
};
I2C操作的api都会注册进i2c_driver_api 结构体,下面具体讲讲每个函数。
i2c_configure
函数原型
int i2c_configure(const struct device *dev, uint32_t dev_config) 配置主机的i2c控制器 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
dev_config uint32_t 配置值,要求32位
dev_config可取以下选项
宏定义
I2C_SPEED_STANDARD 标准模式:100 kHz
I2C_SPEED_FAST 快速模式:400 kHz
I2C_SPEED_FAST_PLUS 快速模式+:1 MHz
I2C_SPEED_HIGH 高速模式:3.4 MHz
I2C_SPEED_ULTRA 超快速模式:5 MHz
I2C_ADDR_10_BITS 使用10位寻址。不推荐使用-改用I2C_MSG_ADDR_10_BITS
I2C_MODE_MASTER 使当前控制器作为主控制器
i2c_transfer
函数原型
int i2c_transfer(const struct device *dev, struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr) 在主模式下执行到另一个I2C设备的数据传输 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
msgs struct i2c_msg * 要传输的消息的msgs数组
num_msgs uint8_t 要传输的msgs数组长度
addr uint16_t I2C目标设备的地址
i2c_recover_bus
函数原型
int i2c_recover_bus(const struct device *dev) 恢复I2C总线,在I2C通讯时出现了异常错误导致后续无法正常通讯,可以使用这个API尝试恢复I2C,若不行需要重新断电复位 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
i2c_slave_register
函数原型
static inline int i2c_slave_register(const struct device *dev, struct i2c_slave_config *cfg) 将提供的配置注册为控制器的从属设备 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
cfg struct i2c_slave_config * 带有I2C驱动程序使用的函数和参数的cfg Config struct
i2c_slave_unregister
函数原型
static inline int i2c_slave_unregister(const struct device *dev, struct i2c_slave_config *cfg) 将提供的配置注销为从属设备 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
cfg struct i2c_slave_config * 带有I2C驱动程序使用的函数和参数的cfg Config struct
i2c_slave_driver_register
函数原型
int i2c_slave_driver_register(const struct device *dev) 指示I2C从设备将自身注册到I2C控制器 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
i2c_slave_driver_unregister
函数原型
int i2c_slave_driver_unregister(const struct device *dev); 指示I2C从设备从I2C控制器注销自身 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
i2c_write
函数原型
static inline int i2c_write(const struct device *dev, const uint8_t *buf, uint32_t num_bytes, uint16_t addr) 将数据写入I2C设备 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
buf const uint8_t * 传输数据的buf内存池
num_bytes uint32_t 传输数据的buf大小
addr uint16_t I2C设备地址
备注:此函数写入一次会产生起始与终止信号
i2c_read
参数名
static inline int i2c_read(const struct device *dev, uint8_t *buf, uint32_t num_bytes, uint16_t addr) 从I2C设备读取一定数量的数据 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
buf uint8_t * 存储数据的buf内存池
num_bytes uint32_t 存储数据的buf大小
addr uint16_t I2C设备地址
备注:此函数读取一次会产生起始与终止信号
i2c_write_read
函数原型
static inline int i2c_write_read(const struct device *dev, uint16_t addr, const void *write_buf, size_t num_write, void *read_buf, size_t num_read) 从I2C设备写入然后读取数据 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
addr uint16_t I2C设备地址
write_buf const void * 指向要写入的数据的指针
num_write size_t 要写入的字节数
read_buf void * 指向读取数据的存储器的指针
num_read size_t 要读取的字节数
备注:此函数只有在读取之后才会产生终止信号
i2c_burst_read
函数原型
static inline int i2c_burst_read(const struct device *dev, uint16_t dev_addr, uint8_t start_addr, uint8_t *buf, uint32_t num_bytes) 从I2C设备的内部地址读取多个字节 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
dev_addr uint16_t I2C设备地址
start_addr uint8_t 读取的地址
buf uint8_t * 指向读取数据的存储器的指针
num_bytes uint32_t 要读取的字节数
i2c_burst_write
函数原型
static inline int i2c_burst_write(const struct device *dev, uint16_t dev_addr, uint8_t start_addr, const uint8_t *buf, uint32_t num_bytes) 将多个字节写入I2C设备的内部地址。 0成功,非0失败
参数介绍
dev const struct device * 指向I2C Device的指针
dev_addr uint16_t I2C设备地址
start_addr uint8_t 写入的地址
buf uint8_t * 指向写入数据的存储器的指针
num_bytes uint32_t 要写入的字节数