

DS1302计时芯片和串行通信
source link: https://z-rui.github.io/post/2016/03/ds1302/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

DS1302计时芯片和串行通信
Wed Mar 30, 2016
我的FPGA开发板上有一个DS1302芯片,这是Dallas公司生产的计时芯片。它可以记录年、月、日、星期、时、分、秒信息,并且可以在断电时通过后备电源(电池)保持时钟的运行。
所以我打算利用这个芯片的功能做设计一个数字钟电路。首先需要解决的问题是和该芯片的通信。DS1302采用串行端口进行通信,因此我需要研究进行串口通信的方法。
研究DS1302的通信时序图,
看似简单的时序图其实包含了大量的信息,值得仔细地研究。
首先可以看出,DS1302通过三个引脚与主机通信,分别是
NRST
片选信号,用于启用/禁止串行通信。DATA
数据信号,传输输入/输出数据。SCLK
串行时钟信号,用于控制串行通信的节拍。
每次与DS1302通信传输2个字节,第1个字节是控制信息,表明是要进行读或者写操作,读写哪一个寄存器。第2个字节是数据信息。这两个字节的取值可以参考下表。
大体上说,DS1302是以BCD码的形式表示数据的。这样便于直接显示到数码管上,但是不便于计算机处理。
回头仔细研究时序图,可知如下的要领:
- 写入时,主机在SCLK下降沿设置DATA,从机在上升沿采样。
- 读取时,从机在SCLK下降沿设置DATA,主机在上升沿采样。
简言之:下沿写,上沿读。
根据这个规律,可以编写一个状态机。在每个状态下将SCLK
翻转两次,并且在每个下降沿时刻,将下一个上升沿应当写入的比特送到DATA
引脚。状态机的思想非常有用,运用它既可以设计出时序逻辑电路,又可以设计出计算机程序。
如果是构建一个时序逻辑电路,还需要注意一个问题:DATA
引脚是双向引脚,读和写的寄存器都会连接到这个引脚。这个时候,需要在写寄存器的输出端放置一个三态门,当处于读的过程时,三态门应当处于高阻态,阻断输出寄存器的信号,以防和DATA
引脚的输入信号发送冲突。
串行通信调试成功之后,应当注意:上电时,计时器可能处于暂停状态,这是由秒寄存器的最高位C控制的。当C=1时,计时暂停,芯片进入低能耗状态。为了能使计时器正常工作,需要设置C=0。
设置C=0之前,还要确保芯片的写保护是关闭的。将地址为8E的寄存器的最高位WP设置为0,就关闭了写保护。
因此,初始化工作应该是这样的:
- 关闭写保护。
- 设置年、月、日、星期、时、分、秒信息。
- 将秒寄存器的最高位设置为0,计时开始。
顺便一提,Quartus Prime软件提供的Signaltap II逻辑分析仪无比好用。用它可以像使用真实的逻辑分析仪那样,观察各个引脚的信号值,甚至可以观察到FPGA内部节点的信号值。这对于调试电路来说是有巨大的帮助的。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK