alinx001 发表于 2021-3-4 13:19:06

【紫光同创国产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部分的原理图如下图所示:
https://pic3.zhimg.com/80/v2-99b1dd604597e17bb716aa2f9d9dca2e_720w.jpg开发板RTC2.2 DS1302时序和控制1)写数据时序DS1302芯片写操作的时序图。第一个字节是“访问寄存器的地址”,第二字节是“写数据”。在写操作的时候,都是“上升沿有效”,然而还有一个条件,就是CE(/RST)信号必须拉高。(数据都是从LSB开始发送,亦即是最低位开始至最高位结束)。https://pic2.zhimg.com/80/v2-754c996bf07694e97d87aef4b804b355_720w.jpgDS1302写时序2)读数据时序基本上和写操作的时序图大同小异,区别的地方就是在第二个字节是“读数据”的动作。第二字节读数据开始时,SCLK信号都是下降沿送出数据,这个时候可以使用上升沿读取数据。CE(/RST)信号同样是必须拉高。(第一节数据是从LSB开始输出,第二节数据是从LSB开始读入)。https://pic1.zhimg.com/80/v2-0cc85466f96c1e84f96f59934c4cf398_720w.jpg3)命令格式和寄存器无论是读操作还是写操作,在时序图中,第一个字节都是“访问寄存器的地址”,然而这一字节数据有自己的格式。https://pic4.zhimg.com/80/v2-a53525ac2b8263ac7575159be214a89b_720w.jpgBIT 7 固定。 BIT 6 表示是访问寄存器本身,还是访问RAM空间。 BIT 5 到BIT1 表示是寄存器或RAM空间的地址。 BIT 0 表示是访问寄存器本身是写操作,还是读操作。下图是DS1302的寄存器地址和数据格式https://pic1.zhimg.com/80/v2-108e566f9696ac1e0488b286530e591c_720w.jpg3. 程序设计通过分析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。https://pic2.zhimg.com/80/v2-fb1ab92eca57fc59946e8be2ca82695d_720w.jpgds1302_io状态机
信号名称方向说明
clkin时钟输入
rstin异步复位输入,高复位
ds1302_ceoutDS1302 CE,高有效
ds1302_sclkoutDS1302串行时钟
ds1302_ioinoutDS1302数据
cmd_readin读寄存器请求,发出请求时准备好地址
cmd_writein写寄存器请求,发出请求时准备好地址和数据
cmd_read_ackout读寄存器应答,应答时读取数据有效
cmd_write_ackout写寄存器应答
read_addrin读寄存器地址
write_addrin写寄存器地址
read_dataout读出的数据
write_datain写寄存器数据
ds1302_io端口ds1302模块主要完成时间寄存器的读写控制,状态机状态较为简单。https://pic2.zhimg.com/80/v2-fe7b5f7a936e52e4437c45b51bdf7c45_720w.jpgds1302模块状态机
信号名称方向说明
clkin时钟输入
rstin异步复位输入,高复位
ds1302_ceoutDS1302 CE,高有效
ds1302_sclkoutDS1302串行时钟
ds1302_ioinoutDS1302数据
write_time_reqinds1302写时间请求,请求发出时,时间数据write_second、write_minute、write_hour、write_date、write_month、write_week、write_year要有效
write_time_ackout写时间请求应答
write_secondin写时间:秒,BCD码,00-59
write_minutein写时间:分,BCD码,,00-59
write_hourin写时间:时,BCD码,,00-23
write_datein写时间:日,BCD码,,01-31
write_monthin写时间:月,BCD码,,01-12
write_weekin写时间:周,BCD码,,01-07
write_yearin写时间:年,BCD码,,00-99
read_time_reqin读时间请求
read_time_ackout读时间请求应答
read_secondout读时间:秒,BCD码,00-59
read_minuteout读时间:分,BCD码,,00-59
read_hourout读时间:时,BCD码,,00-23
read_dateout读时间:日,BCD码,,01-31
read_monthout读时间:月,BCD码,,01-12
read_weekout读时间:周,BCD码,,01-07
read_yearout读时间:年,BCD码,,00-99
ds1302模块端口ds1302_test模块主要CH状态检测,CH位于秒寄存器的BIT7位,上电后首先读取时间,判断秒寄存器的CH状态,如果为高,表示DS1302暂停,状态机进入“S_WRITE_CH”,将CH写0,并将一个初始时间写入,然后循环不断的读取时间寄存器。https://pic2.zhimg.com/80/v2-6cf29d0c1917acc231b8004a2e6aecc1_720w.jpgds1302_test状态机
信号名称方向说明
clkin时钟输入
rstin异步复位输入,高复位
ds1302_ceoutDS1302 CE,高有效
ds1302_sclkoutDS1302串行时钟
ds1302_ioinoutDS1302数据
read_secondout时间:秒,BCD码,00-59
read_minuteout时间:分,BCD码,00-59
read_hourout时间:时,BCD码,00-23
read_dateout时间:日,BCD码,01-31
read_monthout时间:月,BCD码,01-12
read_weekout时间:周,BCD码,01-07
read_yearout时间:年,BCD码,00-99
ds1302_test端口4. 实验现象将程序下载到开发板以后,连接uart转串口到PC机https://pic2.zhimg.com/80/v2-2c627dd4d7014636e9d16b0ddf55a5b1_720w.jpg开发板串口连接图打开串口调试助手https://pic1.zhimg.com/80/v2-3a56ddc9e6301c25c1bb072198eb7110_720w.jpg端口选择按照设备管理器中“Silicon Labs CP210x USB to UART Bridge”设置,波特率选择“115200”,其他值默认。https://pic4.zhimg.com/80/v2-5f6f309323c8e19ead0ae23e61ffa103_720w.jpg我们可以看到串口每秒会收到一条数据,显示一个时间。
页: [1]
查看完整版本: 【紫光同创国产FPGA教程】【第二十二章】RTC时间实验