• DS1302时钟芯片(SPI协议)


    DS1302时钟芯片

    DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能

    可以把该芯片看成一个小型的单片机,其内部的寄存器不能控制,通过协议与51进行通信

    RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片

    引脚名作用引脚名作用
    VCC2主电源CE芯片使能
    VCC1备用电源IO数据输入、输出
    GND电源地SCLK串行时钟
    X1、X232.768kHz晶振

    在哪 写入 写入什么 -> 单片机

    在哪 读取 读取什么 -> 时钟芯片

    在这里插入图片描述

    寄存器地址\定义

    在这里插入图片描述

    该寄存器显示了时钟的地址信息,操作时往对应的地址写入值就行,也就是说如果想写入秒,往对应的寄存器写入0x80;表示小时的地址的第7位可选为12小时制还是24小时制,WP是写保护位

    时钟暂停标志(CH):
    秒寄存器的位7被定义为时钟暂停标志,当此位置1时,时钟振荡器暂停,DS1302进入漏电流小于100nA的低功耗备用模式;当此为置0时时钟开始,初始加电状态未定义

    写保护位(WP):
    控制寄存器的位7是写保护位,前7位(位0至位6被强制为0且读取时总是读0,在任何对时钟或RAM的写操作以前,位7必须为0;当为高时,写保护位禁止任何寄存器的写操作,初始加电状态未定义;因此,在试图写器件之前应该清除WP位.

    命令字

    在这里插入图片描述

    该图显示的是命令字,命令字启动每一次数据传输时需要配置,第7位固定为1,如果是0则禁止对DS1302的写入,第6位写1则是读取或写入RAM区,写0则读取或写入时钟,第1~5位是地址,即要操作的地址,秒的地址是从0开始;第0位置1是read,对地址进行读取,置0是write,对地址进行写入

    例如要读取月信息,则往命令字寄存器写0x89,如要写入月信息,则往命令字寄存器写0x88,对应了RTC左边的地址

    SPI总线概念

    SPI接口的全称是“Serial Peripheral Interface”,意为串行外围接口

    SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

    SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。

    SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,其接口包括以下四种信号:

    1. MOSI – 主器件数据输出,从器件数据输入
    2. MISO – 主器件数据输入,从器件数据输出
    3. SCLK – 时钟信号,由主器件产生
    4. /CS – 从器件使能信号,由主器件控制

    时序定义

    要点:在时钟的上升沿,单片机往时钟芯片写入数据;在时钟的下降沿,时钟芯片往单片机输出数据

    在时序图中,只有红色方框框住的是时钟芯片控制的,其余绿色圆形圈住的都是单片机控制

    在这里插入图片描述

    详细解释:

    以写入操作为例:

    单片机首先要将CE置高电平,IO口的第一位是命令字的最低位,就是规定本次操作是读还是写,然后SCLK给个上升沿,第一位就被发送出去了,SCLK变回低电平,接着就是下一位A0,同样是上升沿就发送出去,待第一个字节(8位)全部发送出去后,此时便确定了要操作的地址以及操作的模式,是读还是写;

    第二个字节便是数据,低地址在前,同样上升沿发送,发送完后,将CE置为低电平,整个写入时序完成

    BCD码

    BCD码(Binary Coded Decimal‎),用4位二进制数来表示1位十进制数

    例:0001 0011表示13,1000 0101表示85,0001 1010不合法

    在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法

    BCD码转十进制:DEC=BCD/16 * 10+BCD%16; (2位BCD)
    十进制转BCD码:BCD=DEC/10 * 16+DEC%10; (2位BCD)

    因为时钟芯片内存放的是BCD码,所以直接读取出来的话会不准确,要转为十进制来显示

    可调时钟学习要点

    while(1)
    {
        key = key_down();
        if(key == 1)	//key1按下,进行模式选择
        {	//主要是Mode模式的选择,初始值为0,当key1按下时置1,再一次按下时再置0,便可实现一个按键无论按多少次都是两个状态
            if(Mode == 0){Mode = 1; TimeSetSelect = 0;}	
            else if(Mode == 1){Mode = 0;DS1302_SetTime();}
        }
        switch(Mode)
        {	//对模式进行判断,如果是0则执行TimeShow函数,如果是1则执行TimeSet函数,这样便可一个按键跳到不同的函数中实现不同的功			能
            case 0:TimeShow();break;
            case 1:TimeSet();break;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    二分法-数据类型定义导致的内存超限
    centos7 firewalld ip转发设置、安装docker-compose出现错误、docker-compose部署Yapi
    趣解设计模式之《庞大的组织架构带来的烦恼》
    如何准备2024年的系统设计面试?
    Spring 加强版 ORM 框架 spring-data-jpa 入门与实践
    李沐动手学习深度学习——4.4练习
    Kafka入门到精通-阶段三(调优简介)
    730. 机器人跳跃问题--二分
    Python+大数据-hadoop(七)-Apache Hive SQL DQL、参数配置与函数
    红杉官网已删长文:伴随SBF一路走来的救世主情结(上)
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/125347185