深入理解SPI总线协议

单片机模拟SPI总线-----深入理解SPI总线协议
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的子程序。
[cpp]  view plain  copy
print ?
  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)的输出电平顺序进行相应调整即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘要 在潮流发电项目中,针对控制系统较复杂,机组运行状态监测器连同发电机 组都安装于水下,环境比较恶劣,数据通讯受电力传输干扰较大的特点,研制了 基于工SP/工AP和CAN总线的远程升级系统。该升级系统包括岸站主机、主控器和 被升级系统三部分。岸站主机通过光纤和CAN总线将HEX文件传输给主控器,由 主控器通过工SP或工AP方式完成对被升级系统的升级。 本文所做的主要工作有: (1)硬件设计 使用意法半导体公司的具有Cortex-M3内核的STM32F207作为主控芯片,采 用模块化方式,设计了多MCU升级控制系统。其硬件模块包括看门狗模块、光一CAN 转换模块、电压状态监测模块、开关驱动及逻辑模块、编程接口模块和电源模块。 各个硬件模块相互协作,共同完成整个系统的硬件支撑。 (2)软件设计 为了兼容主要功能与低功耗,在软件方面进行了精心设计。通过将文件传输 过程和工SP/工AP过程分开,有效避免了因数据通道的干扰而导致的升级失败。在 共享CAN总线的条件下,可靠实现了CAN数据传输和多MCU升级功能的统一。本 文对HEX文件格式、CAN应用层协议、数据校验、错误重发机制、工SP/工AP过程 等方面进行了深入研究。 (3)系统验证与总结 根据项目要求,对本系统所实现的功能进行了全面的测试,验证了本系统的 有效性和稳定性。论文最后对研究工作进行了总结,指出了该系统目前仍存在的 问题,并提出了进一步完善的建议和改进方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值