nxp上面RTC芯片(PCF85263A)调试
1.CPU(LS1023AX)
2.RTC (PCF85263A)
PCF85263A微型实时时钟/日历是一个CMOS实时时钟(RTC)和日历,经过优化实现了低功耗,
并可在主电源掉电时自动切至电池供电。
此篇主要介绍了PCF85263A特性、应用范围、参考设计电路以及电路分析,帮助大家缩短设计时间。
PCF85263A由电池切换以及输入驱动事件所触发的三个时间记录寄存器。
支持时钟输出和两路独立中断信号、两路警报、I2C接口和石英晶体校准。
PCF85263A特性:两个独立闹钟、电池后备电路、看门狗定时器、三个时间戳寄存器、两个独立中断发生器,
加每秒、分钟或小时预定义中断、通过可编程偏移寄存器进行频率调节
PCF85263A典型应用范围包括:打印机、复印件、电子计量、数码相机、白色家电、越时计数器、网络受电设备、电池后备系统、数据记录器、数字录音器、移动设备、精确高耐用定时器。
首先RTC硬件电路是使用I2C接口来控制的。
1.首先内核添加PCF85263A的驱动。
CONFIG_RTC_DRV_PCF85263=y
2.调试i2c的一个非常好用的工具i2c-tools
第一步查看i2c生成的设备
root@localhost:~# ls /dev/i2c-*
/dev/i2c-0
这里可以看到设备上面生成的i2c设备是i2c-0
第二步使用i2cdetect查看rtc芯片在i2c里面使用的地址
下面命令sudo i2cdetect -y 0最后的参数0就对应上面的i2c-0最后的0
root@localhost:~# sudo i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- 08 -- -- -- 0c -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- 4c -- -- --
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- 69 -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
这里0x51就是rtc芯片(PCF85263A)的地址,0x4c是温度芯片(ADT7461)的地址。
第三步使用i2cdump -y 0 0x51查看地址0x51上面各个寄存器地址的值
root@localhost:~# i2cdump -y 0 0x51
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 03 c0 11 14 03 07 20 00 00 02 00 00 00 00 08 .?????? ..?....?
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
20: 00 00 00 00 00 02 00 83 07 80 80 08 00 00 00 00 .....?.?????....
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
40: 88 c0 00 04 00 00 01 40 a0 00 40 00 04 00 00 00 ??.?..?@?.@.?...
50: 10 01 10 03 00 90 00 00 00 00 00 10 40 14 10 00 ????.?.....?@??.
60: 01 00 00 00 00 00 40 0a 10 90 00 00 00 00 00 10 ?.....@???.....?
70: 00 00 01 00 a0 04 00 00 00 00 04 00 a0 04 01 c0 ..?.??....?.????
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
参考RTC芯片手册里面的介绍
第四步直接使用i2cget/i2cset命令设置相关的寄存器
比如这里使用停止/启动 RTC来举例子
查看RTC芯片手册 停止/启动的寄存器地址为(0x2e)
停止RTC计时
i2cset -y 0 0x51 0x2e 0x01
启动RTC计时
i2cset -y 0 0x51 0x2e 0x00
启动RTC计时以后,再看RTC的秒数,它就在不停的递增了。
i2cget -y 0 0x51 0x01
到这一步基本上就验证了RTC芯片的硬件功能是否正常了!
但是如果要使用linux命令hwclock来使用RTC的话,就需要让系统生成rtc设备。
在生成rtc设备的过程中,我走了很多弯路,首先地址搞错了,导致hwclock一执行,系统就挂掉了。
一、生成rtc设备
我在网上找了很多帖子,找到几个树莓派调试RTC的帖子
一开始我使用rs3231以及0x69来生成,
PS:上面2个参数一开始我不明白,按照网上帖子里面的来写,只是将0x68改为0x69
echo rs3231 0x69 | sudo tee /sys/class/i2c-adapter/i2c-0/new_device
执行完上面的命令以后,生成了/dev/rtc0
root@localhost:~# ls /dev/rtc* -al
lrwxrwxrwx 1 root root 4 Jan 28 2018 /dev/rtc -> rtc0
crw------- 1 root root 250, 0 Jan 28 2018 /dev/rtc0
然后执行hwclock的时候提示参数错误
root@localhost:~# hwclock -r
hwclock: ioctl(RTC_RD_TIME) to /dev/rtc0 to read the time failed: Invalid argument
网上找到的解决办法是在读取rtc之前要初始化rtc
初始化rtc
hwclock --systohc -D --noadjfile --localtime
设置rtc时间
hwclock --systohc -D --noadjfile --localtime
hwclock --set --date "2020-07-14 15:05:30"
但是我在设备上一执行 初始化RTC的命令,设备就挂掉了。
肯定是上面生成rtc设备的参数错了。
后面仔细查看上面生成的rtc设备命令
echo rs3231 0x69 | sudo tee /sys/class/i2c-adapter/i2c-0/new_device
rs3231是指定rtc芯片的驱动,这个要与RTC芯片驱动代码对应起来
0x69是指定rtc芯片的地址
发现我RTC芯片用的是PCF85263A,对应的驱动为pcf85263,rtc芯片地址是0x51
修改上面命令为,驱动为pcf85263,地址为0x51
echo pcf85263 0x51 | sudo tee /sys/class/i2c-adapter/i2c-0/new_device
再执行初始化rtc以及设置rtc时间,一切都变得正常了。hwclock命令都正常了!
遗留的问题是,在驱动代码里面怎么让设备自动生成rtc设备。
我现在的做法是在/etc/rc.local 里面,将生成rtc设备的命令添加进去。
结尾:参考帖子