0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用单片机的I/O口通过软件模拟SPI总线的实现方法

GReq_mcu168 来源:玩转单片机 2020-09-02 11:23 次阅读

SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器控制器和外围扩展芯片之间的串行连接,现已发展成为一种工业标准,目前,各半导体公司推出了大量的带有SPI接口的具有各种各样功能的芯片,如RAM,EEPROM,FlashROM,A/D转换器、D/A转换器、LED/LED显示驱动器、I/O接口芯片、实时时钟UART收发器等等,为用户的外围扩展提供了极其灵活而价廉的选择。由于SPI总线接口只占用微处理器四个I/O口线,采用SPI总线接口可以简化电路没计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。

现以 AT89C205l单片机模拟SPI总线操作串行EEPROM 93CA6为例,如图1所示,介绍利用单片机的I/O口通过软件模拟SPI总线的实现方法。在这里,仅介绍读命令的时序和应用子程序。

93C46存储器SPI总线的工作原理

93CA6作为从设备,其SPI接口使用4条I/O口线:串行时钟线(SK)、输出数据线DO、输入数据线DI和高电平有效的从机选择线CS。其数据的传输格式是高位(MSB)在前,低位(LsB)在后。93C46的SPI总线接口读命令时序如图2所示。

软件模拟SPI接口的实现方法

对于不带SPI串行总线接口的AT89C2051单片 机来说,可以使用软件来模拟SPI的操作,图1所示 为AT89C2051单片机与串行EEPROM 93C46的硬件 连接图,其中,P1.0模拟SPI主设备的数据输出端 SDO,P1.2模拟SPI的时钟输出端SCK,P1.3模拟 SPI的从机选择端SCS,P1.1模拟SPI的数据输入 SDI
上电复位后首先先将P1.2(SCK)的初始状态设置为0(空闲状态)。
读操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(10),6位被读的数据地址(A5A4A3A2A1A0),然后通过P1.1口读1位空位(0),之后再读l6位数据(高位在前)。
写操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(01),6位被写的数据地址(A5A4A3A2A1A0),之后通过P1.0口发送被写的l6位数据(高位在前),写操作之前要发送写允许命令,写之后要发送写禁止命令。
写允许操作(WEN)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(11XXXX)。 写禁止操作(WDS)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(00XXXX)。

下面介绍用C51模拟SPI的子程序。

1. //首先定义好I/O口 2. sbit SDO=P1^0;3. sbit SDI=P1^1;4. sbit SCK=P1^ 2;5. sbit SCS=P1^3;6. sbit ACC_7= ACC^7;7. unsigned int SpiRead(unsigned char add) 8. { 9. unsigned char i;10. unsigned int datal6;11. add&=0x3f;/*6位地址*/ 12. add |=0x80;/*读操作码l0*/ 13. SDO=1;/*发送1为起始位*/ 14. SCK=0;15. SCK=1;16. for(i=0;<8;i++)/*发送操作码和地址*/ 17. { 18. if(add&0x80==1) 19. SDO=1;20. else 21. SDO=0;22. SCK=0;/*从设备上升沿接收数据*/ 23. SCK=1;24. add<<= 1;25. } 26. SCK=1;/*从设备时钟线下降沿后发送数据,空读1位数据*/ 27. SCK=0;28. datal6<<= 1;/*读16位数据*/ 29. for(i=0;<16;i++) 30. { 31. SCK= 1;32. _nop_();33. if(SDI==1) 34. datal6|=0x01;35. SCK =0;36. datal6< < =1;37. } 38. return datal6;39. }  对于不同的串行接口外围芯片,它们的时钟时序是不同的。上述子程序是针对在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件。这些子程序也适用于在串行时钟)的上升沿输入和下降沿输出的其它各种串行外围接口芯片,只要在程序中改变P1.2(SCK)的输出电平顺序进行相应调整即可。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5997

    文章

    43947

    浏览量

    620538
  • 微处理器
    +关注

    关注

    11

    文章

    2107

    浏览量

    81373
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1610

    浏览量

    89538

