|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——凔海笔记之FPGA(十):玩一玩DS1302
( q2 ^, ^9 F! A4 r1 w* z
! K* `3 w3 {2 ]3 E* ?+ D3 @; M 现在这日子过得,一周四节课,没有考试没有作业更没有实验课,真不知道说什么好,还是来说说DS1302吧。(~ ̄▽ ̄)~
4 K' I; o6 W5 `! ]2 b. H: N 它生有八脚,电源分主备,晶振有要求,时序有讲究,可记年月日,可分闰是非,可显时分秒还有周。 6 I9 _6 T: P" E" `7 x, ~
DS1302,资料漫天飞舞,多得就像现在的杨花柳絮,所以学起来到不怎么费劲,0 ? ?3 [) c$ _$ [/ P
但是为了学习,嗯,为了好好学习,我还是要认认真真干下面这些事、0 p% R: J' O- `
1、了解DS1302时序) Z0 `: G$ c* b+ r, j
2、写Verilog代码8 q4 \1 e2 U- {+ |& l& c" o1 I
number one:6 Z1 w/ E8 _- N0 l
' A! ^+ K. r, Q( q看上图
9 b( g( q2 x* f# J# h* y) l1 mX1、X2:晶振要求32.768kHz=2^15。只是选择晶振时,不同的晶振,误差也较大,估计32.768Khz晶振,分频后,能精确的分出秒信号脉冲吧。* Y/ d7 R) ]% o3 u Q! J; C
CE:输入信号,在读、写数据期间,必须为高。
9 e: `: L* @* O SCLK:控制数据的输入与输出,上升沿写,下降沿读。
7 ]: [# ?; r0 u2 m d) b I/O:双向数据线
: r+ z: ]+ ^/ L9 h% H- n; u5 O: J就这些应该没了吧。其实,DS1302的操作,就是要整明白如何访问DS1302的寄存器,如何向DS1302写入数据和读出数据。, }+ a* [8 L8 x9 ^
下面就整吧。$ w5 y S, |: P+ b7 Y3 `4 n. n
先看, DS1302单字节写操作的时序图
' I% W' ?# `" H6 x$ J6 f
1 I) @1 t( ?0 U6 p* v! P
第一个字节是“访问寄存器的地址”,第二字节是“要写入的数据”。在写操作的时候,都是“上升沿有效”,即不管是“地址字节”还是“数据字节”,都是在SCLK的上升沿被采集的。(数据都是从最低位开始发送至最高位结束)
& K1 e1 q7 [) g 接下来是读操作时序图: e3 x) V9 a. z5 |* N% o
8 y& H1 t1 ]1 ^/ c; v( K6 d( c/ n3 ^读操作基本上和写操作的时序图差不多,区别的地方就是在第二个字节时 “读的数据” 的动作。 第二字节读数据开始时, SCLK 信号都是 “下降沿有效” 。/ Z+ n9 r+ L6 |. k
并且CE信号都是处于高电平状态的,所以在对DS1302进行读写操作前都要拉高CE信号开始,操作结束后拉低CE信号结束。
" b7 M1 Q" V: r- K: D这是访问寄存器地址的格式表:8 y6 W) @' d9 t, Q
$ R) k; _# N! [# H- k 读和写操作,都是先发送一个字节的“访问寄存器的地址”。这些寄存器地址格式如上图所示:
( g- |0 z( [3 w) O a+ |# _+ P' mBit 7 固定,为“1”
% J8 O9 b7 b$ T% H# a5 a+ a RBit 6 表示是访问寄存器本身,还是访问 RAM 空间。. ^( G' K; H1 m. ^9 A! X" B
注:为“1”表示访问RAM,为“0”表示访问寄存器本身
, R+ f+ [! L0 ]2 VBit 5-1 表示是寄存器或者RAM 空间的地址。
+ t4 f! o: a9 c" Y$ h8 q# R注:表示具体的寄存器或者RAM地址,跟bit6相关! U0 [( o3 P- E% X
Bit 0 表示是访问寄存器本身是写操作,还是读操作,1读0写。
, Y# \) B4 F& I' X7 ~( i日历、时钟寄存器与控制字对照表如图:
1 a& W2 x" A, Z8 a) C9 Y4 a1 Z3 [
5 u3 L8 x8 e9 }! e w# q+ t
对于写指令,黑金告诉我可以这样来表示这八位地址指令:+ L% e6 }3 k( s9 t
{ 2'b10 , 5'd Addr, 1'b RD/W }说是可以提高些解读性。+ }) n: p9 }1 {: R5 E9 L: Q4 U8 m
例如:{ 2'b10, 5'd0, 1'b0 }写秒、{ 2'b10, 5'd1, 1'b1 }读分。
( Z/ G* |! }( A+ H$ ?
) l: z5 _% c' u5 U下图为DS1302各个寄存器的地址组成:
* o" L1 F) t! ^! _) Q! \
7 ?4 S4 d" f, f! E X, V$ ]
这个表述了每一个寄存器的字节配置,我们可以初始化时钟开始时的时间。4 \5 `3 N: t8 H% Q
如果笔者要初始化分为33,那我就先写指令{ 2'b10, 5'd1, 1'b0 } ,接着写数据{ 4'h3, 4'h3 }。就这样: i; O' c% Q L' ]# P+ s
不过有三个寄存器值得一说,
+ ^) C' o9 p3 @4 ^1、“秒”最到位为0启动,1关闭0 I* @! m1 p" @# w/ I0 o3 y# ?6 H
2、“时”最高位置一则十二进制,0为24.
" H9 K7 i# ]2 O0 Y! |. t0 @" L3、WP写0关闭写保护,写1打开写保护,所以重新设置时钟时间时需要将此关闭。
/ I$ K* O* r/ s+ G那么,因为就6位数码管,所以我们要初始化DS1302位23时59分50秒怎么做?( G- c4 } x0 D8 M% ?( ^) Z
1、关闭写保护。
1 A6 Z5 B( X! B8 s. q2、改变时寄存器7 N7 l, I" O# h3 P+ d2 F0 J
2、改变分寄存器
5 q* x0 _% C0 d0 C* c* @7 Y3、改变秒寄存器
$ t3 J3 @1 h( n8 I4、不断读取时分秒寄存器。2 ]* u* y. z( B( h' Y' g
用Verilog怎么来描述呢?
: u A+ P- {+ c' ~, d: w4 H- anumber two3 c0 V. i% E, c
其实和IIC单字节的读写是差不多的,也是三个模块,
, t+ O% m! Z2 S数码管显示模块:Smg_module+ j0 M7 j; Q7 D C
DS1302功能模块:DS1302_function_module
/ L5 a$ I' Y" l4 Q0 k+ ~2 D控制模块:DS1302
6 a3 C9 b# z W/ y' l数码管显示模块就不说了,和IIC一样。7 n0 a+ T( W! D
DS1302功能模块:DS1302_function_module就是讲读写时序图描述出来,让我郁闷的是,读DS1302的读写时钟是多少呢?百度没找到,然后就参考人家的了。
3 N) r8 k- ~# D5 N$ ? O
3 B+ E1 h- {. a" b
# y+ u8 x2 X$ E' f
5 b A& m8 @8 Q F
写到这,我发现我真是闲得蛋疼,这表格画的,啧啧 | 6 Z+ r. u% n5 s: H& a
|
|