SPI,是英语Serial Peripheral interface的缩写,就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议.
► SPI串行接口 SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、
LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行
时钟线(SCK)、主机
输入/从机
输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有
中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。
① SDO – 主设备数据输出,从设备数据输入
② SDI – 主设备数据输入,从设备数据输出
③ SCLK – 时钟信号,由主设备产生
④ CS – 从设备使能信号,由主设备控制 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。
接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。
要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同
定义,具体请参考相关器件的文档。
在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。
最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。
► S3C2440的SPI特性 S3C2440A包括2个SPI接口,每个接口分别由两个8位数据移位器用于发送和接收。在SPI发送器件,数据同时发送(串行移出)和接收(串行移入),在某个频率下8位串行数据由相应的控制
寄存器设置决定。
S3C2440的SPI特性如下:
◎ 支持两个通道的SPI;
◎ 兼容SPI协议(2.11
版本);
◎ 8位发送移位寄存器;
◎ 8为接收移位寄存器;
◎ 8位预定标器;
◎ 查询,中断和DMA传输模式;
◎ 容忍5V输入,除nSS。
► S3C2440的SPI寄存器S3C2440
定时器:
● SPI控制寄存器(SPCONn);
● SPI状态寄存器(SPSTAn);
● SPI引脚控制寄存器(SPPINn);
● SPI波特率预标定器寄存器(SPPREn);
● SPI发送/接收数据寄存器(SPTDATn)(SPRDATn)。
SPI寄存器具体说明请查阅S3C2440芯片手册。
► S3C2440的SPI操作 使用SPI接口,S3C2440A可以和外部设备发送/接收8位数据。一个串行时钟线来同步两个用于信息移位和采用的数据线。当SPI是主机时,传输频率通过设定SPPREn寄存器的相应位来控制。你可以修改其频率来调节波特率数据寄存器的值。如果SPI是从属,其他的主机提供时钟。当程序写字节数据到SPTDATn寄存器时,SPI发送/接收操作会同时开始。在这种情况下,在写字节数据到SPTDATn之前,nSS应该被激活。
当程序写字节数据到SPTDATn寄存器,如果ENSCK、SPCONn寄存器的MSTR被置位,SPI开始发送。你可以使用一个典型的编程步骤操作SPI接口,基本步骤如下:
① 时钟波特率与定标器寄存器(SPPREn);
② 设置SPCONn合理配置SPI模块;
③ 写数据0xFF到SPTDATn;
④ 设置一个GPIO引脚,其作为nSS,低电平片选使能;
⑤ 发送数据→检查传输准备标志(REDY=1)的状态,然后写数据到SPTDATn;
⑥ 接收数据→写数据0xFF到SPTDATn→确认REDY置1,然后读取缓存数据;
⑦ 设置一个GPIO引脚,其作为nSS,高电平解除片选。
► S3C2440的SPI初始化 ♥ 配置IO脚为SPI接口 ♥ 开始SPI寄存器的配置 ① SPPRE,设置传送频率,即SPICLK的频率
SPI_CLK=PCLK/2/(SPPRE+1) ② SPCON 寄存器
该寄存器有 7 位,对应的控制包括:SPIMOD(6:5),SCK enable (4),master/slave (3),CPOL(2),CPHA(1),TAGD(0).具体怎么设置根据自己的需要设置就OK。
③ SPPIN 寄存器
就三个寄存器,都设置好后就可以写和接收数据,写之前记得要检查SPSTA的 REDY位是否为 1。
NOTE: 配置好IO之后,发现写SPCON寄存器无效,CLKCON寄存器的SPI位没有激活,所以写寄存器之前记得要检查CLKCON的状态
- void S3C2440_SPI0Init(void)
- {
- //-----------SPI0引脚初始化------------
- rGPECON &= ~(0x3F<<22); //GPE11、GPE12、GPE13
- rGPECON |= (0x2A<<22); //SPIMISO0、SPIMOSI0、SPICLK0
- rGPGCON |= (0x3<<4); //nSS0/GPG2
- rGPEUP |= (0x7<<11);
- rGPGUP |= (1<<2);
- //----------SPI0寄存器初始化-----------
- rSPPRE0 = 25;
- rSPCON0 = 0x1C; // 设置SPI接口模式,MSTR=1,主模式,CPOL=1,CPHA=0
- }