085、Zephyr RTOS驱动开发实战:I2C驱动
Zephyr RTOS驱动开发实战:I2C驱动
一、一个让我熬夜到凌晨三点的I2C问题
去年做工业传感器采集板,STM32F4主控挂了三颗I2C设备:温度、湿度、气压传感器。板子跑起来,温度读数正常,湿度偶尔跳变,气压直接卡死在0x00。示波器一挂,SCL波形漂亮得像教科书,SDA却时不时多出一个莫名其妙的低电平脉冲。
查了两天,最后发现是Zephyr的I2C驱动配置里,I2C_DEVICE_CONFIG结构体的addr字段我写成了7位地址,而传感器手册给的是8位地址(含读写位)。Zephyr默认用7位地址,多出来的那一位被当成了数据,直接把总线搞崩了。
从那以后,我养成了一个习惯:拿到任何I2C器件,第一件事就是确认地址格式,然后去drivers/i2c目录下翻对应SoC的驱动实现。
二、Zephyr I2C驱动架构:别被分层吓到
Zephyr的I2C子系统分三层,但实际开发中你只需要关心最上面和最下面:
应用层 -> API层 (i2c.h) -> 驱动层 (i2c_<soc>.c) -> 硬件寄存器API层提供统一的i2c_transfer、i2c_write_read等接口,驱动层负责操作具体寄存器。中间有个i2c_context结构体,里面存了配置、回调、状