我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 747|回复: 17

[技术文章] 51 单片机模拟 SPI 总线的方法

[复制链接]

该用户从未签到

36

主题

70

回帖

269

积分

二级逆天

积分
269

终身成就奖

发表于 2022-3-14 19:04:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
要:MCS-51系列单片机中由于部分型号不带SPI串行总线接口而限制了其在SPI总线接口器件的使用。文中介绍了SPI串行总线的特征和时序,并以串行E2PROM为例,给出了在51系列单片机上利用I/O口线实现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总线的接口。
回复

使用道具 举报

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 176 天

    [LV.7]常住居民III

    31

    主题

    1万

    回帖

    3万

    积分

    三级逆天

    积分
    34595

    终身成就奖特殊贡献奖原创先锋奖社区居民忠实会员社区劳模最爱沙发原创达人优秀斑竹奖宣传大使奖

    QQ
    发表于 2022-3-14 19:29:48 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    4632

    回帖

    0

    积分

    PADS20200316初级班

    积分
    0

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2022-3-14 22:30:44 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 152 天

    [LV.7]常住居民III

    11

    主题

    7874

    回帖

    5554

    积分

    二级逆天

    积分
    5554

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2022-3-15 00:28:11 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-6-7 09:59
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    6215

    回帖

    1986

    积分

    二级逆天

    积分
    1986

    社区居民终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2022-3-15 06:19:42 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:26
  • 签到天数: 86 天

    [LV.6]常住居民II

    51

    主题

    3999

    回帖

    3146

    积分

    二级逆天

    积分
    3146

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2022-3-15 08:18:03 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    1195

    回帖

    937

    积分

    二级逆天

    积分
    937

    终身成就奖

    发表于 2022-3-15 08:20:10 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    300

    回帖

    0

    积分

    PADS20220105初级班

    积分
    0

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2022-3-15 08:24:35 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    4

    主题

    1318

    回帖

    1225

    积分

    二级逆天

    积分
    1225

    终身成就奖

    发表于 2022-3-15 08:25:42 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    10

    主题

    3481

    回帖

    11

    积分

    二级逆天

    积分
    11

    社区居民终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2022-3-15 08:48:58 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表