DS1302时钟模块通信原理(SPI总线)

学过SPI总线后,不难发现SPI总线通信时序与DS1302通信时序有相似之处。

关于SPI总线的内容请参考:https://blog.csdn.net/cax1165/article/details/87001618

然而DS1302模块却仅有三根线,事实上,DS1302的通信是SPI的变异种类,它采用了SPI的通信时序,但是通信的时候没有完全按照SPI的规则来,下面我们将逐步分析DS1302的变异SPI通信方式

首先来看DS1302单字节写入操作(图一):

2.JPG

然后我们再对比一下CPOL=0并且CPHA=0的情况下的SPI的操作时序(图二):

3.JPG

在两者的通信时序中,使能信号是相反的。对于通信写数据,都是在SCK的上升沿,从机进行采样,下降沿的时候,主机发送数据(为什么从机是在上升沿采样,请看下文注释1)。DS1302的时序里,单片机要预先写一个字节指令,指明要写入的寄存器的地址以及后续的操作是写操作,然后再写入一个字节的数据。

注释1:DS1302时序图时钟信号上的箭头是针对DS1302而言的,即:时钟模块在箭头进行数据采样或数据输出。同样,在非箭头处,主机(单片机)进行数据采样或数据输出。而上图时序图为写数据,即时钟模块接收数据,因此时钟模块在箭头处进行的是数据采样工作(接收单片机输出的数据)。单片机向外发送数据,因此主机在下降沿进行的是数据输出工作。

对于DS1302的单字节读操作,时序图如下:

4.JPG

需要注意的是:

一、DS1302的单字节读操作分为两步,第一步主机向从机写入地址(与上文中单字节写操作的时序图相同),第二步DS1302才开始向主机发送数据。观察第二步时序图中时钟信号上面的箭头可以发现,DS1302在下降沿向外传输数据(根据上文中对于箭头的解释,此时正在进行读操作,即DS1302向单片机发送数据,所以时钟模块此时进行的是数据传输工作)。那么在没有箭头的上升沿,单片机进行的则是数据采样工作。

二、我们的单片机没有标准的SPI接口,和I2C一样需要用IO口来模拟通信过程。在读DS1302的时候,理论上SPI是上升沿读取,但是我们的程序是用IO口模拟的,所以数据的读取和时钟沿的变化不可能同时了,必然就有一个先后顺序。通过实验发现,如果先读取IO线上的数据,再拉高SCLK产生上升沿,那么读到的数据一定是正确的,而颠倒顺序后数据就有可能出错。这个问题产生的原因还是在于DS1302的通信协议与标准SPI协议存在的差异造成的,如果是标准SPI的数据线,数据会一直保持到下一个周期的下降沿才会变化,所以读取数据和上升沿的先后顺序就无所谓了;但DS1302的IO线会在时钟上升沿后被DS1302释放,也就是撤销强推挽输出变为弱下拉状态,而此时在51单片机引脚内部上拉的作用下,IO线上的实际电平会慢慢上升,从而导致在上升沿产生后再读取IO数据的话就可能出错。因此这里的程序我们按照先读取IO数据,再拉高SCLK产生上升沿的顺序。

最后需要注意的是:只有在SCLK为低电平时,才能将CE置为高电平。因为SCLK连接的是单片机IO口,默认情况下为高电平。若CE置为高电平(置为高电平后DS1302开始工作)后将SCLK拉低,这相当于在时钟模块开始工作后,SCLK来了一个下降沿,这与时序图是不符合的。

你可能感兴趣的:(51单片机,进阶之路——单片机的学习)