24小时热门版块排行榜    

查看: 360  |  回复: 1
当前主题已经存档。

腊月一

铜虫 (初入文坛)


[资源] 【原创】单片机SPI口串行总线

单片机 SPI串行总线 总线接口

1 引言

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总线可以增加应用系统接口器件的种类,提高应用系统的性能。

2 SPI总线的组成

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


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

3 在MCS-51系列单片机中的实现方法

         对于不带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位数据的传送。

         图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为低电平……,则这些子程序也同样用。

3.1 MCU串行输入子程序SPIIN

从X25F008的SPISO线上接收8位数据并放入寄存器R0中的应用子程序如下:

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

CLR    P1.2                     ;选择从机

MOV    R1,#08H               ;置循环次数

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

NOP                           ;延时

NOP

MOV    C,P1.3                  ;从机输出SPISO送进位C

RLC    A                        ;左移至累加器ACC

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

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

MOV     R0,A                ;8位数据送R0

RET

3.2 MCU串行输出子程序SPIOUT

将MCS-51单片机中R0寄存器的内容传送到X25F008的SPISI线上的程序如下:

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

CLR      P1.2              ;选择从机

MOV     R1,#08H          ;置循环次数

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

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

NOP                     ;延时

NOP

RLC    A                 ;左移至累加器ACC最高位至C

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

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

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

RET

3.3 MCU串行输入/输出子程序SPIIO

将MCS-51单片机R0寄存器的内容传送到X25F008的SPI SI中,同时从X25F008的SPI SO接收8位数据的程序如下:

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

CLR      P1.2          ;选择从机

MOV     R1,#08H     ;置循环次数

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

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

NOP                  ;延时

NOP

MOV    C,P1.3        ;从机输出SPISO送进位C

RLC     A            ;左移至累加器ACC最高位至C

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

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

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

RET

4 结束语

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

心得:对于不同的串行接口外围芯片,它们的时钟时序是不同的。对于不同的串行接口外围芯片,它们的时钟时序是不同的。

                 对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口P1.1的初始状态设置为1,而在允许接收后再置P1.1为0。
[search]单片机SPI口串行总线[/search]
http://hi.baidu.com/layueyi/blog

[ Last edited by cuplgz on 2008-2-25 at 19:20 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

haha911

木虫 (小有名气)


这个也能评分?连图都没考过来,明显复制粘贴,况且满大街都是这东西。严重怀疑原创!
2楼2007-08-26 16:39:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 腊月一 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[公派出国] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 jzg3xk1po8 2026-07-31 6/300 2026-08-01 15:46 by y4XuShGyllvT
[考博] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 jzg3xk1po8 2026-07-31 11/550 2026-08-01 15:43 by y4XuShGyllvT
[基金申请] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +3 jzg3xk1po8 2026-07-31 11/550 2026-08-01 15:43 by y4XuShGyllvT
[基金申请] 小木虫看见有人已经知道结果了 +17 1234567wang 2026-07-25 22/1100 2026-08-01 15:43 by iaeyuan
[教师之家] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +3 jzg3xk1po8 2026-07-31 8/400 2026-08-01 15:42 by y4XuShGyllvT
[考研] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 jzg3xk1po8 2026-07-31 11/550 2026-08-01 15:40 by y4XuShGyllvT
[基金申请] 2026年国自然面上资助率 +15 布布和一二 2026-07-30 19/950 2026-08-01 15:18 by 40862026
[基金申请] 微信指数没变化,科研之友没阅读 +14 wangze12014 2026-07-28 18/900 2026-07-31 18:35 by lzchaihuo
[教师之家] 基础研究怎么拉横向,学校到款任务越来越多,难以完成 拉横向,都有哪些途径啊 +8 锦衣卫寒战 2026-07-28 8/400 2026-07-31 18:13 by beefly
[高分子] HXDI做水性聚氨酯乳液,是不是特别容易出渣 15+3 yuyusuv 2026-07-29 3/150 2026-07-31 09:21 by huizingga
[基金申请] 系统今天又提示维护了,估计离放榜不远了 +11 winnerche 2026-07-29 15/750 2026-07-30 23:08 by jnhyjjm
[考博] 申请2027年材料/化学类博士 10+3 考研老狗? 2026-07-25 5/250 2026-07-30 19:33 by 白色木鱼
[基金申请] 你们的时间戳变了吗 +3 archvillain 2026-07-30 4/200 2026-07-30 18:53 by levinzhwen
[基金申请] 今年的WR进展到哪一步了? +5 wsgjhwz 2026-07-25 9/450 2026-07-30 12:59 by 可淡不可忘
[有机交流] 产物和副产物价值比较 30+4 小汤02 2026-07-27 5/250 2026-07-30 12:44 by czyzsu
[有机交流] 这个自发加氧反应的机理是什么? 50+4 YUAN2273 2026-07-25 7/350 2026-07-29 12:27 by xiaobenpu
[基金申请] 这种情况还有戏吗 +5 drbart 2026-07-27 11/550 2026-07-29 05:50 by drbart
[基金申请] 同事接到电话了,我却没有 +4 1234567wang 2026-07-27 4/200 2026-07-28 10:11 by GOODLUCKER
[基金申请] 准备明年的基金了 +5 Tide man 2026-07-27 5/250 2026-07-28 09:25 by newfuzzy1
[分析] 水蒸气蒸馏法乳化现象 +3 月光娇娇 2026-07-26 3/150 2026-07-26 23:25 by caiyun
信息提示
请填处理意见