原创 51 单片机模拟 SPI 总线的方法

2009-8-16 08:25 1327 3 3 分类: MCU/ 嵌入式

发布: 2009-4-04 00:21 |  作者: hnrain |   查看: 19次


  摘要:MCS-51系列单片机中由于部分型号不带SPI串行总线接口而限制了其在SPI总线接口器件的使用。文中介绍了SPI串行总线的特征和时序,并以串行E2PROM为例,给出了在51系列单片机上利用I/O口线实现SPI串行总线接口的方法和软件设计程序。

oT}.`'_8nO2v3re44606 电子园51单片机学习网bME's2`/gW?


`H6oD7nj;?E%m"^44606    关键词:单片机 SPI串行总线 总线接口电子园51单片机学习网W B)q+n:u\8h/a

电子园51单片机学习网 MjgM"{#@1oVg$Q^

 电子园51单片机学习网$sU,FM x

电子园51单片机学习网0z\O'o&B.SFC

1 引言

9|:I9tV)a7wCk44606 电子园51单片机学习网l\~Zl_ AHr

 

^ vXM/P8cW\ X44606 电子园51单片机学习网6U5| g[:dN\#W

SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI总线接口功能的各种I/O器件进行接口,而扩展并行总线则需要8根数据线、8~16位地址线、2~3位控制线,因此,采用SPI总线接口可以简化电路设计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。由此可见,在MCS51系列等不具有SPI接口的单片机组成的智能仪器和工业测控系统中,当传输速度要求不是太高时,使用SPI总线可以增加应用系统接口器件的种类,提高应用系统的性能。电子园51单片机学习网*H#N*}#}"}&b^ q

电子园51单片机学习网~ _,m;Px!y

 电子园51单片机学习网8BXw$qm!JT2x.Q)n2V

电子园51单片机学习网1BVJ uA.T9X.| w

2 SPI总线的组成

j$B,Ijv T44606 电子园51单片机学习网0Sl e V7i|5F

 电子园51单片机学习网#Kgd3Vv;j


L$gV0sU-Ua44606      利用SPI总线可在软件的控制下构成各种系统。如1个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可使用1个MCU作为控机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。其数据的传输格式是高位(MSB)在前,低位(LSB)在后。SPI总线接口系统的典型结构如图1所示。

dea!SV,k)M\W44606

2o8] _,]:Wm44606电子园51单片机学习网o$_,bi)Q j3x
 电子园51单片机学习网,S%aNB7V]1B


S`#m f`ZIp|;|44606 

6p YS"B/i+vF,n44606 电子园51单片机学习网 V-IL GyD

      当一个主控机通过SPI与几种不同的串行I/O芯片相连时,必须使用每片的允许控制端,这可通过MCU的I/O端口输出线来实现。但应特别注意这些串行I/O芯片的输入输出特性:首先是输入芯片的串行数据输出是否有三态控制端。平时未选中芯片时,输出端应处于高阻态。若没有三态控制端,则应外加三态门。否则MCU的MISO端只能连接1个输入芯片。其次是输出芯片的串行数据输入是否有允许控制端。因此只有在此芯片允许时,SCK脉冲才把串行数据移入该芯片;在禁止时,SCK对芯片无影响。若没有允许控制端,则应在外围用门电路对SCK进行控制,然后再加到芯片的时钟输入端;当然,也可以只在SPI总线上连接1个芯片,而不再连接其它输入或输出芯片。电子园51单片机学习网 q9F BI(dU(w-tp P


"jD*H"U];q44606 

?#_^(c1k*v2p44606 电子园51单片机学习网|8p_ AF ]

3 在MCS-51系列单片机中的实现方法电子园51单片机学习网 cDG1X%O'N F oS

电子园51单片机学习网0]@K m;CX

 电子园51单片机学习网TR1r1m'Ev


CI3r"]#TO5lE Dg44606       对于不带SPI串行总线接口的MCS-51系列单片机来说,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。对于不同的串行接口外围芯片,它们的时钟时序是不同的。对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口P1.1的初始状态设置为1,而在允许接收后再置P1.1为0。这样,MCU在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至MCS-51单片机的P1.3口(模拟MCU的MISO线),此后再置P1.1为1,使MCS-51系列单片机从P1.0(模拟MCU的MOSI线)输出1位数据(先为高位)至串行接口芯片。至此,模拟1位数据输入输出便宣告完成。此后再置P1.1为0,模拟下1位数据的输入输出……,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应取串行时钟输出的初始状态为0,即在接口芯片允许时,先置P1.1为1,以便外围接口芯片输出1位数据(MCU接收1位数据),之后再置时钟为0,使外围接口芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。

