|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——凔海笔记之FPGA(十):玩一玩DS1302 % X* l* H2 u1 V
% s6 B$ [# N1 u% h3 e/ y4 @! N6 i
现在这日子过得,一周四节课,没有考试没有作业更没有实验课,真不知道说什么好,还是来说说DS1302吧。(~ ̄▽ ̄)~
& K) z+ Z7 M+ L6 j$ r# j; H 它生有八脚,电源分主备,晶振有要求,时序有讲究,可记年月日,可分闰是非,可显时分秒还有周。
$ f! w. t/ {2 d2 H' oDS1302,资料漫天飞舞,多得就像现在的杨花柳絮,所以学起来到不怎么费劲,6 s' Q& r% x; D1 R, C
但是为了学习,嗯,为了好好学习,我还是要认认真真干下面这些事、
2 p6 k0 m" g2 W# R! n1、了解DS1302时序
" h3 r2 E: V, H& K' i3 H" K, D4 Q2、写Verilog代码+ g) J! h: @6 O( b' F
number one:
! f, P a0 n# I- U. w K
- w3 O. ^4 u+ P6 l看上图 4 S0 ?! B+ [: y% l) ~0 w( }+ f
X1、X2:晶振要求32.768kHz=2^15。只是选择晶振时,不同的晶振,误差也较大,估计32.768Khz晶振,分频后,能精确的分出秒信号脉冲吧。0 G6 f, z, p" F) e8 ?& n4 K
CE:输入信号,在读、写数据期间,必须为高。
4 [3 q- T6 `4 A6 M$ w* s8 v SCLK:控制数据的输入与输出,上升沿写,下降沿读。, c2 w% m( Q$ V; _$ I" \
I/O:双向数据线
) j5 M5 n$ F) v; m% ?/ P( k: r就这些应该没了吧。其实,DS1302的操作,就是要整明白如何访问DS1302的寄存器,如何向DS1302写入数据和读出数据。! N2 A" ~( l6 Y
下面就整吧。
6 p# W7 o( R0 Z$ D2 U( W9 r先看, DS1302单字节写操作的时序图
5 v* |2 B) b6 B; ]$ G, X; O) w
) r/ a3 v5 l( @ ?9 Y( u
第一个字节是“访问寄存器的地址”,第二字节是“要写入的数据”。在写操作的时候,都是“上升沿有效”,即不管是“地址字节”还是“数据字节”,都是在SCLK的上升沿被采集的。(数据都是从最低位开始发送至最高位结束)3 O3 t2 M) ?2 D: n2 [; g. V
接下来是读操作时序图
s' N4 i: s9 v" J& `
4 W+ R. ]9 u. c7 Q, g: Z1 L c读操作基本上和写操作的时序图差不多,区别的地方就是在第二个字节时 “读的数据” 的动作。 第二字节读数据开始时, SCLK 信号都是 “下降沿有效” 。
" c; ^$ R/ C5 j) T- L$ G 并且CE信号都是处于高电平状态的,所以在对DS1302进行读写操作前都要拉高CE信号开始,操作结束后拉低CE信号结束。1 Y2 j- I2 w B. [6 w/ d
这是访问寄存器地址的格式表:/ T) i0 m3 Y0 ^9 n" O' A
/ S* X( ]; g- Y2 j 读和写操作,都是先发送一个字节的“访问寄存器的地址”。这些寄存器地址格式如上图所示:& j. w+ R2 Q U) x+ I
Bit 7 固定,为“1”
3 o" C) x! t$ f* J: s5 H( MBit 6 表示是访问寄存器本身,还是访问 RAM 空间。- J `/ V3 |* |. q% ]: B0 w
注:为“1”表示访问RAM,为“0”表示访问寄存器本身
. n8 u4 N4 ]0 [+ NBit 5-1 表示是寄存器或者RAM 空间的地址。
1 t# ?# x7 O% @0 c$ Q注:表示具体的寄存器或者RAM地址,跟bit6相关
, b. N: e: }: ]. K1 QBit 0 表示是访问寄存器本身是写操作,还是读操作,1读0写。8 u8 u# ?- ?3 [ o- e
日历、时钟寄存器与控制字对照表如图:+ _- ~$ B- B, ]! ^ @
( x& e- Q8 W! @4 X6 ~3 ^0 X( m
对于写指令,黑金告诉我可以这样来表示这八位地址指令:2 V0 |4 H/ O1 o5 B3 G
{ 2'b10 , 5'd Addr, 1'b RD/W }说是可以提高些解读性。
) T2 w+ i7 ~" X8 j' X例如:{ 2'b10, 5'd0, 1'b0 }写秒、{ 2'b10, 5'd1, 1'b1 }读分。. F- k& a. t- ]& f1 s' L
& ^* u( D% d* b7 W. v, F
下图为DS1302各个寄存器的地址组成:+ U/ N' G. X M
3 n' s! ^" \4 L2 g
这个表述了每一个寄存器的字节配置,我们可以初始化时钟开始时的时间。
) O1 B% M0 J3 d. S% d7 o7 _& y) f% J如果笔者要初始化分为33,那我就先写指令{ 2'b10, 5'd1, 1'b0 } ,接着写数据{ 4'h3, 4'h3 }。就这样! @& |1 x- K" K9 C g# R. ?
不过有三个寄存器值得一说,1 J: s0 M$ O+ R9 j% \% s6 T
1、“秒”最到位为0启动,1关闭# B" f0 t1 u7 I m6 W" s9 ?/ i5 e
2、“时”最高位置一则十二进制,0为24.
% D( K# a. G9 c5 m' P3、WP写0关闭写保护,写1打开写保护,所以重新设置时钟时间时需要将此关闭。
5 W( Q9 s5 b+ ?. ~9 a那么,因为就6位数码管,所以我们要初始化DS1302位23时59分50秒怎么做?
! I! M$ \& d8 t1、关闭写保护。
1 v) M) b0 B8 t2、改变时寄存器7 U6 n9 j D* N
2、改变分寄存器7 h4 S, \+ a( T! l" {3 A0 G1 W
3、改变秒寄存器
% T( w! {; ~- c( {" N. S+ J2 ]$ }4、不断读取时分秒寄存器。
" w. u- F5 w# d# F- V8 q% }: C用Verilog怎么来描述呢?
* n; _0 ^9 ]! A/ Q4 o% }$ _number two
" ]% \8 ^' q; q1 X( p. W 其实和IIC单字节的读写是差不多的,也是三个模块,9 x! J6 X3 w" w, ~! m4 L: I
数码管显示模块:Smg_module+ [; d8 y- q. X
DS1302功能模块:DS1302_function_module$ q0 l4 G+ D2 l2 x$ I% k
控制模块:DS1302# a% Z1 L/ g1 q- y0 O. _! n
数码管显示模块就不说了,和IIC一样。" L% t" D, a; V
DS1302功能模块:DS1302_function_module就是讲读写时序图描述出来,让我郁闷的是,读DS1302的读写时钟是多少呢?百度没找到,然后就参考人家的了。; B% w' P8 w7 F i
; s# ^/ U2 g7 r* R3 Q3 p
; ^# C* }% G0 Y% k& W& N X* A
* i3 R$ H$ k' ]
写到这,我发现我真是闲得蛋疼,这表格画的,啧啧 |
$ _ F* o7 y/ F |
|