串行通信SPI总线的详解分析

描述

  SPI(Serial Peripheral Interface)总线系统是一种同步串行外设接口,可以是MCU与各种外围设备以串行方式进行通信以交换信息,该接口一般使用4条线:串行时钟线(SCLK)、主入从出数据线(MISO)、主出从入数据线(MOSI)和低电平有效的从机选择线(SS);其主要特点包括:可以同时发出和接收船型数据;可以作为主机或从机工作;发送结束中断标志;写冲突保护和总线竞争保护。
SPI总线架构示意图:
时钟
  SPI是一个环形总线结构,有SS、SCK、SDI、SDO组成,在主设备和从设备之间进行双向传输,实现发送和接收数据,最高速率可达5Mbps。由SS信号来选定主设备通信的从设备,在某时间点内主设备和从设备之间可以实现点对点通信,不需要进行寻址操作。SPI共有4种工作模式,SP0、SP1、SP2、SP3,其中比较常用的是SP0、SP3。为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行设置。
  如果时钟极性CPOL=0,则串行同步时钟的空闲状态为低电平;如果时钟极性CPOL=1,则串行同步时钟的空闲状态为高电平。
  如果时钟相位CPHA=0,则在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果时钟相位CPHA=1,则在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设时钟相位和极性应该一致。
SPI总线4中工作模式的SCK示意:
时钟
  SPI主要工作时序是在SCK的控制下,两个双向移位寄存器进行数据交换。
  假设下面的8位寄存器装的是待发送的数据1010 1010,上升沿发送,下降沿接收,高位先发送。那么第一个上升沿来的时候数据将会是sdo=1,寄存器=0101 010x;下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101 010sdi,这样在8个时钟脉冲以后,两个寄存器的内容相互交换一次,从而完成了一个spi时序。
时钟
时钟
  硬件SPI方式:
  (1)写一个字节:
  SPI_Writebyte(u8 data)
  {
  While(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);//等待发送缓冲区为空
  SPI_I2S_SendData(SPI1,Data);
  While(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);//等待接收到一个字节数据
  SPI_I2S_ReceiveData(SPI1);
  }
  (2)读一个字节:
  SPI_Readbyte(u8 data)
  {
  While(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);//等待发送缓冲区为空
  SPI_I2S_SendData(SPI1,Data);
  While(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);//等待接收到一个字节数据
  return SPI_I2S_ReceiveData(SPI1);
  }
  解析:当不使用FIFO时,只有一个中断,接收和发送共用一个,因为发送和接收是同时完成的:例如主机上升沿发送下降沿接收,那么从机就是上升沿接收下降沿发送,所以一串时钟之后,主机发送完了数据,从机也发送完了数据。
  软件SPI:
时钟
时钟
时钟
时钟
时钟

时钟
  软件SPI方式和硬件SPI方式的区别:
  1.硬件SPI效率高些,编写程序时只需把要发送的数据写到寄存器中,硬件自动进行发送;软件SPI需要根据时序实现时钟拉高拉低,串行数据输出等。
  2.硬件SPI必须要求处理器支持该功能;而软件SPI不需要特定要求,一般的IO口就可以使用
  3.硬件SPI传输速度可以达到3Mbps,软件SPI传输速度一般700K左右。
  总结:在使用SPI时,根据实际情况选择使用硬件SPI,还是软件SPI,注意在使用时确保时序的准确性。


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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分