Zephyr RTOS设备树实战:I2C配置
从一次凌晨三点的I2C死锁说起
去年做一款工业温湿度采集节点,STM32L4+Zephyr 2.7,I2C挂了三颗传感器:SHT30、BMP280、一个EEPROM。板子跑起来,读数据偶尔卡死,逻辑分析仪抓波形——SCL正常,SDA被拉死。查了两天,最后发现是设备树里I2C的clock-frequency写成了100000,但传感器手册明确写的是400000。更坑的是,Zephyr默认的I2C驱动在速率不匹配时不会报错,只会默默重试直到超时。从那以后,我养成了一个习惯:拿到任何I2C外设,第一件事就是对着数据手册和设备树逐字段核对。
设备树里I2C节点到底长什么样
先看一个典型的I2C控制器节点,以STM32为例:
&i2c1 { compatible = "st,stm32-i2c-v2"; clock-frequency = <100000>; // 别写错单位,这里是Hz status = "okay"; sht30@44 { compatible = "sensirion,sht3xd"; reg = <0x44>; // 7位地址,别写成0x88 label = "SHT30"; };