DS1302时钟芯片在90c51上的使用

本文详细介绍了SPI协议及其在DS1302实时时钟芯片中的应用。探讨了SPI的基本原理、特点及DS1302的具体读写操作流程。

首先说DS1302使用的SPI三线协议

来自:https://my.oschina.net/freeblues/blog/67400

SPI协议概括

  SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.

  SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

  • SDO     – 主设备数据输出,从设备数据输入
  • SDI      – 主设备数据输入,从设备数据输出
  • SCLK   – 时钟信号,由主设备产生
  • CS        – 从设备使能信号,由主设备控制

  CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

  SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

  要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。


在90c51上的原理图:


DS1302原理

来自:http://www.cnblogs.com/aademeng/articles/2966701.html

DS1302通过3根线与MCU连接串行数据发送,接收时钟信号由MCU发送,可外接备用电池以便主电源断电后不丢失数据,并可编程对备用电源充电。对DS1302的操作一般只有两种:读数据和写数据。读数据即读出芯片RAM中的日期,时间等信息,写数据即修改这些信息。数据的读写是以字节为单位操作的,读操作函数要完成的功能便是传入一个一字节表示特定的地址,函数返回该地址RAM中一字节或多字节的数据。写操作函数需要传入两个参数:地址和要写的数据;函数将要写的一字节数据写入给定的地址。对于同一个内容,读和写通过地址中一个标志位来区分,因此表现出来就是读和写的地址不一样,这样芯片通过地址来区分你是要还是要写;例如读秒的地址是0x81,而写秒的地址是0x80;

因此我们首先就要写读数据和写数据的两个函数:
首先要分析读操作的时序:





CE,SCLK,I/O是单片机与DS1302连接的三条线,要进行读操作,首先把CE和SCLK置0,准备读数据。
CE是使能信号,只有他为高才能进行操作。读数据操作实际上是先写后读的操 作,因为要先写入地址,然后读该地址的数据。图中带箭头的脉冲跳变表示起作用的脉冲跳变,因此读数据时上升沿有效,即SCLK从0变1的瞬间,I/O线上 的数据就会被写入DS1302。而读出是下降沿有效,即DS1302会在每个下降沿的时候修改数据线上的数据,因此,从此刻到下一个下降沿的这段时间 内,MCU读数据线上的数据都是正确的。要注意MCU写完一个字节后第一个下降沿DS1302就开始送出数据了读写都是从低位到高位。

程序

/********读DS1302,1字节**********/  
uchar DS1302Read(uchar add)  
{   uchar a, d=0;  
    TCE = 0;  
    TCLK = 0;  
    TCE=1;  
    for(a=0; a<8; a++)   //发送控制字节  
    {  
        TCLK=0;  
        TIO= add & 0x01;  
        TCLK=1;//制造上升沿  
        add>>=1;  
    }  
    for(a=0; a<8; a++)   //读1字节数据  
    {  
        TCLK=1;  
        d >>= 1;//右移1位  
        TCLK=0;//制造下降沿  
        if(TIO) {//如果读到1  
            d |= 0x80;//把最高位置1  
        }  
    }  
    TCE=0;              //拉低TCE  
    //return dec(d);        //读取的数据转换成十进制  
  return d;  
} 
写数据简单,一次性把两个字节全部写进去就行了:


/*******向DS1302写入一字节数据*********/  
void DS1302Write(uchar add,uchar d)  
{  
    uchar a;  
    //d = hex(d);   //转换为BCD码  
    TCE=0;      //拉低TCE引脚,终止数据传输  
    TCLK=0;     //拉低TCLK引脚,清零时钟线  
    TCE=1;      //拉高TCE引脚,所有数据传输都要拉高TCE脚,启动控制逻辑  
    //先写入控制字节  
    for(a=0; a<8; a++)  
    {  
        TIO= add & 0x01;    //TIO引脚准备好要写入的1位数据  
        TCLK=1;             //TCLK上升沿,1位数据从TIO脚写入,低位先写入  
        add>>=1;          //数据右移1位  
        TCLK=0;             //拉低TCLK,为下次写入准备,循环8次写入1字节  
    }  
    //再写入数据字节  
    for(a=0; a<8; a++)  
    {  
        TIO= d & 0x01;  
        TCLK=1;  
        d>>=1;  
        TCLK=0;  
    }  
    TCE=0;      //数据传输完拉低TCE  
}  

有了读数据和写数据功能,就成功了一半了,接下来就是要搞懂每个地址所对应数据的结构和含义:

首先是与时间有关的,一般也就操作这些寄存器就可以读写时间。


 前两栏是地址,后面是各位所代表的含义:例如秒寄存器的最后一位bit7叫CH表示暂停时钟的,比如说用代码:

C代码  
write1302(0x80,0x80) //写1000 0000


这样就把地址为0x80寄存器的CH位置为1,其他位为0,这样的操作就使时钟暂停了,并且秒也置为0;
但是单这样操作是不能修改数据的,DS1302只有地址为0x8e的WP即写保护开关可以随意修改,其他数据要在写保护开关关闭时才能写,如:
C代码  
write1302(0x8e,0x00)//关闭写保护   
write1302(0x80,0x01)//秒置为1  
write1302(0x8e,0x80)//打开写保护  

 另外使用寄存器0xbf/0xbe可以批量读写数据

也不知道现在学的这些将来会不会有用,也不知道我到底够不够努力


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值