nxp上面RTC以及温度驱动调试

                                                   nxp上面RTC芯片(PCF85263A)调试

  • 一、硬件信息

1.CPU(LS1023AX)

2.RTC (PCF85263A)

 

  • 二、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芯片的硬件功能是否正常了!

 

  • 四、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设备的命令添加进去。

二、让系统自动生成RTC设备

这个需要修改添加rtc的设备树节点

&i2c0 {
	status = "okay";
	ina220@40 {
		compatible = "ti,ina220";
		reg = <0x40>;
		shunt-resistor = <1000>;
	};
	adt7461a@4c {
		compatible = "adi,adt7461";---添加温度芯片的设备树节点
		reg = <0x4c>;
	};
	eeprom@52 {
		compatible = "atmel,24c512";
		reg = <0x52>;
	};
	eeprom@53 {
		compatible = "atmel,24c512";
		reg = <0x53>;
	};
	rtc@68 {
		compatible = "pericom,pt7c4338";
		reg = <0x68>;
	};
	rtc@51 {
		compatible = "nxp,pcf85263";----添加rtc的设备树节点
		reg = <0x51>;
	};
};

结尾:参考帖子

【树莓派】RTC时钟模块安装教程第二部分:Rasbian(linux)下配置工作

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值