SPI基本原理
spi 它是一种最常用的同步串行接口:同步的意思就是利用时钟线对串行数据进行同步在时钟的上升沿或下降沿极性锁存数据.所以它的线至少有时钟线和数据线.
一、同步串行口
利用时钟线对串行数据进行同步
上升沿或者下降沿锁存数据
二、4线SPI:全双工(它的两根数据线一个是收一个是发收发是可以同时进行的,还有2根 SS SCLK SS是用来帧同步的控制线,时钟是SCLK 上升合下降)
SS 、SCLK、MOSI、MISO
三、3线SPI:半双工(半双工,收和发 用同一根 DIO )
SS、SCLK、DIO
四、SPI时序图
五、按照时序图编写IO程序
一、上升沿:
PORTB &= ~(1<<5);
asm("NOP");
PORTB |= (1<<5);
二、下降沿:
PORTB |=(1<<5);
asm("NOP");
PORTB &= ~(1<<5);
下图是DS1302的时序图
从上图可以看到它是属于3线的SPI接口
读操作:
单字节读的时序
在CE它是一个帧同步在空闲的时候它是拉低的,它把CE拉高标示这一帧就要开始,然后在每一个SCLK的上升沿(S估计就是串行的意思CLK时钟)我们看到每个上升沿上标了一个小箭头然后在每个I/O 数据线上,记住前8位叫做输入地址的这样的数据,可以看到在每个时钟的上升沿讲每个数据写入这个DS1302,在这个后8位这个DS1302的I/O口就要有输入状态转变为输出可以看到变成下降沿上了,所以在读数据的时候是在SCLK的下降沿上进行输出的。
然后单片机就可以用I/O将这8位数据一位一位的读回来,一帧2个字节16位结束之后呢?CE这根线就要拉低,表示这一帧结束了
写操作:
这是一个单字节写的时序
它与单字节读非常类似的也是CE 这根线的拉高与拉低表示这一帧数据的开始和结束所不同的是这16位数据都是要输入到DS1302里面去的也就是DS1302这个I/O一直是处于输入状态这个数据呢每个数据都是在每个数据的上升沿之中锁入到DS1302之中、
这个是DS1302的时序图,下面看看ATmega16的SPI接口的时序图
可以看出他有4种模式 上升 下降 有两种 共4种
等后面操作详细讲说时序。
解释:相对于串行数据,SCK的相位合极性有4种组合。CPHA和CPOL控制组合的方式。SPI数据传输格式见Figture 67与Figure 68,每一位数据的移出和移入发生于SCK不同的信号跳变沿,以保证有足够的时间使数据稳定。这个过程在Table 56 和Table 57 有清楚的说明:sample(采样)rising(上升) setup(设置)falling(下降) 呵呵英语不好。
Figure 67 是CPHA =0 时候的传输格式
Figure 68 是CPHA =1 时候的传输格式
ATmega 16 支持以上四种全部的模式 有的是上升沿锁存有的是下降沿锁存这四种模式,这四种模式我们一会在说到ATmega 16 的SPI接口的时候会详细给你们菜鸟说:
好了再看了SPI的时序图之后要怎样按照时序对它编程呢?
在基本的逻辑里面同步都是靠时钟的上升沿来进行同步,也就是说我们需要掌握这个I/O口让他产生一个时钟,它上升沿或者下降沿的方法,上升沿就是低跳变到高,我们以PORTB 它的第五位作为输出口为例来进行讲解,产生上升沿首先它原先必须要是低输出一个低电平0 PORTB =~(1<<5) 拉低 然后一个延迟延迟也可以去掉要看接受方的SPI接受速度是怎么样的了,不过一般的器件它的SPI速率都是非常高的,我们没有必要考虑单片机是否过快对它有所影响因此这个asm("NOP");这条语句可以去掉不过这个是什么意思呢?asm 在C语言中插入一条汇编指令,NOP呢?NOP是汇编语言中的一条空指令表示的是CPU在接下来的一个CPU时钟里面它是什么都不干,干等着这么一个CPU时钟周期,所以就实现一个非常小的延时。然后呢再将PORTB |=(1<<5) 它的第五位拉高,这样就产生一个上升沿,同理下下降沿也是一样的。接下来咱么讲一下DS1302的时序图吧。
DS1302的接口时序图与AVR的接线图
时序图
见DS1302的官方技术文档
与AVR之间的接线图
3线SPI与4线SPI的互联
这个时序图上面已经说过了,那么这个DS1302属于3线的SPI 而ATmega 16 是4线的SPI接口那么3线合4线之间怎样进行互联呢?我们看以采用下面的这种方法。
来看下电路图
上图的PB5 PB6 PB7是单片机的三个I/O口。 可以看他它的第二功能是SPI功能
PB5可以看到MOSI M是主 S 是从 意思就是主机输出 从机输入
同理PB6 MISO 是主机输入从机输出也就是AVR的SPI正常工作的时候PB6这个引脚它应该是处于一个输入的状态PB5应该是一个输出的状态。我们就将PB5 与PB6之间串上一个10K的电阻然后再将PB6直接接到I/O上,下面我们可以简单的分析一下原理图是怎样正常工作的,首先这个DS1302对它处于写的状态的时候呢,DS1302的I/O口是处于输入的,而PB6呢也是一个输入口始终是一个输入口。