树莓派1B通过设备树配置RTC DS1302内核驱动失败求助
树莓派1B(Bullseye)DS1302 RTC内核设备树配置修复方案
问题根源
你之前的配置错误在于:要么误用了软件模拟SPI(spi-gpio),要么设备树overlay的参数没有匹配DS1302的3wire半双工、CS高电平有效、LSB优先这些关键特性,导致内核无法正确识别设备。
步骤1:切换到硬件SPI控制器
BCM2835的SPI0确实支持3wire半双工模式,没必要用软件模拟。先清理旧配置:
- 编辑
/etc/modules,删掉spi-gpio和rtc-ds1302(设备树会自动触发模块加载) - 打开
/boot/config.txt,确保启用硬件SPI:dtparam=spi=on
步骤2:编写正确的设备树overlay
创建ds1302-spi.dts文件,内容完全匹配你的接线和DS1302特性:
/dts-v1/; /plugin/; / { compatible = "brcm,bcm2835"; fragment@0 { target = <&spi0>; __overlay__ { status = "okay"; #address-cells = <1>; #size-cells = <0>; ds1302@0 { compatible = "maxim,ds1302"; reg = <0>; spi-max-frequency = <1000000>; spi-cs-high; /* DS1302 CS高电平有效 */ spi-lsb-first; /* LSB优先传输 */ spi-3wire; /* 半双工3wire模式 */ pinctrl-names = "default"; pinctrl-0 = <&ds1302_cs>; }; }; }; fragment@1 { target = <&gpio>; __overlay__ { ds1302_cs: ds1302_cs { brcm,pins = <17>; /* CS引脚GPIO17 */ brcm,function = <0>; /* 通用IO输出 */ brcm,pull = <0>; /* 禁用上下拉 */ }; }; }; fragment@2 { target = <&spi0_gpio32_36>; /* 重映射SPI0引脚 */ __overlay__ { brcm,pins = <27 18>; /* SCK=GPIO27, MIMO=GPIO18 */ brcm,function = <4>; /* ALT0复用为SPI功能 */ }; }; };
步骤3:编译并安装overlay
执行编译命令:
dtc -I dts -O dtb -o ds1302-spi.dtbo ds1302-spi.dts
把编译好的文件放到overlay目录:
sudo cp ds1302-spi.dtbo /boot/overlays/
步骤4:配置启动加载并验证
编辑/boot/config.txt,添加overlay加载:
dtoverlay=ds1302-spi
重启后做以下验证:
- 查看内核日志确认设备加载:
正常会输出类似dmesg | grep ds1302maxim,ds1302 spi0.0: registered as rtc0的日志 - 检查RTC设备节点:
应该能看到ls /dev/rtc*/dev/rtc0 - 测试时钟读取:
sudo hwclock -r
常见坑修复
- SPI模式不支持报错:Bullseye默认内核已经支持DS1302的3wire模式,如果报错,执行
sudo apt update && sudo apt upgrade升级内核到最新版本。 - CS引脚无响应:检查GPIO17的接线,确保没有短路,设备树里的
brcm,pull设置为0,避免上下拉干扰。 - 模块未加载:如果
rtc-ds1302没自动加载,手动执行modprobe rtc-ds1302,然后看dmesg的报错信息定位问题。
内容的提问来源于stack exchange,提问作者Pliskin
相关产品推荐
相关产品推荐

