一、问题现象

  • 内核启动时 rtc-pcf8563 probe 失败

  • i2cdetect -y 2 扫描无任何地址响应

  • 系统只有内部 RTC (/dev/rtc0),没有外部 RTC (/dev/rtc1)


二、软件层面排查

2.1 检查启动日志

[ 2.808614] sunxi:i2c_sunxi@2502800.twi[ERR]: SLA+W has been transmitted; ACK not received [ 2.817833] sunxi:i2c_sunxi@2502800.twi[ERR]: engine mode: TWI BUS error state is 0x20 [ 2.828569] sunxi:i2c_sunxi@2502800.twi[ERR]: engine-mode: xfer failed(dev addr:0x51) [ 2.837338] rtc-pcf8563 2-0051: pcf8563_write_block_data: err=-22 addr=0e, data=03 [ 2.845802] rtc-pcf8563 2-0051: pcf8563_probe: write error [ 2.851990] rtc-pcf8563: probe of 2-0051 failed with error -5

结论:I2C 控制器发送了地址,但 AT8563 没有 ACK 响应。


2.2 检查设备树配置

确认 &twi2 节点:

  • status = "okay" ✓

  • pinctrl-0 = <&twi2_pins_a> (PG6/PG7) ✓

  • clock-frequency = <400000> ✓

  • pcf8563@51 节点正确 ✓

尝试修改:twi_drv_used = <0>(PIO 模式,禁用 DMA)


2.3 检查引脚复用寄存器

起始地址为

偏移量为:0x0120

将范围写入dump文件夹,随后查看寄存器

echo 0x02000120 > /sys/class/sunxi_dump/dump; cat /sys/class/sunxi_dump/dump # 结果:0x33222222

PG6/PG7 = 0x3 (TWI2),寄存器配置正确。


2.4 检查 pinmux 状态

cat /sys/kernel/debug/pinctrl/pio/pinmux-pins | grep -E "PG[67]"# pin 198 (PG6): device 2502800.twi function gpio_in group PG6# pin 199 (PG7): device 2502800.twi function gpio_in group PG7

发现:function 显示为 gpio_in,而非 twi2。怀疑 pinctrl 未正确切换。


2.5 手动修改寄存器验证

echo 0x02000120 0x00332222 > /sys/class/sunxi_dump/write

修改后寄存器正确,但 I2C 仍然无 ACK。

结论:软件配置基本正确,问题可能不在软件。


三、硬件层面排查

3.1 测量上拉电阻

量 R469 (10KΩ 上拉):

  • 靠近 VCC-IO 端 = 3.3V ✓

  • 靠近 EXT-RTC-SDA 端 = 3.3V ✓

上拉正常。


3.2 测量供电

量 AT8563 (U43) Pin 8 (VDD):

  • 电压正常 ✓

供电正常。


3.3 示波器抓波形

表格

信号现象
SCL无波形
SDA无波形

关键发现:SCL 没有时钟信号传到 AT8563!


3.4 万用表测通断

重点检查 PG6 → EXTRTC-SCK 路径:

表格

测试点结果
R880 (0Ω) 两端不通!

定位根因:R880 虚焊/开路,导致 SCL 信号断路。


3.5 修复验证

  1. 重新焊接 R880

  2. 再测通断 → 正常

  3. 重启开发板

  4. 验证结果:

# ls /dev/rtc* /dev/rtc /dev/rtc0 /dev/rtc1 # cat /sys/class/rtc/rtc1/name rtc-pcf8563 2-0051 # hwclock -f /dev/rtc1 -w# hwclock -f /dev/rtc1 Wed Jul 8 15:20:16 2026 0.000000 seconds

外部 RTC 正常工作!


四、根因分析

R880 (0Ω 跳线电阻) 虚焊 ↓ PG6 (TWI2-SCK) 信号断路 ↓ AT8563 收不到 SCL 时钟 ↓ 无法响应 I2C 地址 (无 ACK) ↓ pcf8563 probe 失败 ↓ 无 /dev/rtc1 节点


五、排查流程图


开始 -> 检查启动日志 -> 发现 I2C ACK 错误 -> 检查设备树配置 -> 确认软件配置正确-> 检查引脚寄存器 -> 0x33222222->配置正确 -> 检查 pinmux 状态 -> function 显示 gpio_in(疑点)-> 手动改寄存器验证 ->仍无 ACK,排除纯软件问题-> 测量上拉/供电 -> 正常-> 示波器抓波形 -> SCL 无波形-> 万用表测通断 -> R880 不通->定位根因-> 重新焊接 R880 -> 验证修复结果 -> /dev/rtc1 出现->工作正常


六、经验教训

表格

要点说明
0Ω 电阻容易虚焊量产时需重点检查
示波器量信号要量两端不能只看芯片侧,要看设备侧
I2C 无 ACK 不一定是地址问题可能是时钟/数据线断路
软件排查到底后及时转硬件避免在软件层面过度纠结
通断测试是硬件调试基础比量电压更能定位断路问题

七、最终设备树配置

&twi2 {

clock-frequency = <400000>;

pinctrl-0 = <&twi2_pins_a>;

pinctrl-1 = <&twi2_pins_b>;

pinctrl-names = "default", "sleep";

twi_drv_used = <0>;

// 使用 PIO 模式(可尝试恢复为 <1> 以启用 DMA 模式)

no_suspend = <1>; status = "okay";

        pcf8563@51 { status = "okay"; compatible = "nxp,pcf8563";

                   reg = <0x51>;

                  };

};

更多推荐