【紫光同创国产FPGA教程】【第二十二章】RTC时间实验

1. 实验简介 实验通过阅读ds1302芯片手册,了解ds1302操作时序和相关寄存器,然后设计程序将ds1302 rtc时间通过串口发送到pc,通过串口调试助手可以看到时间信息。
2. 实验原理 rtc(real-time clock)实时时钟为系统提供一个可靠的时间,并且在断电的情况下,rtc实时时钟也可以通过电池供电,一直运行下去。rtc通过类spi总线向fpga传送8位数据(bcd码)。数据包括秒,分,小时,日期,天,月和年。在本实验中我们将读取rtc的时,分,秒的数据通过串口发送到pc。
2.1 硬件介绍
开发板上rtc设计采用dallas公司的低功耗实时时钟芯片ds1302, ds1302的vcc2为主电源,vcc1为后备电源。在主电源关闭的情况下,也可以通过电池保持时钟的连续运行。ds1302外接32.768khz晶振为rtc电路提供振荡源。 rtc部分的原理图如下图所示:
开发板rtc  
2.2 ds1302时序和控制
1)写数据时序
ds1302芯片写操作的时序图。第一个字节是“访问寄存器的地址”,第二字节是“写数据”。在写操作的时候,都是“上升沿有效”,然而还有一个条件,就是ce(/rst)信号必须拉高。(数据都是从lsb开始发送,亦即是最低位开始至最高位结束)。
ds1302写时序  
2)读数据时序
基本上和写操作的时序图大同小异,区别的地方就是在第二个字节是“读数据”的动作。第二字节读数据开始时,sclk信号都是下降沿送出数据,这个时候可以使用上升沿读取数据。ce(/rst)信号同样是必须拉高。(第一节数据是从lsb开始输出,第二节数据是从lsb开始读入)。
3)命令格式和寄存器
无论是读操作还是写操作,在时序图中,第一个字节都是“访问寄存器的地址”,然而这一字节数据有自己的格式。
bit 7 固定。 bit 6 表示是访问寄存器本身,还是访问ram空间。 bit 5 到bit1 表示是寄存器或ram空间的地址。 bit 0 表示是访问寄存器本身是写操作,还是读操作。
下图是ds1302的寄存器地址和数据格式
3. 程序设计 通过分析ds1302读写时序,可以看出和spi时序类似,只不过数据输出和输入分时复用了,本实验利用spi master模块来做为ds1302的底层读写控制模块,然后再编写一个rtc读写模块。
ds1302_io模块完成ds1302寄存器读写控制,状态机如下图所示。
状态“s_idle”空闲状态,收到读写寄存器请求写进入“s_ce_high”状态,将ce拉高,然后根据请求类型,进入读(s_read)或写状态(s_write)。
“s_write”状态下一个状态进入写地址状态“s_write_addr”,再进入写数据状态“s_write_data”,完成一个寄存器的写入,最后应答,拉低ce。
“s_read”状态下一个状态进入读地址状态“s_read_addr”,再进入读数据状态“s_read_data”,完成一个寄存器的读取,最后应答,拉低ce。
ds1302_io状态机  
信号名称 方向 说明
clk in 时钟输入
rst in 异步复位输入,高复位
ds1302_ce out ds1302 ce,高有效
ds1302_sclk out ds1302串行时钟
ds1302_io inout ds1302数据
cmd_read in 读寄存器请求,发出请求时准备好地址
cmd_write in 写寄存器请求,发出请求时准备好地址和数据
cmd_read_ack out 读寄存器应答,应答时读取数据有效
cmd_write_ack out 写寄存器应答
read_addr in 读寄存器地址
write_addr in 写寄存器地址
read_data out 读出的数据
write_data in 写寄存器数据
ds1302_io端口
ds1302模块主要完成时间寄存器的读写控制,状态机状态较为简单。
ds1302模块状态机  
信号名称 方向 说明
clk in 时钟输入
rst in 异步复位输入,高复位
ds1302_ce out ds1302 ce,高有效
ds1302_sclk out ds1302串行时钟
ds1302_io inout ds1302数据
write_time_req in ds1302写时间请求,请求发出时,时间数据write_second、write_minute、write_hour、write_date、write_month、write_week、write_year要有效
write_time_ack out 写时间请求应答
write_second in 写时间:秒,bcd码,00-59
write_minute in 写时间:分,bcd码,,00-59
write_hour in 写时间:时,bcd码,,00-23
write_date in 写时间:日,bcd码,,01-31
write_month in 写时间:月,bcd码,,01-12
write_week in 写时间:周,bcd码,,01-07
write_year in 写时间:年,bcd码,,00-99
read_time_req in 读时间请求
read_time_ack out 读时间请求应答
read_second out 读时间:秒,bcd码,00-59
read_minute out 读时间:分,bcd码,,00-59
read_hour out 读时间:时,bcd码,,00-23
read_date out 读时间:日,bcd码,,01-31
read_month out 读时间:月,bcd码,,01-12
read_week out 读时间:周,bcd码,,01-07
read_year out 读时间:年,bcd码,,00-99
ds1302模块端口
ds1302_test模块主要ch状态检测,ch位于秒寄存器的bit7位,上电后首先读取时间,判断秒寄存器的ch状态,如果为高,表示ds1302暂停,状态机进入“s_write_ch”,将ch写0,并将一个初始时间写入,然后循环不断的读取时间寄存器。
ds1302_test状态机
信号名称 方向 说明
clk in 时钟输入
rst in 异步复位输入,高复位
ds1302_ce out ds1302 ce,高有效
ds1302_sclk out ds1302串行时钟
ds1302_io inout ds1302数据
read_second out 时间:秒,bcd码,00-59
read_minute out 时间:分,bcd码,00-59
read_hour out 时间:时,bcd码,00-23
read_date out 时间:日,bcd码,01-31
read_month out 时间:月,bcd码,01-12
read_week out 时间:周,bcd码,01-07
read_year out 时间:年,bcd码,00-99
ds1302_test端口
4. 实验现象 将程序下载到开发板以后,连接uart转串口到pc机
开发板串口连接图  
打开串口调试助手
端口选择按照设备管理器中“silicon labs cp210x usb to uart bridge”设置,波特率选择“115200”,其他值默认。
我们可以看到串口每秒会收到一条数据,显示一个时间。

截止2019年12月份我国Win7用户超过57%
CPU内存或GPU内存进行分组方式实战
RS Components和Allied Electronics荣获卓越全球分销商大奖
iOS11正式版最新消息:iOS11.1Beta2全新emoji来了,全新体验好玩有趣值得拥有
基于功放电源控制器实现公共广播系统的音频功放电路设计
【紫光同创国产FPGA教程】【第二十二章】RTC时间实验
米家定位未来的智能家电品牌 发布智能门锁等四款大家电新品
自己独自在家检查汽车电池的小技巧?
基于LTC4125的闭合无线充电器接收器和发射器之间的控制环路
小米将在明年CES展会上推全新产品
LED虚拟制作的无限可能性:优势与未来展望
人机交互下一波浪潮:触摸的突破
服务机器人如何才能走的更远
中科闻歌布局人工智能与大数据基础平台技术 获得超5亿元E轮融资
对GDB命令脚本做一个粗浅的介绍
半导体设备生产工艺流程科普!
LED陶瓷散热路灯点亮22公里长国道
IBM助力泰威技术的数字化转型之路
组装印制电路板的检测步骤
三星欲靠三星S8翻身!确定在中国首发!