原文标题:单片机软件模拟SPI接口

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    应用方案:MCU通用I/O引脚扩展

    MCU通用I/O引脚扩展 低端MCU由于I/O数量不足导致部分功能无法实现,用户需要使用数字集
    发表于 01-08 09:35

    ad7779数据输出接口和单片机该怎样连接?采用哪种通信协议来接收数据?

    AD7779有两种不同接口:SPI和数据输出接口。问题1:数据输出接口和单片机该怎样连接,到底采用哪种通信协议来接收数据?I/O?USAR
    发表于 12-07 07:42

    利用单片机430_5324的SPI配置AD9517,配置不成功的原因?

    各位专家好: 我使用AD9517-4时钟芯片产生LVDS差分时钟以供AD9653使用,现在AD9517-4使用外部采样时钟80M,通过使用AD9517软件得到AD9517寄存器的配置表,利用
    发表于 11-16 07:42

    FPGA和单片机的区别

    单片机和FPGA的区别 FPGA更偏向于硬件电路,是用来设计芯片的芯片(FPGA)。通过硬件编程语言在FPGA芯片上自定义集成电路的过程; 单片机偏向于软件,是在已有的固化电路的芯片(
    发表于 11-14 15:30

    单片机spi接口的使用方法有哪些(spi接口和串口的区别)

    如果单片机没有硬件SPI模块,或者需要额外的IO引脚来实现多个SPI设备的通信,可以使用软件SPI
    的头像 发表于 11-10 16:38 1492次阅读

    怎么实现两个单片机模拟串口通信?

    怎么实现两个单片机模拟串口通信,用I/O和外部中断,时序编程求代码
    发表于 11-03 07:34

    如何连接两个单片机实现IO模拟数据的接受发送?

    如何连接两个51单片机实现IO模拟数据的接受发送
    发表于 11-03 06:56

    SPI总线在51系列单片机系统中的实现

    电子发烧友网站提供《SPI总线在51系列单片机系统中的实现.pdf》资料免费下载
    发表于 10-13 11:32 0次下载
    <b class='flag-5'>SPI</b><b class='flag-5'>总线</b>在51系列<b class='flag-5'>单片机</b>系统中的<b class='flag-5'>实现</b>

    单片机软件模拟SPI接口的解决方案

    电子发烧友网站提供《单片机软件模拟SPI接口的解决方案.pdf》资料免费下载
    发表于 10-13 11:31 2次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>软件</b><b class='flag-5'>模拟</b><b class='flag-5'>SPI</b>接口的解决方案

    基于单片机软件实现直流电机PWM调速系统

    介绍了基于单片机用PWM实现直流电机调整的基本方法,直流电机调速的相关知识,及PWM调整的基本原理和实现方法。重点介绍了基于MCS一51
    发表于 09-22 07:56

    如何利用单片机、buck电路实现恒流充电?

    如何利用单片机、buck电路实现恒流充电? 恒流充电是一种常用的电池充电方式,它通过向电池提供恒定的电流来充电,并可以在一定程度上提高电池的充电效率和充电时间。在实际应用中,
    的头像 发表于 09-12 15:26 2633次阅读

    如何使用MCU通过spi的方式同时控制多个从设备?

    )、PA7(MOSI)引脚分别连接5个adc的对应引脚; 利用stm32的5个GPIO分别作为连接5个adc的MISO引脚; 使用该方法可以控制adc,但是由于gpio模拟
    发表于 08-08 07:26

    89c51单片机模拟i2c总线怎么实现一主多从呢?

    i2c总线上,连接多个89C51,把一个89C51做为主控器,其他的作为被控器,能否实现一个单片机控制多个单片机的功能,如果能,该如何
    发表于 05-08 18:05

    STC单片机模拟I2C总线上数据传送速率能达到12M吗?

    STC单片机模拟I2C总线上数据传送速率能达到12M吗?
    发表于 05-08 17:44

    在使用proteus软件进行51单片机仿真时,要给单片机4O引脚添加ⅤCC电源吗?

    在使用proteus软件进行51单片机仿真时,要给单片机4O引脚添加ⅤCC电源吗?
    发表于 04-24 17:00