资源预览内容
第1页 / 共38页
第2页 / 共38页
第3页 / 共38页
第4页 / 共38页
第5页 / 共38页
第6页 / 共38页
第7页 / 共38页
第8页 / 共38页
第9页 / 共38页
第10页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章 串行外围接口SPI原理及应用第1节 SPI及模式 第2节 SPI管脚及相关寄存器 第3节 SPI用于多机通讯 第4节 SPI在系统扩展中的应用第1节 SPI及模式SPI串行外设接口总线 SPI(Serial Peripheral Interface串行外设接 口)总线是Motorola公司推出的一种同步串 行外设接口,它用于MCU与各种外围设备 以串行方式进行通信(8位数据同时同步地被发送和接收),系统可配置为主或从操 作模式。外围设备包括简单的TTL移位寄存 器(用作并行输入或输出口)至复杂的LCD 显示驱动器或A/D转换器等。 SPI系统可直接与各个厂家生产的多种标准 外围器件直接接口,它只需4条线: 串行时 钟线(SCK)、主机输入/从机输出数据线 MISO、主机输出/从机输入数据线MOSI和低 电平有效的从机选择线CS(SS)。 在SPI接口中,数据的传输只需要1个时钟信 号和2条数据线。 由于SPI系统总线只需34位数据线和控制 线即可扩展具有SPI的各种I/O器件,而并行 总线扩展方法需8根数据线、816位地址 线、23位控制线,因而SPI总线的使用可 以简化电路设计,省掉了很多常规电路中 的接口器件,提高了设计的可靠性。1. SPI总线系统的组成 图8-1是SPI总线系统典型结构示意图。图8-1 SPI外围扩展示意图 单片机与外围扩展器件在时钟线SCK、数据线 MOSI和MISO上都是同名端相连。带SPI接口的 外围器件都有片选端CS。 在扩展多个SPI外围器件(如图8-1所示)时, 单片机应分别通过I/O口线来分时选通外围器 件。 当SPI接口上有多个SPI接口的单片机时,应区 别其主从地位,在某一时刻只能由一个单片机 为主器件。 图8-1中MCU(主)为主器件,MCU(从)为 从器件。 SPI有较高的数据传送速度,主机方式最高 速率可达1.05 Mb/s,目前不少外围器件都 带有SPI接口。 在大多数应用场合中,使用1个MCU作为主 机,控制数据向1个或多个从外围器件的传 送。 从器件只能在主机发命令时,才能接收或向 主机传送数据。 其数据的传输格式大多是高位(MSB)在前 ,低位(LSB)在后。 当SPI工作时,在移位寄存器中的数据逐位 从输出引脚(MOSI)输出(高位在前), 同时从输入引脚(MISO)接收的数据逐位 移到移位寄存器(高位在前)。 发送一字节后,从另一个外围器件接收的 字节数据进入移位寄存器中。 主SPI的时钟信号(SCK)使传输同步。 SPI总线有以下主要特性: 全双工、3线同步传 输;主机或从机工作;提供频率可编程时钟; 发送结束中断标志;写冲突保护;总线竞争保 护等。其典型时序图如图8-2所示。图8-2 SPI串行总线典型时序图单片机管脚模拟SPI接口的方法 以便深入理解SPI时序1) 用一般I/O口线模拟SPI操作 对于没有SPI接口的单片机来说,可使用软件来模 拟SPI的操作,包括串行时钟、数据输入和输出。 对于不同的串行接口外围芯片,它们的时钟时序 是不同的。 对于在SCK的上升沿输入(接收)数据和在下降沿 输出(发送)数据的器件(slave) 图8-3为MCU与MCM2814(E2PROM)的硬件连接图 。图8-3 SPI总线接口原理图PTBD2PTBD0PTBD3PTBD1QG8管脚模拟SPI输入一字节-C语言#define PTBD0 SCK;定义输出 #define PTBD1MISO;定义输入 #define PTBD2MOSI;定义输出unsigned char SPI_IN(void) unsigned char i, data; data = 0; SCK = 1;时钟输出为1 for(i=0;i #include “derivative.h“ /包含头文件 int a=0x57; int b; /*定义两个全局变量*/ void main(void) DisableInterrupts; /*禁止所有中断*/ SPIC1=0X54; /*使能SPI功能,并设本机为主机*/ SPIBR=0X77; /*设预置分频因子为8,设分频因子为256*/ PTBDD_PTBDD5=1; PTBD_PTBD5=0; /*使为低电平,选通从机*/ /*初始化完毕*/ while(1) if(SPIS_SPTEF) /*判断是否可以发送*/ SPID=a; /*将待发送数据送入发送缓冲器*/ PTBDD_PTBDD7=1; PTBD_PTBD7=0; /*点亮LED1,以显示发送成功*/ break; /*跳出循环*/ while(1) if(SPIS_SPRF) /*判断是否可以接收*/ b=SPID; /*将数据从接收缓冲器中取出*/ if(b=0x56) /*判断接收的数据是*/ /*否正确*/ PTBDD_PTBDD6=1; PTBD_PTBD6=0; /*点亮LED2,以示接收成功*/ break; /*跳出循环*/ PTBD_PTBD5=1; /*使为高电平,通信结束*/ for(;) _RESET_WATCHDOG(); /*喂看门狗*/ 从机流程图从机通信程序如下#include #include “derivative.h“ /包含头文件*/ int i; int a,b; void main(void) DisableInterrupts; /*禁止所有中断*/ mainLoop: SPIC1=0x44; /*使能SPI功能,并设本机为从机*/ SPIBR=0X77; /*设预置分频因子为8,设分频因子为256*/ /*初始化完毕*/ while(1) if(SPIS_SPRF) /*判断是否可以接受*/ b=SPID; /*将数据从接收缓冲器中取出*/ if(b=0x57) /*判断接收的数据是否正确*/ PTBDD_PTBDD7=1; PTBD_PTBD7=0; /*点亮LED1,以示接收成功*/ break; /*跳出循环*/ while(1) if(SPIS_SPTEF=1) /*判断是否可以发送*/ SPID=0x56; /*将待发送数据送入发送缓冲器*/ PTBDD_PTBDD6=1; PTBD_PTBD6=0; /*点亮LED2,以显示发送成功*/ break; /*跳出循环*/ for(;) _RESET_WATCHDOG(); /*喂看门狗*/
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号