Zephyr调用I2C接口相关流程及API

本文详细介绍了在Zephyr中通过HAL库调用I2C硬件驱动的方法,涉及I2C启动流程,以及关键API如i2c_configure、i2c_transfer等的使用、配置和功能。重点讲解了在调试官方demo时的工程配置和如何处理I2C通信中的问题。
摘要由CSDN通过智能技术生成

一、前言


    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 要写入的字节数

  • 20
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值