引言:本文通过以DS1302芯片为基础,介绍该芯片与FPGA之间SPI通信原理,详细描述硬件设计原理及FPGA SPI接口驱动设计。
1. DS1302硬件设计原理
1.1 概述
DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它提供秒、分钟、小时、天、日期、月份和年份信息,对于少于31天的月份,月末日期会自动调整,包括闰年的更正。时钟以24小时或12小时的形式运行,带有AM/PM指示器。它通过一个简单的串行SPI接口与微处理器通信,如下图所示。
图1:DS1302管脚定义及典型应用电路
图2显示了DS1302芯片内部的主要组件:电源控制、输入移位寄存器、命令和控制逻辑、振荡器、实时时钟和RAM。
图2:DS1302芯片内部框图
1.2 管脚定义说明:
VCC2:双电源配置中的主电源引脚。VCC1连接到备用电源(通常为纽扣电池),以在没有主电源的情况下保持时间和日期。DS1302从VCC1或VCC2中较大的一个操作。当VCC2大于VCC1+0.2V时,VCC2为DS1302供电。当VCC2小于VCC1时,VCC1为DS1302供电。
X1/X2:连接标准32.768kHz石英晶体,石英晶体负载电容典型值为6pF。DS1302也可以由外部32.768kHz振荡器驱动,在该配置中,X1引脚连接到外部振荡器信号,并且X2引脚悬空。
GND:地信号。
CE:使能信号,输入CE信号必须在读取或写入期间被断言为高电平。该引脚有一个内部40kΩ(典型值)下拉电阻器,用于接地。
I/O:输入/推拉输出。I/O引脚是3线接口的双向数据引脚。该引脚有一个内部40kΩ(典型值)下拉电阻器,用于接地。
SCLK:SCLK用于同步串行接口上的数据通信。该引脚有一个内部40kΩ(典型值)下拉电阻器,用于接地。
VCC1:单电源和电池操作系统中的低功率操作以及低功率电池备份。
1.3 振荡电路
DS1302使用外部32.768kHz晶体,由于芯片内部集成了负载电容,振荡器电路不需要任何外部电阻器或电容器来操作。表1规定了外部晶体的参数要求。
表1:外部晶体的参数要求
1.4 时钟精度
时钟的精度取决于晶体的精度以及振荡器电路的电容性负载与晶体的电容性负荷之间的匹配精度。温度偏移引起的晶体频率漂移将增加额外的误差。耦合到振荡器电路中的外部电路噪声可能导致时钟快速运行。图3显示了用于隔离晶体和振荡器与噪声的典型PC板布局。
图3:隔离噪声的典型PCB板布局
1.5 原理图设计
DS1302与FPGA通过三线SPI接口进行通信,信号连接较为简单,信号对IO接口速率无要求。
图4:DS1302原理图设计
2. FPGA软件设计
2.1 SPI接口读写时序
SPI接口读时序操作如图5所示。读操作分为两个阶段,第一阶段进行写命令操作,即往I/O数据线上写入需要读出的寄存器地址,第二阶段是从I/O数据线上读取当前寄存器数据。
图5:SPI接口读操作时序
(1)使能信号CE为高电平,开启读操作,启动时,SCLK必须为低电平;
(2)在SCLK时钟的上升沿写入命令字节到I/O数据线;
(3)在SCLK时钟的下降沿从I/O数据线读取数据,要注意第一个读取的bit D0是在写命令最后一个bit时钟的下降沿采样的;
(4)使能信号CE为低电平,结束读操作。SPI接口写时序操作如图6所示。写操作分为两个阶段,第一阶段进行写命令操作,即往I/O数据线上写入需要写入的寄存器地址,第二阶段是往I/O数据线上写入当前寄存器数据。
图6:SPI接口写操作时序
(1)使能信号CE为高电平,开启写操作;
(2)在SCLK时钟的上升沿写入命令字节到I/O数据线;
(3)在SCLK时钟的上升沿写入数据字节到I/O数据线;
(4)使能信号CE为低电平,结束写操作。
2.2 寄存器说明
命令字节
DS1302地址/命令字节如下表所示。
(1)bit7(MSB):必须是逻辑1。0:禁用对DS1302的写入;
(2)bit6:0:选择时钟/日历数据,1:选择RAM数据;
(3)bit5~bit1:指定要写或读出的指定寄存器地址;
(4)bit0:0:写操作,1:读操作。
注意:命令字节总是从LSB(位0)开始传输。
时钟和日历寄存器
时间和日历信息是通过读取DS1302的寄存器字节来获得的。表2说明了RTC寄存器。
表2:RTC寄存器
寄存器说明:
(1)时钟和日历初始化:可以通过写入适当的寄存器字节来设置或初始化时间和日历。
(2)时间和日历寄存器数据格式:二进制编码十进制(BCD)格式。
(3)星期几的寄存器在午夜递增。与星期几对应的值是用户定义的,但必须是连续的(即,如果1等于星期日,则2等于星期一,依此类推)。不合理的时间和日期条目会导致未定义的操作。
(4)每当写入秒寄存器时,就会重置倒计时链。写入传输发生在CE的下降沿。为避免滚动问题,一旦重置倒计时链,必须在1秒内写入剩余的时间和日期寄存器。
(5)DS1302可以在12小时或24小时模式下运行。小时寄存器的第7位定义为12小时或24小时模式选择位。当为高时,选择12小时模式。在12小时模式中,第5位为AM/PM位,逻辑高为PM。在24小时模式中第5位是第二个10小时位(20–23小时)。每当12/24位发生变化时,必须重新初始化小时数据。
(6)时钟停止标志:秒寄存器的bit7被定义为时钟停止(CH)标志。1:振荡器停止,DS1302进入低功耗待机模式,电流消耗小于100nA;0:时钟将启动。 (7)WP写保护位:控制寄存器的第7位是写保护位WP。前7位(第0位至第6位)强制为0,读取时始终读取0。在对时钟或RAM进行任何写入操作之前,位7必须为0。当为高时,写保护位防止对任何其他寄存器进行写操作。因此,在尝试写入设备之前,应清除WP位。
2.3 软件设计
软件设计模块划分如下图7所示。
图7:软件设计模块划分框图
软件主要实现功能:
(1)DS1302芯片SPI接口驱动功能;
(2)DS1302芯片寄存器读写控制功能,可以实现时钟初始化设置;
(2)按键消抖功能;
(3)数码管动态显示功能。
各个模块功能:
(1)ds1302_segma.v模块为顶层模块,用于实现模块间互联;(2)spi_driver.v实现DS1302 SPI接口通信功能;
(3)ds1302_ctrl_m.v实现DS1302寄存器读写控制功能,包括将设置值写入芯片和将芯片寄存器值读出控制。
(4)set_init_time.v实现通过按键实现时间初始值设置;(5)Segma.v实现数码管动态显示功能(数码管位有限,只显示时、分、秒);
(6)KeyJitters.v实现按键消抖功能。
3. 软件实测
软件下载至电路板,通过SignaTap II在线逻辑分析仪抓取数据如下图所示。
图8:软件设计模块划分框图
图9:数码管显示实时时钟初始值
图8显示计时初始值正确写入ds1302芯片寄存器,图9数码管显示了正确的时、分、秒初始值。
测试结果详见视频号:FPGA技术实战。