Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155173
  • 博文数量: 72
  • 博客积分: 3680
  • 博客等级: 中校
  • 技术积分: 1051
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-22 13:51
文章分类
文章存档

2010年(72)

我的朋友
SPI

分类: 嵌入式

2010-10-18 09:26:29

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的状态
  1. void  S3C2440_SPI0Init(void)
  2. {  
  3. //-----------SPI0引脚初始化------------
  4. rGPECON &= ~(0x3F<<22);                        //GPE11、GPE12、GPE13
  5. rGPECON |= (0x2A<<22);                        //SPIMISO0、SPIMOSI0、SPICLK0
  6. rGPGCON |= (0x3<<4);                                //nSS0/GPG2

  7. rGPEUP |= (0x7<<11);
  8. rGPGUP |= (1<<2);
  9. //----------SPI0寄存器初始化-----------  
  10. rSPPRE0 = 25;
  11. rSPCON0 = 0x1C;        // 设置SPI接口模式,MSTR=1,主模式,CPOL=1,CPHA=0
  12. }
阅读(1300) | 评论(0) | 转发(0) |
0

上一篇:实时时钟

下一篇:Mini2440学习

给主人留下些什么吧!~~