总线复习之SPI

SPI总线协议以ds1302为例讲解

1.1概述。

1.2根据时序图来分析。

1.3再熟读一下DS1302的数据手册和SPI总线协议的使用。

1.4结合ds1302功能实现一定的功能。

1.1概述SPI总线协议

首先 SPI,Serial perripheral Interface,串行外围设备接口,全双工同步串行方式,SPI是四根线  SDO、SDI、SCK、CS。

特点是:我们可以采用硬件SPI或者软件模拟SPI。

1.采用主-从模式(Master-Slave)控制方式,而且时钟是由主机产生的。片选信号是主机用来是否使能从机。也是由主机产生。

2.采用同步方式传输数据,这里要注意 时钟极性(CPOL)和时钟相位(CPHA),这两个特别的属性控制着两个SPI设备间何时进行数据交换以及何时对接受到的数据进行采样,来保证数据是在两个设备之间是同步传输的。

3.数据交换

  SPI设备间的数据传输之所以又被称为数据交换,是因为SPI设备在每一个时钟周期,SPI设备都会发送并接受一个bit大小的数据,相当于该设备有一个bit大小的数据被交换了。也就是说当发送完一个byte的数据时,也会收到一个Byte的数据,

时序图:这里要说一下时钟极性和时钟相位。时钟极性(CPOL)表示的是SPI在空闲时,时钟信号是高电平还是低电平

时钟相位(CPHA):表示SPI设备在SCK管脚在时钟上升沿时触发数据,还是在时钟信号变为下降沿时触发数据采样。

SSPSR: SPI设备内部的移位寄存器(Shift Register),主要是根据SPI时钟信号状态,往SSPBUF里移入或者移出数据,每次移动的数据大小由 Bus-Width 和  Channel Width决定。

1.2&1.3

先来ds1302与主控芯片的硬件连接 

CE---片选         IO---数据线(本来SPI协议需要4根线,但是在读取时间时并不能写,也就是说即使是两根数据线也不能同时使用两条数据线,即就是每次只有一条数据线在使用,那么我们只需要一根数据线就可以了,用读写来区分,这样可以减少一根数据线)             SCK---时钟线  

1.往DS1302中的地址为add的寄存器中写入数据。

// 往ds1302中adder中写入date      传输数据时是低位在前,高位在后  
void Write_date(char add,char date)
{
char i=0;
CE=0;                     //先将片选拉低置低电平
Delay();    
CLK=0;                   //CLK也拉低
Delay();
CE=1;                     // CE然后拉高
for(i=0;i<8;i++)         //上升沿写入数据  
{
IO=add&0x01;
Delay();
add=add>>1;
CLK=1;                   //CLK也拉高
Delay();
CLK=0;                   //CLK也拉低
Delay();
}
//在第九个时钟周期的时候 
for(i=0;i<8;i++)
{
IO=date&0x01;
Delay();
date=date<<1;
SCK=1;
Delay();
SCK=0;
Delay();
}
CE=0; //拉低片选
Delay();
}

 2.往ds1302地址为 add 读出数据

// 从地址为add中读出数据       传输数据时是低位在前,高位在后  
char Write_date(char add)
{
 char i=0;
 char date=0;date1;       //date1是做一个数据中转
 CE=0;                    //先将片选拉低置低电平
 Delay();    
 CLK=0;                   //CLK也拉低
 Delay();
 CE=1;                    // CE然后拉高
 for(i=0;i<8;i++)        //上升沿写入数据  
 {
 IO=add&0x01;
 Delay();
 add=add>>1;
 CLK=1;                     //CLK也拉高
 Delay();
 CLK=0;                     //CLK也拉低
 Delay();
 }
//在第九个时钟周期的时候 
 for(i=0;i<8;i++)
 {
 date1=IO;                  // 这里已经有数据了。
date=(date>>1)|(date1>>7); Delay(); date
=date<<1; SCK=1; Delay(); SCK=0; Delay(); } CE=0; //拉低片选 Delay();
return date;
}

接下来就要熟悉ds1302的控制字了,贴上

1.4:我们实现的一些功能

先往ds1302中写入数据,然后我们每个0.5秒读出数据在数码管上显示,这样就实现了一个实时时钟,

当然再读数据手册时,自己要注意一些DS1302的一些特定的规定,这就要仔细读数据手册了,熟悉每一部分的功能作用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-10-23 20:31  栀子花开fwh  阅读(515)  评论(0编辑  收藏  举报