第一篇:SPI介绍
SPI总线学习
1、SPI总线速度:
波特率可以高达5Mbps,具体速度大小取决于SPI硬件。
例如,Xicor公司的SPI串行器件传输速度能达到5MHz;
ATMEL的AT45DB021B,20 MHz Max Clock Frequency;
LPC2214的SPI,最大数据位速率为输入时钟速率的1/8。
2、SPI简介:
同步外设接口(SPI)是由摩托罗拉公司开发的全双工同步串行总线,该总线 量用在与EEPROM、ADC、FLASH和显示驱动器之类的慢速外设器件通信。SPI(Serial Peripheral Interface)是一种串行同步通讯协议,由一个主 设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而 完成数据的交换。通讯时,数据由MOSI输出,MISO 输入,数据在时钟的上 升或下降沿由MOSI 输出,在紧接着的下降或上升沿由MISO 读入,这样经过 8/16 次时钟的改变,完成8/16 位数据的传输。
在一次数据传输过程中,接口上只能有一个主机和一个从机能够通信。并且,主机总是向从机发送一个字节数据,而从机也总是向主机发送一个字节数据。该总线通信基于主-从配置。它有4个信号:
MOSI:主出/从入
MISO:主入/从出
SCK:串行时钟
SS:从属选择。即CS(从使能信号),CS 决定了唯一的与主设 备通信的从设备,如没有CS 信号,则只能存在一个从设备,主设备 通过产生移位时钟来发起通讯。
在SPI传输中,数据是同步进行发送和接收的。数据传输的时钟基于来自主处理器的时钟脉冲,摩托罗拉没有定义任何通用SPI的时钟 规范。然而,最常用的时钟设置基于时钟极性(CPOL)和时钟相位(CPHA)两个 参数,CPOL定义SPI串行时钟的活动状态,而CPHA定义相对于SO-数据位的 时钟相位。CPOL和CPHA的设置决定了数据取样的时钟.3、例子:
LPC2214有两个SPI接口。
SPI 从机选择信号是一个低有效信号,用于指示被选择参与数据传输的从机。每个从机都有各自特定的从机选择输入信号。在数据处理之前,SSEL 必须为低电平并在整个处理过程中保持低电平。如果在数据传输中SSEL 信号变 为高电平,传输将被中止。这种情况下,从机返回到空闲状态并将任何接收到 的数据丢弃。对于这样的异常没有其它的指示。该信号不直接由主机驱动。可 通过软件使用一个通用I/O 口来驱动。
注:配置为SPI 主机的LPC2114/2124/2212/2214 必须选择一个合适的管脚用作 SSEL 功能并使其保持高电平,只有这样,器件才能真正执行主机的功能。
例程:XFT-8001部分SPI软体;
/*----定义SPI相关控制器的控制位(SPCR)----*/
#defineMSTR BIT5/*-----主模式控制----#defineBIT50x00000020*/ #define CPOLBIT4/*-----时钟极性控制----#define BIT40x00000010*/ #defineCPHA BIT3/*-----时钟相位控制----*/
#defineLSBF BIT6/*-----移位方向控制----*/
#defineSCKP0_4/*------串行时钟-------*/
#defineMISO P0_5/*------主入从出-------*/
#defineMOSI P0_6/*------主出从入------*/
#defineSSEL_ADP0_16/*----从机选择SPI脚---*/
#define FLASH_CS P0_19
void SpiInit(uint8 x)
{
switch(x)
{
case FLASHSPI://按照flash的要求初始化SPIS0SPCCR = 0x00000036;//约400KHz的时钟频率S0SPCCR=Fpclk/SPI频率S0SPCR= MSTR;//主控制器,模式选择0break;
case SDSPI://按照SD卡的要求初始化SPI
S0SPCCR= 0x0000000E;
S0SPCR= MSTR;
break;
case HC595SPI://按照595的要求初始化SPIbreak;
}
}
/*****************************************************************
******
** 函数名称: SpiSendData()
** 功能描述:用SPI总线发送数据,由于SPI的特点,SPI在发送数据的时候,也在接收数据;如果仅仅要求接收数据,也要发送数据,不然没有SCK时钟
** 输 入:x:SPI将要发送的数据
** 输 出:返回接收的数据
** 全局变量:无
** 调用模块:无
** 日 期:2006年11月12日
************************************/
uint8 SpiSendData(uint8 x)
{ S0SPDR = x;
while((S0SPSR&0x80)==0);
return S0SPDR;
}
/*************************
** 函数名称: EraseFlashBlock()
** 功能描述:擦除单个block的数据, 可以擦除器件中的任何一个指
定编号的block块,完成擦除之后要读取状态位来判断是否擦除完毕 **在片选信号CS的上升沿开始擦除
** 输 入:addr:要擦除的块编号,对于AT45DB021B而言,范围
从0~127
** 输 出:无
** 全局变量:无
** 调用模块:无
** 日 期:2007年5
第二篇:SPI全面介绍以及学习心得
SPI基础介绍
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.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(片选)。
(1)SDO – 主设备数据输出,从设备数据输入
(2)SDI – 主设备数据输入,从设备数据输出
(3)SCLK – 时钟信号,由主设备产生
(4)CS – 从设备使能信号,由主设备控制
其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。
接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。
要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。
在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。
最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。
AT91RM9200的SPI接口主要由4个引脚构成:SPICLK、MOSI、MISO及 /SS,其中SPICLK是整个SPI总线的公用时钟,MOSI、MISO作为主机,从机的输入输出的标志,MOSI是主机的输出,从机的输入,MISO 是主机的输入,从机的输出。/SS是从机的标志管脚,在互相通信的两个SPI总线的器件,/SS管脚的电平低的是从机,相反/SS管脚的电平高的是主机。在一个SPI通信系统中,必须有主机。SPI总线可以配置成单主单从,单主多从,互为主从。
SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS0~3接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS0~3,输出用于16个外设的选择。SPI协议举例
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
那么第一个上升沿来的时候 数据将会是sdo=1;寄存器中的10101010左移一位,后面补入送来的一位未知数x,成了0101010x。下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。
举例:
假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据
脉冲 主机sbuff 从机sbuff 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
这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16 位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。SPI 总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于 CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。
SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式
SPI总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。
SPI总线包括1根串行同步时钟信号线以及2根数据线。
SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI接口时序如图
3、图4所示。
补充:
上文中最后一句话:SPI主模块和与之通信的外设备时钟相位和极性应该一致。个人理解这句话有 2层意思:其一,主设备SPI时钟和极性的配置应该由外设来决定;其二,二者的配置应该保持一致,即主设备的SDO同从设备的SDO配置一致,主设备的 SDI同从设备的SDI配置一致。因为主从设备是在SCLK的控制下,同时发送和接收数据,并通过2个双向移位寄存器来交换数据。工作原理演示如下图:
上升沿主机SDO发送数据1,同时从设备SDO发送数据0;紧接着在SCLK的下降沿的时候从设备的SDI接收到了主机发送过来的数据1,同时主机也接收到了从设备发送过来的数据0.SPI协议心得
SPI接口时钟配置心得:
在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,从设备SDI接收的数据是主设备的SDO发送过来的,主设备 SDI接收的数据是从设备SDO发送过来的,所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,跟从设备 SDO发送数据的极性是相同的。
若主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边SPI时钟极性应该配置为下降沿有效。
一.SPI总线简介
串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口。
SPI 用于CPU与各种外围器件进行全双工、同步串行通讯。它只需四条线就可以完成MCU与各种外围器件的通讯,这四条线是:串行时钟线(CSK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)、低电平有效从机选择线CS。当SPI工作时,在移位寄存器中的数据逐位从输出引脚(MOSI)输出(高位在前),同时从输入引脚(MISO)接收的数据逐位移到移位寄存器(高位在前)。发送一个字节后,从另一个外围器件接收的字节数据进入移位寄存器中。即完成一个字节数据传输的实质是两个器件寄存器内容的交换。主SPI的时钟信号(SCK)使传输同步。其典型系统框图如下图所示。
二.SPI总线主要特点 · 全双工;
· 可以当作主机或从机工作;· 提供频率可编程时钟;· 发送结束中断标志;· 写冲突保护;.总线竞争保护等。
三.SPI总线工作方式
SPI总线有四种工作方式,其中使用的最为广泛的是SPI0和SPI3方式(实线表示): 四种工作方式时序分别为: 时序详解:
CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平
CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样
工作方式1:
当CPHA=0、CPOL=0时SPI总线工作在方式1。MISO引脚上的数据在第一个SPSCK沿跳变之前已经上线了,而为了保证正确传输,MOSI引脚的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,首先将数据上线,然后在同步时钟信号的上升沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。
工作方式2: 当CPHA=0、CPOL=1时SPI总线工作在方式2。与前者唯一不同之处只是在同步时钟信号的下降沿时捕捉位信号,上升沿时下一位数据上线。
工作方式3:
当CPHA=
1、CPOL=0时SPI总线工作在方式3。MISO引脚和MOSI引脚上的数据的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,在同步时钟信号周期开始时(上升沿)数据上线,然后在同步时钟信号的下降沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。
工作方式4:
当CPHA=
1、CPOL=1时SPI总线工作在方式4。与前者唯一不同之处只是在同步时钟信号的上升沿时捕捉位信号,下降沿时下一位数据上线。
四.SPI总线常见错误 1 SPR设定错误
在从器件时钟频率小于主器件时钟频率时,如果SCK的速率设得太快,将导致接收到的数据不正确(SPI接口本身难以判断收到的数据是否正确,要在软件中处理)。
整个系统的速度受三个因素影响:主器件时钟CLK主、从器件时钟CLK从和同步串行时钟SCK,其中SCK是对CLK主的分频,CLK从和CLK主是异步的。要使SCK无差错无遗漏地被从器件所检测到,从器件的时钟CLK从必须要足够快。下面以SCK设置为CLK主的4分频的波形为例,分析同步串行时钟、主时钟和从时钟之间的关系。
图1主从时钟和SCK的关系
如图1所示,当T从 图2主从时钟和SCK的关系 根据以上的分析,SPR和主从时钟比的关系如表1所列。 表1 SPR的设置和主从时钟周期比值之间的关系 在发送数据之前按照表1对SPR进行设置,SPR设定错误可以完全避免。模式错误(MODF) 模式错误表示的是主从模式选择的设置和引脚SS的连接不一致。 器件工作在主模式的时候(MSTR=1),它的片选信号SS引脚必须接高电平。在发送数据的过程中,如果它的SS从高电平跳至低电平,在SS的下降沿,SPI模块将检测到模式错误,对MODF位置1,强制器件从主模式转入从模式(即令MSTR=0),清空内部计数器counter,并结束正在进行的数据传输,如图 3(a)所示。 对从模式(MSTR=0),在没有数据传送的时候,SS高电平表示从器件未被选中,从器件不工作,MISO输出高阻;在数据传输过程中,片选信号SS必须接低电平,且SS不允许跳变。如果SS从低电平跳到高电平,在SS的上跳沿,SPI模块也将检测到模式错误,清空内部计数器 counter,并结束正在进行的数据传输。直到SS恢复为低电平,重新使SPEN=1时,才重新开始工作,如图3(b)所示。 图3模式错误的检测 3 溢出错误(OVR) 溢出错误表示连续传输多个数据时,后一个数据覆盖了前一个数据而产生的错误。 状态标志SPIF表示的是数据传输正在进行中,它对数据的传输有较大的影响。主器件的SPIF有效由数据寄存器的空标志SPTE=0产生,而从器件的 SPIF有效则只能由收到的第一个SCK的跳变产生,且又由于从器件的SPIF和主器件发出的SCK是异步的,因此从器件的传输标志SPIF从相对于主器件的传输标志SPIF主有一定的滞后。如图4所示,在主器件连续发送两个数据的时候将有可能导致从器件的传输标志和主器件下一个数据的传输标志相重叠(图 4中虚线和阴影部分),第一个收到的数据必然被覆盖,第二个数据的收/发也必然出错,产生溢出错误。 图4溢出错误 通过对从器件的波形分析发现,counter=8后的第一个时钟周期,数据最后一位的传输已经完成。在数据已经收/发完毕的情况下,counter=8 状态的长短对数据的正确性没有影响,因此可以缩短counter=8的状态,以避免前一个SPIF和后一个SPIF相重叠。这样,从硬件上避免了这一阶段的溢出错误。 但是,如果从器件工作速度不够快或者软件正在处理其他事情,在SPI接口接收到的数据尚未被读取的情况下,又接收到一个新的数据,溢出错误还是会发生的。此时,SPI接口保护前一个数据不被覆盖,舍弃新收到的数据,置溢出标志OVR=1;另外发出中断信号(如果该中断允许),通知从器件及时读取数据。偏移错误(OFST) SPI接口一般要求从器件先工作,然后主器件才开始发送数据。有时在主器件往外发送数据的过程中,从器件才开始工作,或者SCK受到外界干扰,从器件未能准确地接收到8个SCK。如图5所示,从器件接收到的8个SCK其实是属于主器件发送相邻的两个数据的SCK主。这时,主器件的SPIF和从器件的SPIF会发生重叠,数据发生了错位,从器件如果不对此进行纠正的话,数据的接收/发送便一直地错下去。 图5偏移错误 在一个数据的传输过程中,SPR是不允许改变的,即SCK是均匀的,而从图5可以看出,从器件接收到的8个SCK并不均匀,它们是分别属于两个数据的,因此可以计算SCK的占空时间来判断是否发生了偏移错误。经分析,正常时候SCK=1时的时钟周期数n的取值满足如下关系: 但由于主从时钟之间是异步的,并且经过了取整,所以正常时候SCK=1时的时钟周期计数值COUNT应满足: 比如在图5中,COUNT的最大值COUNT(max)=2或者1,都可认为是正常的。但当出现COUNT(max)=8时,可以判定出现了偏移错误。在实际设计中,先记录下第一个COUNT(max)的值,如果后面又出现与记录值相差1以上的COUNT(max)出现,可知有偏移错误OFST 发生。SPI接口在“不均匀”的地方令SPIF=1,然后准备等待下一个数据的第一个SCK。其中COUNT的位数固定为8位,为了避免溢出时重新从00H开始计数,当计数达到ffH时停止计数。其他错误 设定不当,或者受到外界干扰,数据传输难免会发生错误,或者有时软件对错误的种类判断不清,必须要有一种方法强制SPI接口从错误状态中恢复过来。在 SPI不工作,即SPEN=0的时候,清除SPI模块内部几乎所有的状态(专用寄存器除外)。如果软件在接收数据的时候,能够发现数据有错误,无论是什么错误,都可以强制停止SPI的工作,重新进行数据传输。例如,在偏移错误(OFST)中,如果SPR2、SPR1和SPR0的设置适当,也可以使SCK显得比较“均匀”。SPI接口硬件本身不可能检测到有错误,若用户软件能够发现错误,这时就可以强制停止SPI的传输工作,这样就可以避免错误一直持续下去。 在应用中,如果对数据的正确性要求较高,除了要在软件上满足SPI接口的时序要求外,还需要在软件上作适当的处理。 五.设计SPI总线控制器 目前的项目中使用了SPI总线接口的FLASH存储器存储图像数据。FLASH的SPI总线频率高达66M,但MCU的频率较低,晶振频率7.3728M,SPI最大频率为主频1/2。对于320*240*16的图像读取时间为333ms,而且还忽略了等待SPI传输完成、写显存、地址坐标设定等时间。实际测试约为1s。成为GUI设计的极大瓶颈。由于TFT驱动是自己FPGA设计的,资源尚有余量,决定把SPI控制器(主)及写图像部分逻辑放入FPGA中用硬件完成。 首先接触到的是SPI的SCK时钟频率问题。FPGA的频率是48M,未使用PLL。能否以此频率作为SCK频率呢?要知道所有的MCU提供的SPI频率最大为主频的1/2!为什么呢?查过一些资料后发现,SPI从机接收数据并不是以SCK为时钟的,而是以主频为时钟对SCK 和MISO进行采样,由采样原理得知SCK不能大于1/2主频,也就有了MCU提供最大master频率是1/2主频,最大slaver频率是1/4主频。FPGA在只作为主机时能否实现同主频一样频率的SCK呢??答案貌似是肯定的!但我还是有点担心,用组合逻辑控制SCK会不会出现较大毛刺影响系统稳定性呢?一切的一切待我完成再来解答好了~ Xilinx SPI FLASH 的烧写方法 1、首先在ISE中打开要烧写的工程,然后如图双击打开烧写工具。 2、打开烧写工具之后,双击边界扫描。 3、在右边空白区域右击,选择Cable Auto Connect,然后再次右击空白区域,选择Initial Chain。 4、上一步操作完成后会弹出如下界面,选择NO。 5、选择OK。 6、然后如下图选择打开。 7、由于我们的板子是SPI FLASH,所以如图选择,并点击箭头。 8、如图一步步选择FLASH容量、输出MCS文件的路径和名称。 9、按以上选择好之后,如下图,点击OK添加.bit文件,(如果项目中只包含verilog或者VHDL代码,则直接选择.bit文件,如果包含SDK中的C代码,则选择相应的download.bit文件)。 10、由于此项目包含C代码,所以如下图选择。 11、选择好之后会提示是否加入另外一个文件,这里选择NO。 12、如图左击一下左上角的选项,然后双击左下角的选项,活弹出生成文件成功。 13、如图右击选择添加FLASH。 14、选择刚才生成的MCS文件。 15、选择好板子上的FLASH型号。 16、选择好之后,如图右击首先对FLASH进行擦除。 17、擦除完成之后,选择对FLASH进行编程写入。 18如图可以看到进度条和读ID号。 19、成功。 文 章来源 莲 山 课 件 w w w.5Y k J.c oM 软件模拟引言随着信息社会的发展,网络和信息家电越来越地出现在人们的生活中。人们普通要求将家庭内的所有家用电器与Internet连接起来,实现主人在远方用计算机或电话通过Internet对象家庭电设施进行监控。家用电器制造商可以通过网络对其生产的设备进行售后跟踪服务;家用电器是故障时能自动按预设的邮件地址来发送电子邮件进行报警。这就需要有一个“家庭网络中央控制器”。它对外与Internet连接,对内通过家庭内部无线局域网将所有家用电器连接成一体,从而确保信息家电安全地接入Internet。当前,多数研究单位推出的家庭网络智能控制器,均以pC或准pC机作为硬件平台,由于价位高而均未被市场容纳。嵌入式Internet是近几年发展起来的一项新兴技术。以32位ARM嵌入式微处理器为硬件平台,通过移植嵌入式操作系统uClinux内核,开发相应的硬件驱动、微型GUI和上层应用软件,最终实现产品化的嵌入式家庭网络中央控制器。该系统具有体积小、功耗低、价格便宜的特点。 1 系统的硬件组成本系统以高性能、低价格的S3C4510B为主CpU。它是Samsung公司推出的基于ARM7TDMI核,精简指令系统的32位高速微处理器。工作电压为3.3V,内核ARM7TDMI的工作电压为2.5V,大大降低了芯片的功耗。S3C4510B片上资源:一个总线仲裁器可以根据总线仲裁优先级在片上功能模块和外围设备之间进行系统总线控制权分配;8KB指令、数据复用Cache,每128bit为1页,并可全部或部分设置为SRAM;1个主I2C总线控制器,可作为主发送器或主接收器,能连接多个从设备;2个通用DMA;18个通用I/O口; 2路4线UART口,其中一个支持IrDA 1.0,可用于红外通信;6组ROM/SRAM/Flash用于管理外部存储器。另外,可扩展4组动态存储器和4 BANK扩展I/O设备;2通道带有DMA传送方式的HDLC口;1个10M/100M自适应以太网控制器。图1为家庭网关的硬件框图,以S3C4510B为基本核心系统,外围扩展一系列功能模块。有4×4键盘及以屏幕LCD显示构成良好的人机界面,用于手动本地参数查询和设定。家庭网关基本系统以SpI接口与pTR3000无线收发模块相连,同时家庭内部家电控制器也通过SpI接口扩展pTR3000无线模块。这样,家庭网关的无线模块以轮询的方式与家庭内各家电控制器上无线模块进行通信,从而组成家庭内部无线子网。家庭网关基本系统只需对SpI口进行操作即可实现与家电通信。实现了家电以家庭网关为中介与Internet在物理层互联的三个通路:pC通过LAN经由Internet连接到基本系统的以太网口、pC通过Modem经由公司电话网与嵌入式Modem相连再到UART1、电话机经过公用电话网经语音卡连到UART1。 2 uClinux嵌入式操作系统操作系统选用uClinux。它是一个完全符合GNU(GNU’s Not Unix,自由软件基金会)/GpL(General pulic License,通用公共许可证)公约的完全开放代码项目,是标准Linux的一个分支,现在由Lineo公司支持维护。它专门针对没有MMU的CpU,并且专为嵌入式系统做了许多小型化的工作。UClinux经过对标准Linux内核的改动,形成了一个高度优化的、代码紧凑的嵌入式Linux。虽然它的体积很小,但uClinux仍然保留了Linux的大多数的优点,稳定、良好的移植性、优秀的网络功能、完备的对各种文件系统的支持以及标准丰富的ApI。它的主要特片如下:①在linux-2.4.x/driver/char/Makefile添加1行:obj_$(CONFIG_SpI)+=SpI.0。在24行obj-y+=mem.o tty_io.o后加pI.o。②在linux-2.4.x/driver/char/Config.in,添加1行:bool'SpI'CONFIG_SpI便于在make me nuconfig时选择。③在linux-2.4.x/driver/char/mem.c在文件头部添加:#ifdef CONFIG_SpI /*编译时选择该项就执行SpI的初始化函数*/extern void SpI_init(void);#endif在chr_dev_init()函数添加:#ifdef CONFIT_SpISpI_init();#endif④修改vendor/Samsung/4510b/Makefile,建立起设备节点。在12~35行间,DEVICE部分添加内容SpI,c,29,0。SpI是设备名,c代表字符设备,29是SpI的主设备号,0是SpI的次设备号。⑤make menuconfig时选中SpI编译,然后直载。启动后,会看到/proc/devinces中字符设备多了一项SpI 29。S3C4510B有18个通用I/O口,其中高10位可设置为其它功能口。在该系统中,设置p8为中断接收线,p11模拟主机输出线MOSI,p12模拟主机时钟SCK,p13模拟主机输入线MISO。p8口用于接收pTR3000的发送请求信号。当p8口接收到请求信号时,系统进入中断处理。中断处理进程唤醒睡在睡眠队列SpI_WAIT上的读进程,读进程由p12口输出SCK信号并由p13口读入数据。值得说明的是,SpI不带中断线,在此用p8口做中断接收线是为了避免操作系统在没有进行SpI操作时不断向SCK线发时钟信号。因此,MSp430F147IpM必须另外与S3C4510B连一个引脚在请求发送数据时发出中断接收线是为了避免操作系统在没有进行SpI操作时不断向SCK线发时钟信号。因此,MSp430F147IpM必须另外与S3C4510B连一个引脚在请求发送数据时发出中断请求信号。实现过程如下:Static wait_queue_head_wait;//休眠队列//读函数static ssize_t SpI_onlyread(struct file*file,char *buf,size_t count,loff_t *ppos){interruptible_sleep_on(&SpI_wait);//读进程睡眠等待读中断信号if(count>BUFNUM)count=BUFNUM;for(num=0;num>(12-i));//数据输入}}if(copy_to_user(buf,&SpI_read,count))//数据从内核空间拷贝到用户这间return-EFAULT;return count;}//写函数static ssize_t SpI_onlywrite(struct file *file,const char *buf,size_t count,loff_t *ppos){if(count>BUFNUM)count=BUFNUM;if(copy_from_user(&SpI_write,buf,count))//数据从用户空间拷贝到内核空间return-EFAULT;for(num=0;num>1;iopdata=iopdata^0x1000;//时钟输出}}return count;}//中断响应函数static int SpI_irq(int irq,void *dev_id,struct pt_regs *regs){intpnd=intpnd|0X1;//清中断位wake_up_interruptible(&SpI_wait);//唤醒睡眠队列return 1;}//字符设备驱动接口static struct file_operations SpI_fops={owner;THIS_MODULE,read: SpI_onlyread,write: SpI_onlywrite,};//初始化函数int_init SpI_init(void)register_chrdev(29,“SpI”&SpI_fops);//设备注册函数init_waitqueue_head(&SpI_wait);if(!request_irq(0,SpI_irq,SA_SAMpLE_RANDOM,“SpI”NULL)){ //中断申请return-EFAULT;}iopmod=(iopmod&0xffffe7ff)=0x1800+iopmod;//设置通用I/O口模式iopcon=(iopcon&0xffffffe0)+0xle+iopcon;//设置通用I/O模式enable_irq(0);//开中断return 0;}module_init(SpI_init);MODULE_LICENSE("GpL);EXpORT_NO_SYMBOLS;结语实验证明,模拟的SpI口接收发送数据准确可靠。用户程序可以以设备文件的形式进行访问,与标准的SpI接口无异。该方案对于嵌入式家庭网关的研究,以及运用uClinux作为操作系统的嵌入式模拟通信接口,有一定的参考价值 文 章来源 莲 山 课 件 w w w.5Y k J.c oM 0 引言 随着全球网络进一步扩展到新终端设备和以前未连接的行业中,网络安全对消费者、企业和其他机构变得越来越重要。人们越来越需要性能安全、价格便宜的装置设备。为了降低成本,往往需要简化电路设计。例如,采用SPI 方式引导硬件,使用SPI Flash 作为存储媒介,减少总线的布线,是简化硬件电路的较好的方法。但采用SPI 方式引导硬件,需要将程序引导到DDR 内存中,同时又需要对DDR 内存进行检查,这就出现了矛盾。基于SPI 的硬件引导 本文以一个实例,对嵌入式处理器基于SPI 引导硬件时如何进行RAM 检查进行详细的介绍。是嵌入式处理器使用SPI 引导的硬件框图。硬件引导程序和系统程序放在SPI Flash 中,在上电引导后,系统程序会被搬移到DDR 空间,在D DR 空间运行起来。现在以U-Boot 硬件引导程序为例,介绍以SPI 引导模式引导系统硬件的情况。U-Boot 是德国DENX 小组的开发用于多种嵌入式CPU 的Bootloader 程序,可以支持多种嵌入操作系统和多种处理器。编译的U-Boot 程序,往往是运行在NOR Flash 或DDR 中的。但在基于SPI 引导时,需要先从SPI Flash 往片内RAM 里运行一段程序,将DDR 内存检查一遍,然后再将U-Boot 引导到DDR 内存中去运行。SPI 引导采用的数据格式 在TI 公司的DSP 及ARM 处理器,飞思卡尔公司POWERPC 及ARM 处理器,都支持基于SPI 的引导模式。在这些处理器的片内ROM 都包含基本的SPI 引导驱动程序。本文以飞思卡尔公司的QorIQ P1010 处理器为例介绍其引导过程。P1010 片内的SPI 驱动程序能够把SPI 接口Flash 中的程序拷贝到DDR 内存或片内RAM 中。不过,在拷贝之前,需要先对DDR 控制器或片内RAM 进行配置。这就需要定义一个特定的数据结构,完成引导程序所需要的环境配置。对于不同的处理器,生产厂家定义的引导数据结构是不同的。在P1010 处理器完成复位序列后,通过选择使用处理器片内ROM 的SPI 引导配置程序,而后处理器内核开始运行该片内ROM 程序,配置SPI 控制器,并与外部的SPI Flash 通信,将程序拷贝出来并跳到指定的位置运行时配置数据写入此地址。当最低位为1 时,配置地址域高30 bit 代表的是指令,此时配置数据写入此地址。这样的结构让用户可以方便地配置4 B 对齐的内存,完成控制指令操作,或定义程序配置阶段的结束 当CNT(最低位)=0 时,则高30 bit 用作要写入数据的地址,配置数据包含要写入的数据。 当CNT=1 时,则高30 bit 用作控制指令。 当EC=1 时,代表配置阶段结束指令。 当DLY=1 时,代表延时一定时间指令。 当CF=1 时,代表更改SPI 频率的指令。 CNT 表示地址模式与指令模式的切换。 当处理器内核开始拷贝程序时,先判断0X40 位置的标志是否正确,如果正确,先根据配置的地址/数据对的个数N 来配置一些外围寄存器,然后从0X50 处指示的Flash 地址搬移用户代码数据到0X58 指示的地址。搬移完成后,从0X60 指示的地址开始运行。将片内运行的这一段程序叫TPL 程序。片内RAM 运行的TPL 程序 P1010 包含256 KB 的L2CACHE,也可以当片内RAM 使用。要检查DDR 内存,要先在片内RAM 里运行一小段TPL 程序。这一段程序是对基于DDR 引导程序U-Boot 的一个裁剪,主要完成内核的配置,初始化串口终端,初始化DDR 内存控制器,然后检查DDR 内存。在这里不需要设置U-Boot 的环境变量,不需要配置以太网等其他的外围器件。编译后的TPL 目标文件为uboot-tpl.bin。TPL 程序的编译按RAM 引导的方式处理。程序的开始地址设为:0xc0030000~0xc0038800。现在需要对编译后的uboot-tpl.bin 进行格式处理,在其前面加上SPI 引导的可以识别的数据表头,是按照(SPI 引导模式的数据结构)和(配置地址域的数据格式)完成的一个SPI 引导配置实例。在这个实例中,将L2CACHE 设为片内RAM,开始地址设为0xc0000000。这一部分空间在处理器内核引导时已经通过TLB 映射,可以直接使用。结论 嵌入式处理器在使用SPI 引导硬件时,先通过片内RAM 运行一段程序,对DDR 内存进行自检,而后再将U-Boot 程序及环境变量引导到DDR 空间,把硬件系统引导起来。通过实例化的应用,证明这在高性价比的嵌入式应用中是一个不错的选择,不仅能提高系统的可靠性,而且简单易行。第三篇:XILINX SPI FLASH烧写流程小结
第四篇:SPI接口软件模拟研究论文
第五篇:嵌入式处理器基于SPI引导的RAM 自检论文