SPI经验总结.docx
- 文档编号:29835560
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:18
- 大小:239.59KB
SPI经验总结.docx
《SPI经验总结.docx》由会员分享,可在线阅读,更多相关《SPI经验总结.docx(18页珍藏版)》请在冰豆网上搜索。
SPI经验总结
SPI经验总结
1.AVR单片机串行接口SPI接口应用设计
2011-11-1120:
16:
35
使用的同步串行三线SPI接口,可以方便的连接采用SPI通信协议的外围或另一片AVR单片机,实现在短距离内的高速同步通信。
ATmega128的SPI采用硬件方式实现面向字节的全双工3线同步通信,支持主机、从机和2种不同极性的SPI时序,通信速率有7种选择,主机方式的最高速率为1/2系统时钟,从机方式最高速率为1/4系统时钟。
ATmega128单片机内部的SPI接口也被用于程序存储器和数据E2PROM的编程下载和上传。
但特别需要注意的是,此时SPI的MOSI和MISO接口不再对应PB2、PB3引脚,而是转换到PE0、PE1引脚上(PDI、PDO),其详见第二章中关于程序存储器的串行编程和校验部分的内容。
ATmega128的SPI为硬件接口和传输完成中断申请,所以使用SPI传输数据的有效方法是采用中断方式+数据缓存器的设计方法。
在对SPI初始化时,应注意以下几点:
.正确选择和设置主机或从机,以及工作模式(极性),数据传输率;
.注意传送字节的顺序,是低位优先(LSBFirst)还是高位优先(MSBFrist);
.正确设置MOSI和MISO接口的输入输出方向,输入引脚使用上拉电阻,可以节省总线上的吊高电阻。
下面一段是SPI主机方式连续发送(接收)字节的例程:
#DefineSIZE100
UnsignedCharSPI_rx_buff[SIZE];
UnsignedCharSPI_tx_buff[SIZE];
UnsignedCharRx_wr_index,Rx_rd_index,Rx_counter,Rx_buffer_overflow;
UnsignedCharTx_wr_index,Tx_rd_index,Tx_counter;
#PragmaInterrupt_handlerSpi_stc_isr:
18
VoidSpi_stc_isr(Void)
{
SPI_rx_buff[Rx_wr_index]=SPDR;//从ISP口读出收到的字节
If(++Rx_wr_index==SIZE)Rx_wr_index=0;//放入接收缓冲区,并调整队列指针
If(++Rx_counter==SIZE)
{
Rx_counter=0;
Rx_buffer_overflow=1;
}
If(Tx_counter)//如果发送缓冲区中有待发的数据
{
--Tx_counter;
SPDR=SPI_tx_buff[Tx_rd_index];//发送一个字节数据,并调整指针
If(++Tx_rd_index==SIZE)Tx_rd_index=0;
}
}
UnsignedCharGetSPIchar(Void)
{
UnsignedCharData;
While(Rx_counter==0);//无接收数据,等待
Data=SPI_rx_buff[Rx_rd_index];//从接收缓冲区取出一个SPI收到的数据
If(++Rx_rd_index==SIZE)Rx_rd_index=0;//调整指针
CLI();
--Rx_counter;
SEI();
ReturnData;
}
VoidPutSPIchar(CharC)
{
While(Tx_counter==SIZE);//发送缓冲区满,等待
CLI();
If(Tx_counter||((SPSR&0x80)==0))//发送缓冲区已中有待发数据
{//或SPI正在发送数据时
SPI_tx_buffer[Tx_wr_index]=C;//将数据放入发送缓冲区排队
If(++Tx_wr_index==SIZE)Tx_wr_index=0;//调整指针
++Tx_counter;
}
Else
SPDR=C;//发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送
SEI();
}
VoidSpi_init(Void)
{
UnsignedChatTemp;
DDRB|=0x080;//MISO=InputAndMOSI,SCK,SS=Output
PORTB|=0x80;//MISO上拉电阻有效
SPCR=0xD5;//SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
SPSR=0x00;
Temp=SPSR;
Temp=SPDR;//清空SPI,和中断标志,使SPI空闲
}
VoidMain(Void)
{
UnsignedCharI;
CLI();//关中断
Spi_init();//初始化SPI接口
SEI();//开中断
While()
{
PutSPIchat(I);//发送一个字节
I++;
GetSPIchar();//接收一个字节(第一个字节为空字节)
………
}
}
这个典型的SPI例程比较简单,主程序中首先对ATmega128的硬件SPI进行初始化。
在初始化过程中,将PORTB的MOSI、SCLK和SS引脚作为输出,同时将MISO作为输入引脚,并打开上拉电阻。
接着对SPI的寄存器进行初始化设置,并空读一次SPSR、SPDR寄存器(读SPSR后再对SPDR操作将自动清零SPI中断标志自动清零),使ISP空闲等待发送数据。
AVR的SPI由一个16位的循环移位寄存器构成,当数据从主机方移出时,从机的数据同时也被移入,因此SPI的发送和接收在一个中断服务中完成。
在SPI中断服务程序中,先从SPDR中读一个接收的字节存入接收数据缓冲器中,再从发送数据缓冲器取出一个字节写入SPDR中,由ISP发送到从机。
数据一旦写入SPDR,ISP硬件开始发送数据。
下一次ISP中断时,表示发送完成,并同时收到一个数据。
类似本章介绍的USART接口的使用,程序中PutSPIchar()和GetSPIchar()为应用程序的底层接口函数(SPI驱动程序是SPI中断服务程序),同时也使用了两个数据缓冲器,分别构成循环队列。
这种程序设计的思路,不但程序的结构性完整,同时也适当的解决了高速MCU和低速串口之间的矛盾,实现程序中任务的并行运行,提高了MCU的运行效率。
本例程是通过SPI批量输出、输入数据的示例,用户可以使用一片ATmega128,将其MOSI和MISO两个引脚连接起来,构成一个ISP接口自发自收的系统,对程序进行演示验证。
需要注意,实际接收到的字节为上一次中断时发出的数据,即第一个收到的字节是空字节。
读懂和了解程序的处理思想,读者可以根据需要对程序进行改动,适合实际系统的使用。
如在实际应用中外接的从机是一片SPI接口的温度芯片,协议规程为:
主机先要连续发送3个字节的命令,然后从机才返回一个字节的数据。
那么用户程序可以先循环调用PutSPIchar()函数4次,将3个字节的命令和一个字节的空数据发送到从机,然后等待一段时间,或处理一些其它的操作后,再循环调用GetSPIchar()函数4次,从接收数据缓冲器中连续读取4个字节,放弃前3个空字节,第4个字节即为从机的返回数据了。
2.51单片机综合学习系统之 SPI总线原理与应用篇 《电子制作》2008年9月 站长原创,如需引用请注明出处
(2011-04-2510:
55:
44)
转载▼
标签:
杂谈
大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了使用IIC总线的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习SPI总线的基本原理与应用实例。
先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:
分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。
主体系统如图1所示,其配套书本教程《单片机快速入门》如图2所示。
图151单片机综合学习系统主机部分图片
图251单片机综合学习系统配套书本教程——《单片机快速入门》
上图是我们将要使用的51单片机综合学习系统硬件平台,如图1所示,本期实验我们用到了综合系统主机、板载的AT93C46芯片,综合系统其它功能模块原理与使用详见前几期《电子制作》杂志及后期连载教程介绍。
SPI总线简介
SPI总线基本概念
SPI(SerialPeripheralInterface———串行外设接口)总线是Motorola公司推出的一种同步串行接口技术。
SPI总线系统是一种同步串行外设接口,允许MCU与各种外围设备以串行方式进行通信、数据交换。
外围设备包括FLASHRAM、A/D转换器、网络控制器、MCU等。
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。
其工作模式有两种:
主模式和从模式。
SPI是一种允许一个主设备启动一个从设备的同步通讯的协议,从而完成数据的交换。
也就是SPI是一种规定好的通讯方式。
这种通信方式的优点是占用端口较少,一般4根就够基本通讯了(不算电源线)。
同时传输速度也很高。
一般来说要求主设备要有SPI控制器(也可用模拟方式),就可以与基于SPI的芯片通讯了。
SPI总线系统结构
SPI系统可直接与各个厂家生产的多种标准外围器件直接接口,一般使用4条线:
串行时钟线(SCK)、主机输入/从机输出数据线MISO(DO)、主机输出/从机输入数据线MOSI(DI)和低电平有效的从机选择线CS。
MISO和MOSI用于串行接收和发送数据,先为MSB(高位),后为LSB(低位)。
在SPI设置为主机方式时,MISO是主机数据输入给,MOSI是主机数据输出线。
SCK用于提供时钟脉冲将数据一位位地传送。
SPI总线器件间传送数据框图如图3所示:
图3SPI总线器件间传送数据框图
SPI总线的接口特性
利用SPI总线可在软件的控制下构成各种系统。
如1个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。
在大多数应用场合,可使用1个MCU作为主控机来控制数据,并向1个或几个从外围器件传送该数据。
从器件只有在主机发命令时才能接收或发送数据。
其数据的传输格式是高位(MSB)在前,低位(LSB)在后。
当一个主控机通过SPI与几种不同的串行I/O芯片相连时,必须使用每片的允许控制端,这可通过MCU的I/O端口输出线来实现。
但应特别注意这些串行I/O芯片的输入输出特性:
首先是输入芯片的串行数据输出是否有三态控制端。
平时未选中芯片时,输出端应处于高阻态。
若没有三态控制端,则应外加三态门。
否则MCU的MISO端只能连接1个输入芯片。
其次是输出芯片的串行数据输入是否有允许控制端。
因为只有在此芯片允许时,SCK脉冲才把串行数据移入该芯片;在禁止时,SCK对芯片无影响。
若没有允许控制端,则应在外围用门电路对SCK进行控制,然后再加到芯片的时钟输入端;当然,也可以只在SPI总线上连接1个芯片,而不再连接其它输入或输出芯片。
SPI总线的数据传输
SPI是一个环形总线结构,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。
SPI数据传输原理很简单,它需要至少4根线,事实上3根也可以。
也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。
其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。
这就允许在同一总线上连接多个SPI设备成为可能。
在SPI方式下数据是一位一位的传输的。
这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。
数据输出通过SDO线,数据在时钟上沿或下沿时改变,在紧接着的下沿或上沿被读取。
完成一位数据传输,输入也使用同样原理。
这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。
假设8位寄存器内装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
那么第一个上升沿来的时候数据将会是高位数据SDO=1。
下降沿到来的时候,SDI上的电平将被存到寄存器中去,那么这时寄存器=0101010SDI,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。
这样就完成里一个SPI时序。
下面举一个实例来说明其数据传送过程。
假设主机和从机初始化就绪,并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对SPI的8个时钟周期的数据情况演示一遍:
(下表中“上”表示上升沿,“下”表示下降沿)
脉冲序号
主机缓存
从机缓存
SDI
SDO
0
10101010
01010101
0
0
1上
0101010x
1010101x
0
1
1下
01010100
10101011
0
1
2上
1010100x
0101011x
1
0
2下
10101001
01010110
1
0
3上
0101001x
1010110x
0
1
3下
01010010
10101101
0
1
4上
1010010x
0101101x
1
0
4下
10100101
01011010
1
0
5上
0100101x
1011010x
0
1
5下
01001010
10110101
0
1
6上
1001010x
0110101x
1
0
6下
10010101
01101010
1
0
7上
0010101x
1101010x
0
1
7下
00101010
11010101
0
1
8上
0101010x
1010101x
1
0
8下
01010101
10101010
1
0
表1:
脉冲与数据变化对应表
这样就完成了两个寄存器8位的交换,SDI、SDO是相对于主机而言的。
其中CS引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。
根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。
这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。
也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。
SPI还是一个数据交换协议,因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出
对于不带SPI串行总线接口的MCS51系列单片机来说,可以使用软件来模拟 SPI的操作,包括串行时钟、数据输入和数据输出。
如我们可以定义三个普通I/O口用来模拟SPI器件的SCK、MISO、MOSI。
对于不同的串行接口外围芯片,它们的时钟时序是不同的。
对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口的初始状态设置为1,而在允许接口后再置为0。
这样,MCU在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至单片机的模拟MISO线,此后再置SCK为1,使单片机从模拟的MOSI线输出1位数据(先为高位)至串行接口芯片。
至此,模拟1位数据输入输出便宣告完成。
此后再置SCK为0,模拟下1位数据的输入输出……,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。
对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应取串行时钟输出的初始状态为0,即在接口芯片允许时,先置SCK为1,以便外围接口芯片输出1位数据(MCU接收1位数据),之后再置时钟为0,使外围接口芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。
93C46存储器的软硬件设计实例
下面就以目前单片机系统中广泛应用的SPI接口的数据存储器93C46为例,介绍SPI器件的基本应用。
93C46串行存储器简介
93C46是1k位串行EEPROM储存器。
每一个储存器都可以通过DI/DO引脚写入或读出。
它的存储容量为1024位,内部为128×8位或64×16位。
93C46为串行三线SPI操作芯片,在时钟时序的同步下接收数据口的指令。
指令码为9位十进制码,具有7个指令,读、擦写使能、擦除、写、全擦、全写及擦除禁止。
该芯片擦写时间快,有擦写使能保护,可靠性高,擦写次数可达100万次,93C46的引脚功能图如图4所示。
图493C46的引脚图
CS:
芯片选择
SCK:
时钟
DI:
串行数据输入
DO:
串行数据输出
VSS:
接地
NC:
空脚(应用时不用接任何电路)
VCC:
电源
指令
起始位
操作数
地址
数据
64╳16
128╳8
64╳16
128╳8
读(READ)
1
10
A5~A0
A6~A0
清除((ERASE)
1
11
A5~A0
A6~A0
写(WRITE)
1
01
A5~A0
A6~A0
D15~D0
D7~D0
写使能(EWEN)
1
00
11XXXX
11XXXXX
写禁止(EWDS)
1
00
00XXXX
00XXXXX
芯片清除(ERAL)
1
00
10XXXX
10XXXXX
芯片写入(WRAL)
1
00
01XXXX
01XXXXX
D15~D0
D7~D0
表2:
93C46串行EEPROM指令格式选择表
指令说明:
∙读(READ):
当下达10XXXXXX指令后,地址(XXXXXXXX)的数据在SCK=1时由DO输出。
∙写(WRITE):
在写入数据前,必须先下达写使能(EWEN)指令,然后再下达01XXXXXX指令后,当SCK=1时,会把数据码写入指定地址(XXXXXXXX);而DO=0时,表示还在进行写操作,写入结束后DO会转为高电平。
写入动作完成后,必须再下达写禁止(EWDS)命令。
∙清除(ERASE):
下达清除指令11XXXXXX后会将地址(XXXXXXXX)的数据清除。
∙写使能(EWEN):
下达0011XXXX指令后,才可以进行写(WRITE)操作。
∙写禁止(EWDS):
下达0000XXXX指令后,才可重复进行写入(WRITE)操作。
∙芯片清除(ERAL):
下达0010XXXX指令后,全部禁止。
∙芯片写入(WRAL):
下达0001XXXX指令后,全部写入“0”。
程序功能
本例用来实现对93C46存储器的读写操作,并验证数据是否正确。
此程序可以用配套实验板为硬件平台,在调试时要把功能开关调到93C46处。
本程序先分别向0x02和0x03两个地址写入0x55和0xAA,然后读其中一个地址,并将读到的数据显示出来验证是否正确。
程序默认是读0x02地址内的数据,读者也可以修改地址数据来读其它地址数据。
在实验前要先把功能开关切换到93C46的位置上,如图5,图6所示。
图593C46实验演示图
图693C46实验演示图
硬件原理图
图7硬件原理图
程序流程图
图8软件流程图
相信看到这里,你应该可以理解我们是如何利用单片机来进行SPI总线的读写操作了,你也可以根据自己的需要来写芯片读写、存储的相关程序。
由于篇幅有限,读者朋友可以通过网站或电子邮件一起交流与学习。
在下几期中,我们将陆续介绍51单片机综合学习系统的其它功能原理与应用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SPI 经验总结