第10章 SPI串行总线
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
典型代码:写(发送)一个字节
/*上升沿锁存数据,先发高位,再发低位*/ void SPI_MOSI_Byte(uchar wdata){ uchar i; SCK=0; //时钟预置为低 for(i=0; i<8; i++){ if(wdata&0x80) MOSI = 1; else MOSI = 0; SCK=1; //产生一个上升沿,在其前准备好待发数据 wdata = wdata<<1; SCK=0; } }
采用SPI总线的器件
25AA系列芯片有一个8位的指令寄存器,通过SPI总 线访问,CPU通过向指令寄存器写不同的指令,告知25 芯片将要进行的操作。如下表:
指令名称 指令码 描述
READ WRITE
WRDI WREN RDSR WRSR
00000011 (0x03) 00000010 (0x02)
25AA系列芯片引脚说明
VSS:电源地 VCC:正电源(可操作电压1.8V-5.5V) CS: 片选输入,低电平有效。(四线SPБайду номын сангаас通信的RST引脚) SI: 串行输入数据引脚。(四线SPI通信的MISO引脚) SO:串行输出数据引脚。(四线SPI通信的MOSI引脚) WP: 写保护,低电平时不可存取,平时不保护数据需要接到高电平 SCK:串行时钟引脚。四线SPI的时钟线,一般来说25AA系列器件属于SPI 从设备,该时钟由主设备提供,因此这里SCK为输入信号 HOLD:操作暂停保持信号。低电平时暂停当前的存取,但没有停止,当恢 复为高电平后继续当前操作,在暂停保持阶段输入的数据将被忽略
脉冲序号 主机缓存 从机缓存 0 1上升沿 1下降沿 2上升沿 2下降沿 3上升沿 3下降沿 4上升沿 4下降沿 5上升沿 5下降沿 6上升沿 6下降沿 7上升沿 7下降沿 8上升沿 8下降沿 10101010 01010101 0101010x 1010101x 01010100 10101011 1010100x 0101011x 10101001 01010110 0101001x 1010110x 01010010 10101101 1010010x 0101101x 10100101 01011010 0100101x 1011010x 01001010 10110101 1001010x 0110101x 10010101 01101010 0010101x 1101010x 00101010 11010101 0101010x 1010101x 01010101 10101010 MI 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 MO 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
10.3 采用SPI总线的器件
Microchip公司的25XX系列的串行E2PROM采用了 SPI总线。典型产品: 25AA010:128 Bytes(128×8位) 25AA020:256 Bytes(256 ×8位) 25AA040:512 Bytes(512×8位) 25AA080:1K Bytes(1K ×8位 ) 25AA160:2K Bytes 25AA320:4K Bytes 25AA640:8K Bytes 25AA256:32K Bytes 25AA512:64K Bytes 25AA1024:128K Bytes
通过发出片选信号CS来控制对哪个从片进行通信,当某个从片的
CS信号有效时,能通过SI接收指令、数据,并通过SO发回数据。 而未被选中的从片的SO端处于高阻状态。
主片在访问某一从片时,必须使该从片的片选信号有效; 主片在SCK信号的同步下,通过SI线发出指令、地址信息; 如需将数据输出,则接着写指令,由SCK同步在SI线上升 沿发出数据; 如需读回数据,则接着读指令,由主片发出SCK,从片根 据SCK的节拍通过SO发回数据。 因而对具有SPI接口的从片器件来讲,SCK、SI是输入信 号,SO是输出信号。 SCK用于主片和从片通信的同步。 SI用于将信息传输到器件,输入的信息包括指令、地址和 数据,指令、地址和数据的变化在SCK的低电平期间进行, 并由SCK信号的上升沿升沿锁存。 SO 用于将信息从器件传出,传出的信息包括状态和数据, 信息在SCK信号的下降沿移出。
读时序
1) 将CS拉低; 2) 通过SI传送8位指令到25xx的指令寄存器(读指令:00000011) 3) 紧接着马上传送16位地址。 4) 通过DO引脚读取内容,该8位内容就是刚才发送的地址对应的单元的内容。 5) 如果CS不拉高,持续提供CLK时钟,则内部地址指针将增加1,指向下一 个数据单元,可以继续读取下一个单元的内容。如果一直这样往下读,这样 的读取将会持续,当达到最大的存储单元地址7FFFH时,地址指针重新指回 0000H,如此往复以至无穷的循环往下读。 6) 当CS拉为高电平后,读取操作终止,而且这个终止可以在任何时段。
小结
根据SPI总线的特点可知:在点对点的通 信中,SPI接口不需要进行寻址操作,且 为全双工通信;在多个从设备的系统中 ,每个从机需要独立的使能信号,硬件 上比I2C系统要稍微复杂一些,可连接的 n 从机最大数量为2 个(n为单片机一端用于 片选使能的引脚数)。 SPI接口的一个缺点:没有指定的流控制 ,没有应答机制确认是否接收到数据。
典型代码:读(接收)一个字节
/*下降沿读取数据,先读高位,再读低位*/ uchar SPI_MISO_Byte( ){ uchar i, rdata=0; SCK=1; //时钟预置为高 for(i=0; i<8; i++){ rdata = rdata<<1; SCK=0; //产生一个下降沿,数据将被锁存在SO端线上 rdata = rdata | MISO; NOP4( ); SCK=1; } return rdata; }
第10章 SPI串行总线
概述 传输时序 SPI总线的应用
10.1 概述
SPI(Serial Peripheral Interface, 串行外设接口)总线是
Motorola公司推出的一种同步串行接口技术。SPI总线系
统是一种同步串行外设接口,允许MCU与各种外围设备以 串行方式进行通信。外围设备包括FLASHRAM、A/D转换 器、网络控制器、MCU等。SPI是一种高速、全双工、同 步的通信总线,在芯片的管脚上升沿占用四根线。其工作
SCK
SCK
CS
Master
CS
Slave
10.2 SPI总线的数据传输
SPI是一个环形总线结构,其时序是在SCK的控制下, 两个双向移位寄存器进行数据交换。SCK提供时钟脉 冲,SDI、SDO基于此脉冲完成数据传输。数据输出通 过SDO线,数据在时钟上沿或下沿时改变,在紧接着 的下沿或上升沿沿被读取,完成一位数据传输。输入 原理相同。这样,在至少8次时钟信号的改变(上沿和 下沿计为1次),就可以完成8位数据的传输。
00000100 (0x04) 00000110 (0x06) 00000101 (0x05) 00000001 (0x01)
“读”数据指令 “写”数据指令
禁止“写”操作 使能“写”操作 读状态寄存器 写状态寄存器
总线读写时序
(1)在CLK上升沿SI采样数据。对于CPU写入25xx来说, 应该在CLK时钟的上升沿之前准备好待写数据,CLK上 升沿产生后,25xx将对SI端线采样。 (2)在CLK下降沿SO输出数据。在读取数据周期内,在 CLK时钟的下降沿将数据送出到SO引脚锁存。对于CPU 从25xx读数据,应该在CLK时钟下降沿产生之后马上读 取SO端口数据。 (3)串行数据发送顺序:先发送高字节,再发送低字节。 (4)在对25xx的访问过程中CS必须保持低电平。HOLD保 持高电平。如果不用存取等待,在设计电路时把HOLD 引脚接高电平。 (5)当CS引脚由高电平变为低电平之后的第一个上升沿结 束后,25xx就会马上对SI引脚采样。先发送的第一帧都 是指令码。
SPI总线接口的结构
MO SI
串行接收缓冲器 (SPI RXB)
串行接收缓冲器 (SPI RXB)
MI SO
8-bit Shift Register
串行发送缓冲器 (SPI TXB) SPI缓冲器 (SPI BUF)
8-bit Shift Register 串行发送缓冲器 (SPI TXB) SPI缓冲器 (SPI BUF)
时钟脉冲与数据变化的关系
假设主机和从机初始化就 绪,并且主机的sbuff=0xaa, 从机的sbuff=0x55,下面是SPI 的8个时钟周期里的数据的变化 情况:(下表中“上升沿”表示 上升沿,“下”表示下降沿) SDI、SDO是相对于主机 而言的。一个完整的传送周期 是16位(2字节),主机首先发送 命令,然后从机根据主机的命 令进行准备,主机在下一个8位 时钟周期写出或读入数据。
模式为主/从模式,主设备与从设备间采用同步通信的方式
来完成数据交换。SPI总线接口占用的端口较少,一般来 说要求主设备要有SPI控制器(也可用软件模拟的方式实 现),就可以与基于SPI的芯片通信。
10.1 概述
SPI总线的基本信号线为3根传输线,即SI、SO、SCK。传输的 速率由时钟信号SCK决定,SI为数据输入、SO为数据输出。采用 SPI总线的系统如下图所示,它包含了一个主片和多个从片,主片
写时序
在任何对25xx器件“写”操作之前,都必须先设置“写操作”使 能寄存器,只有当写操作寄存器设置为“可写”时,才能对器件进行 数据写入。使能“写操作”的指令为00000110(0x06)
典型代码:读出连续个字节
/*读出的字节存放数组d[ ]中,从目标器件的地址Addr开始读,字节 个数为Len*/ void RdFrmRom(uchar d[ ], uint Addr, uchar Len){ uchar i; uchar addr_H, addr_L; addr_H = Addr>>8; addr_L = Addr&0x00FF; RST=0; SPI_MOSI_Byte(0x03); //读操作指令 SPI_MOSI_Byte(addr_H); //16位地址高 SPI_MOSI_Byte(addr_L); //16位地址低 for(i=0; i<Len; i++) rdata[i] = SPI_MISO_Byte( ); RST=1; }
不带SPI接口的单片机编程方法
对于不带SPI接口的MCS51系列单片机来说,可用软件模拟 SPI操作,用三个普通I/O口模拟SPI器件的SCK、MISO、 MOSI。对于不同的外围芯片,它们的时钟时序是不同的。 对于在SCK的上升沿接收数据/下降沿发送数据的从机器件 ,一般应将MCU的串行时钟输出口SCK的初始状态设为1,而 在从机使能端有效(CS=0)后再置为0。这样,MCU在输出1位 SCK时钟(出现的是下降沿)的同时,将使从机SPI接口的移位 寄存器串行左移,从而输出1位数据至MISO线。此后再置 SCK为1,使MCU从MOSI线输出1位数据(最高位)至从机 的SPI接口的移位寄存器。至此,模拟1位数据输入输出便宣 告完成。此后再置SCK为0,模拟下1位数据的输入输出…… 循环8次,即可完成1字节数据的传输。 对于在SCK的下降沿接收数据/上升沿发送数据的从机器件 ,则应取SCK的初始状态为0,即在从机使能端有效(CS=0)后 ,先置SCK为1,以便从机输出1位数据(MCU接收1位数据) ,之后再置时钟为0,使从机接收1位数据(MCU发送1位数据 ),从而完成1位数据传送。
假设8位寄存器内装的是待发送的数据10101010,上 升沿发送、下降沿接收、高位先发送。那么第一个上 升沿来的时候数据将会是高位数据SDO=1。下降沿到 来的时候,SDI上升沿的电平将被存到寄存器中去,那 么这时寄存器=0101010SDI,这样在8个时钟脉冲以后, 两个寄存器的内容互相交换一次。这样就完成里一个 SPI时序。