- 经验
- 130
- 分贝
- 0
- 家园分
- 366
- 在线时间:
- 178 小时
- 最后登录:
- 2021-2-23
- 帖子:
- 63
- 精华:
- 0
- 注册时间:
- 2009-10-21
- UID:
- 449418
注册:2009-10-21
|
这几天在做RTC的应用,内核选择的是kernel2.6.20,gcc版本:3.4.1,选择的外围芯片是DS1307,电路参照datasheet。过程中遇到的问题如下:
1.对内核组成不熟,在RTC驱动选择中选择了:
导致内核打印
<7>at91_rtc at91_rtc: rtc intf: sysfs
<7>at91_rtc at91_rtc: rtc intf: proc
<7>at91_rtc at91_rtc: rtc intf: dev (254:0)
<6>at91_rtc at91_rtc: rtc core: registered at91_rtc as rtc0
<7>at91_rtc_readtime(): 1998-00-01 00:00:30
<6>at91_rtc at91_rtc: setting the system clock to 1998-01-01 00:00:30 (883612830)
如果如上选择:会出现<7>i2c-core: driver [ds1307] registered
自己写RTC读写代码,对rtc0进行操作,编译运行发现:
时间正常读取和写入,也能够向后计时,但是:无论是掉电重启、还是复位,时间都会消失,恢复到<7>at91_rtc_readtime(): 1998-00-01 00:00:30
内核debug发现,根本就没走到DS1307.c中的函数,也就是说registered at91_rtc as rtc0,只是对at91rm9200-rtc.c进行了操作,说明这是自带的RTC电路,跟CPU相关,操作相关寄存器即可对其控制。去掉:
此时会注册ds1307为rtc0设备文件。过程发现
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
内核debug发现是
读取时间为-1、0等,导致判断month、mday范围出界,goto exit导致跳出,打不开即报上述错误。
DS1307 init!
i2c /dev entries driver
DS1307 detect!
DS1307 1!
DS1307 BCD!
DS1307 +0!
DS1307 min!+3
DS1307 3!
DS1307 ds_1307!
DS1307 attach client!
ds1307 0-0068: rtc core: registered ds1307 as rtc0
DS1307 register!
at91_i2c at91_i2c: AT91 i2c bus driver.
TCP cubic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
ds1307 0-0068: hctosys: invalid date/time
注释掉相关时间判断goto语句,最后运行如上。
不管这些错误,此时rtc0已经出现。(注意,如果regieter失败,是无法找到rtc0的)。
./rtc -r
2000.-1.00,-1,00:00:00
./rtc -w 2010.04.08,1,17:03:00
重启系统发现
ds1307 0-0068: setting the system clock to 2010-04-08 17:03:00 (1270746180)
时间掉电保护,但是没走
看datasheet可以看到CH影响计时器的使能,但是内核有判断,并置位为0,enable;
所以考虑可能是晶振没有起来,自然不会计时。首先是去测试上电、掉电的晶振频率,发现内核这边有32.768k左右的频率,但是外围RTC的晶振没有,尝试第二板也没有,换掉电容、晶振还是测试不出来。但是第三板是好的,两个地方都是32K左右,估计肯定行!果然,加上电池,效果出现了,掉电保护,并且正常计时。
另外一个问题就是使用示波器的知识:测试频率,最好打成10倍衰减档,不然32K测不出来
|
|