/REu C)UH,d{_44606 电子园51单片机学习网!{$r |Q n}A

 

c$Mq:N`2PV44606

9N"nA z2m"v"A44606       图2所示为MCS-51系列单片机与存储器X25F008(E2PROM)的硬件连接图,图2中,P1.0模拟MCU的数据输出端(MOSI),P1.1模拟SPI的SCK输出端,P1.2模拟SPI的从机选择端,P1.3模拟SPI的数据输入端(MISO)。下面介绍用MCS-51单片机的汇编语言模拟SPI串行输入、串行输出和串行输入/输出的3个子程序,实际上,这些子程序也适用于在串行时钟的上升沿输入和下降沿输出的其它各种串行外围接口芯片(如A/D转换芯片、网络控制器芯片、LED显示驱动芯片等)。对于下降沿输入、上升沿输出的各种串行外围接口芯片,只要改变P1.1的输出电平顺序,即先置P1.1为低电平,之后再次置P1.1为高电平,再置P1.1为低电平……,则这些子程序也同样用。电子园51单片机学习网hvT E+c1`el/]L


CN;xAjg44606 电子园51单片机学习网0N2_,C5T`3]-sK

电子园51单片机学习网 M&tF!nLi

3.1 MCU串行输入子程序SPIIN

[LX0a2D(sr4C44606 电子园51单片机学习网n z-`\3l

 

]d k{;GT5?44606

9O4[ g)Fl_ {44606从X25F008的SPISO线上接收8位数据并放入寄存器R0中的应用子程序如下:电子园51单片机学习网M?&z:C5Rnb

电子园51单片机学习网(C+X d[dKs

SPIIN:SETB  P1.1           ;使P1.1(时钟)输出为1

dRl,e6s@e(q44606

|eV.pd$\'R$n$e44606CLR  P1.2                   ;选择从机电子园51单片机学习网 ly[ N Y{2? |6B


q y8p7Kx44606MOV  R1,#08H             ;置循环次数电子园51单片机学习网$~)d!avV$nUE LM


(w"j^cZ9xt44606SPIIN1: CLR    P1.1          ;使P1.1(时钟)输出为0电子园51单片机学习网ojZh-V*R

电子园51单片机学习网p(]9a|L o$`"[;E

NOP                         ;延时电子园51单片机学习网z)W_!m8p3g#e&ZP

电子园51单片机学习网L f.j;M n

NOP电子园51单片机学习网 m1` e:PGd"m(R(x4y$~


:aqO7o6`)x(C d44606MOV  C,P1.3                ;从机输出SPISO送进位C

eCS[U8w0k({44606 电子园51单片机学习网"T]Q6T"[7V^4F$m-N

RLC  A                      ;左移至累加器ACC

%G?,}U_[44606 电子园51单片机学习网3{:|%]xSd z

SETB   P1.1                ;使P1.0(时钟)输出为1电子园51单片机学习网%b!L8l(Nd


Qi Q!Uo Q.g44606DJNZ   R1,SPIIN1           ;判断是否循环8次(8位数据)

W5Rg K[~.sxQL44606 电子园51单片机学习网w XXh9V [ M$Rb

MOV   R0,A              ;8位数据送R0

$O7[7w R/t O8M*_4Nz44606 电子园51单片机学习网5EX1M)c$`5s ^

RET

7l}6P!Y'o;y44606 电子园51单片机学习网9w[l)t Lp2p/GxW.z

3.2 MCU串行输出子程序SPIOUT

zu\'K6C c$u44606 电子园51单片机学习网dr"Y%m1\3I v6~ c

将MCS-51单片机中R0寄存器的内容传送到X25F008的SPISI线上的程序如下:电子园51单片机学习网%]}"q?m&]&y


9H KF A`Um*zsrP44606SPIOUT:SETB  P1.1    ;使P1.1(时钟)输出为1

bQc*fc2O44606

nY,~ E4wF44606CLR    P1.2            ;选择从机

+j3j#~*k0R MhW0z1@G44606

\[ f z4l3Y44606MOV   R1,#08H        ;置循环次数电子园51单片机学习网0@H;`2X ~3L/b

电子园51单片机学习网8\J2@mGM I r V O

MOV   A,R0           ;8位数据送累加器ACC

RWd W `B ^@1W#e$f44606 电子园51单片机学习网6F"d/AC,p6u_

SPIOUT1:CLR  P1.1   ;使P1.1(时钟)输出为0

1j_Gh(|9M)g{zY44606 电子园51单片机学习网D%kr s a8V n+Z

NOP                   ;延时

E6?Isj44606

]"B1k pic44606NOP

q9^%p&ol4O44606 电子园51单片机学习网NI0Z)cp+U

RLC  A               ;左移至累加器ACC最高位至C电子园51单片机学习网(H't8sw4u9G D

电子园51单片机学习网+w,V%YPm

MOV   P1.0,C        ;进位C送从机输入SPISI线上

;l~%O;i7m;~44606

w }1d+pgGr44606SETB   P1.1           ;使P1.1(时钟)输出为1电子园51单片机学习网$|7x(S$o ^j&`

电子园51单片机学习网?-b#BXq$G'Tf

DJNZ   R1,SPIOUT1   ;判是否循环8次(8位数据)电子园51单片机学习网Vd,D u*Kyp%o

电子园51单片机学习网*s8_QSEQ7_q

RET电子园51单片机学习网5Vl6Pg-i _gds

电子园51单片机学习网BjU/{1IQ jw

 电子园51单片机学习网l(rS` G3K aP


.e X3d'v4q6v,lL*p446063.3 MCU串行输入/输出子程序SPIIO电子园51单片机学习网8A0GiDu4qq2g

电子园51单片机学习网9\ z9m0D)Q)d5c;m)N

将MCS-51单片机R0寄存器的内容传送到X25F008的SPI SI中,同时从X25F008的SPI SO接收8位数据的程序如下:电子园51单片机学习网8M1k}(V"`#|h(c

电子园51单片机学习网n(kIW$\ c@:Y$}

SPIIO:SETB  P1.1  ;使P1.1(时钟)输出为1电子园51单片机学习网#Xx})ST+qg9W3~r


N1P {3M*D44606CLR    P1.2        ;选择从机电子园51单片机学习网 VC$S({*a @'?2i9_M'W

电子园51单片机学习网'] H+w_L"A,~3A[

MOV   R1,#08H   ;置循环次数电子园51单片机学习网-L/@'p&Y2zZ

电子园51单片机学习网QjQq5E-|U

MOV   A,R0      ;8位数据送累加器ACC电子园51单片机学习网Z.N)h'u"E{^4MN

电子园51单片机学习网&_6[^`&w/h \

SPIIO1:CLR  P1.1  ;使P1.1(时钟)输出为0电子园51单片机学习网e!z.J2H}5@%x{\6u


[l riK3oh44606NOP                ;延时电子园51单片机学习网W)d4R'kK I&PqV l


B8M!Z$K5D44606NOP电子园51单片机学习网` k_ \@y3T V m


)}8j%ASg?B]u44606MOV  C,P1.3      ;从机输出SPISO送进位C

#As^X N]r44606 电子园51单片机学习网1kI$o6AR @NU&k2v&W

RLC   A          ;左移至累加器ACC最高位至C电子园51单片机学习网 _:e qb5A


iwW"Gsq6^L*J ])B44606MOV  P1.0,C     ;进位C送从机输入电子园51单片机学习网})|*C,~%T#x*IW7Q


'a'j'jx4EH X44606SETB  P1.1        ;使P1.1(时钟)输出为1

ff']#qw2vC)}:W-}44606 电子园51单片机学习网6F2n"`N-ard4H(S

DJNZ  R1,SPIIO1 ;判断是否循环8次(8位数据)

$H M6Q(m%C.wO8W"jzA44606 电子园51单片机学习网-Skk)Wm.?Kt

RET电子园51单片机学习网Re_5o)?N/F%{

电子园51单片机学习网v.G2AQ)I)IC l d

 

|&a*n2^Rz&m0L44606

IPXl*t`+W[ Q446064 结束语电子园51单片机学习网 pL'O {~


8_ g4c8sm Yl5D44606 电子园51单片机学习网/o [2W_9E%]w


u ^M9M!u y\tR(g44606      本文介绍了通过SPI总线接口实现数据传输的实现方法,给出了用MCS-51单片机汇编语言模拟SPI串行总线的输入、输出,输入/输出以传送8位数据的子程序。实际上,也可以根据SPI串行总线的操作时序特点来在MCS-96系列、ATMEL89系列等单片机上实现SPI总线的接口。

V'{jG)t b.G c R\/g4cN44606
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条