房县建设局网站,深圳专业网站建设公,个人制作网站多少钱,广州公司注册流程和条件SPI通信 SPI#xff0c;#xff08;serial peripheral interface#xff09;#xff0c;字面翻译是串行外设接口#xff0c;是一种通用的数据总线#xff0c;适用于主控和外挂芯片之间的通信#xff0c;与IIC应用领域非常相似。 IIC无论是在硬件电路还是在软件时序设计…SPI通信 ·SPIserial peripheral interface字面翻译是串行外设接口是一种通用的数据总线适用于主控和外挂芯片之间的通信与IIC应用领域非常相似。 ·IIC无论是在硬件电路还是在软件时序设计的都是较为复杂的硬件上需要配置成开漏外加上拉的模式软件上需要一根数据线兼顾数据收发、应答位收发、寻址机制的设计等等使得IIC的性价比极高可以在消耗最低硬件资源的情况下实现最多的功能。在硬件上无论挂载多少个设备128最多都只需要两根通讯线在软件上数据双向通信、应答位都可以实现。IIC既实现硬件上最少的通信线又实现软件上最多的功能。 但是IIC的缺点在于IIC开漏外加上拉电阻的电路结构使得通讯线高电平的驱动能力较弱会导致通信线由低电平到高电平的时候上升沿会比较长会最大限制IIC的通信速度所以IIC的标准模式只有100KHz的时钟频率快速模式也只有400KHz虽然后边改进电路设计出了高速模式可达3.4MHz但是普及程度不高一般情况下认为IIC时钟速度最高400KHz相比SPI慢很多。 ·SPI传输比IIC更快SPI协议没有严格规定最大传输速度最大传输速度取决于芯片厂商的设计需求比如 W25Q64 存储器芯片手册中写最大时钟频率可达80MHz比stm32f1的主频还高。SPI硬件通信线比较多通信过程中常有资源浪费的现象。 ·SPI有四根通信线分别是SCKserial CLOCK串行时钟线、MOSImaster output slave input主机输出从机输入、MISOmaster input slave output主机输入从机输出、SSslave select从机选择 ·通信线名字的额外表述方式 SCKSCLK、CLK、CK MOSI:DO( DATA OUTPUT ) MISO:DI( DATA INPUT ) SS:NSS( NOT SLAVE SELET )、CS( CHIP SELECT ) ·同步SCK引脚用于提供时钟信号数据位的输出和输入都是在SCK的上升沿或下降沿进行数据位的收发时刻因此得以确定。同步时序下时钟快慢或中途暂停都没问题。SCK相当于IIC通信下的SCL作用相同。 ·全双工数据发送和数据接收单独各占一条线发送用发送的线路接收用接收的线路互不影响。MOSI如果是主机接在上面那就是MO主机输出如果是从机接在这条线上就是MI从机输入。一条通信线如果主机接在上面配置为输出从机必须配置为输入才能接收数据主机和从机不能同时配置为输出和输入会造成无法通信。同理MISO是主机从从机接收数据的线路。这两根通信线加在一起相当于IIC通信的SDA不过IIC是半双工。全双工的好处是简单高效数据流方向不会改变无需担心发送和接收没协调好冲突但是多了一根线造成了资源的浪费。 ·一主多从SPI仅支持一主多从IIC实现一主多从的方式是在起始条件之后主机必须先发送一个字节进行寻址用于规定要和哪个从机进行通信要设计分配地址和寻址的问题。SPI实现一主多从的方式通过开辟多条通信线用于和从机通信有几个从机就对应有几条SS需要找哪个从机的时候就控制信号线为低电平不需要时信号线为高电平。SPI没有应答机制是否具有接收方无法得知。
硬件电路 这个图是SPI的一个典型电路左边是SPI主机主导整个SPI总线一般是用控制器做主机如stm32由于有3个从机所以SS有3根加上SCK、MOSI、MISO共6根由于SPI所有通信线都是单端信号高低电平都是相对于GND的电压差单端信号所有的设备需要共地图中未画出但是必须要接。如果从机没有独立供电的情况下主机需引出VCC给从机供电。 SCK时钟线完全由主机掌控对主机来说时钟线为输出对于所有主机来说时钟线都为输入主机的同步时钟将送到各个从机。 主机的SS线都是输出从机的SS都是输入SS线是低电平有效主机在指定从机时只需将SS置低电平即可。主机初始化之后所有的SS都输出高电平谁也不指定当需要和从机1进行通信时就把SS1线输出低电平此时主机在数据引脚进行的传输只有从机1会响应当主机和从机1通信完成之后将会把SS1置回高电平结束通信。 输出引脚配置为推挽输出因为推挽输出在高低电平均具有较强的驱动能力这将是的SPI引脚信号的下降沿非常迅速上升沿也非常迅速不像IIC下降沿迅速上升沿缓慢。得益于推挽输出的驱动能力SPI信号变化的快能达到更高的传输速度MHz级别。 IIC由于要实现半双工经常需要切换输入输出还要实现多主机的时钟同步和总线仲裁这些功能都不允许IIC使用推挽输出易造成电源短路。IIC选择了更多的功能因此只能放弃更强的性能。 SPI的MISO引脚中主机一个是输入三个从机都是输出如果三个从机始终都是推挽输出将会导致冲突因此SPI协议中有一个规定当从机的SS引脚为高电平即从机未被选中时它的MISO引脚需切换为高组态相当于引脚断开不输出任何电平以防止一条线有多个输出导致电平冲突只有当SS为低电平时MISO才允许变为推挽输出。由于这个切换过程都在从机里进行一般我们写的是主机的程序主机的程序中也无需关心此问题。
移位示意图核心 SPI的基本收发电路使用了图示的移位模型左边是SPI的主机内置一个8为的移位寄存器右边是SPI从机同样是8位的移位寄存器。在移位寄存器下方有一个时钟输入端SPI一般是高位先行每来一个时钟移位寄存器都会向左进行移位从机中的移位寄存器同理。移位寄存器的时钟源是由主机提供的在这里叫做波特率发生器产生的时钟驱动主机的移位寄存器进行移位同时这个时钟通过SCK引脚进行输出接到从机的移位寄存器里。 移位寄存器的接法是主机移位寄存器左边移出去的数据通过MOSI引脚输入到从机移位寄存器的右边从机移位寄存器左边移出去的数据通过MISO引脚输入到主机移位寄存器的右边组成一个圈。
发送同时接收 电路的工作流程首先规定波特率时钟的上升沿所有移位寄存器向左移动一位移出去的位放在引脚上波特率时钟的下降沿时引脚上的位采样输入到移位寄存器的最低位。 假设主机有个数据1010 1010要发送到从机同时从机有个数据0101 0101要发送到主机那么可以先驱动时钟产生一个上升沿这时所有的位将会向左移动一次从最高位移出去的数据将会放在通信线上实际上是放在了输出寄存器MOSI数据是1即MOSI的电平是高电平MISO的数据是0所以MISO的电平是低电平。第一个时钟沿就是把主机和从机中移位寄存器的最高位分别放到MOSI和MISO的通信线上这是数据的输出的部分。 之后时钟继续运行上升沿之后下一个边沿就是下降沿在下降沿时主机和从机内都会进行数据采样输入也就是MOSI里的1会采样输入到从机里的最低位。 在下一个上升沿进行同样的操作移位输出主机现在的最高位也就是原始数据的次高位输出到MOSI从机现在的最高位输出到MISO随后下降沿数据采样输入 MISO数据到从机寄存器的最低位MISO数据到主机寄存器的最低位 第三个时钟开始 一直到第八个时钟都是一样的过程最终八个时钟过后得到如下结果原本主机的1010 1010跑道从机里边原来从机里的0101 0101跑到了主机里实现了主机和从机一个字节数据的交换。 以上就是SPI的运行过程SPI的数据收发都是基于字节交换这个基本单元进行当主机需要发送一个字节同时接收一个字节时就可以执行字节交换的时序主机要发送的数据跑到从机主机要从从机接收的数据跑到主机完成了发送同时接收的目的。
只发送不接收 如果想只发送不接收仍然可以调用交换字节的时序发送同时接收不过不看接收到的数据即可指向接收不发送同理调用交换字节的时序发送同时接收不过会随便发送一个数据目的是为了将从机的数据置换过来即可读取置换后的数据就相当于接收随意发送的数据从机并不会进行读取不过这个随便的数据并不是真的随便会统一发送0x00或0xff去和从机换数据。
SPI时序基本单元 起始条件SS从高电平切换到低电平是左边的图SS是低电平有效SS从高变到低代表着选中了某一个从机也是通信的开始 终止条件SS从低电平切换到高电平是右边的图SS从低电平变到高电平就是结束了从机的选中状态通信结束。 在从机的选中的整个过程中SS要一直保持低电平。
模式1 这个基本单元建立在上边的移位模型上。基本单元中在上升沿开始移位还是下降沿移位SPI并没有限制死给予可配置的选择以兼容更多的芯片。这里SPI有两个可以配置的位分别是CPOLClock Polarity时钟极性CPHAClock phase时钟相位每一位可配置为1或0 总共组合起来有模式0、1、2、3共四种模式模式虽多但功能一样模式1接近于上边的知识内容。 时序的基本内容是交换一个字节CPOL0代表空闲状态时SCK为低电平在SS未被选中时SCK默认低电平CPHA1表示SCK第一个边沿移出数据第二个边沿移入数据。 时序图中SS从机选择通信开始之前SS为高电平通信过程中SS始终保持低电平通信结束SS恢复高电平 最下边的MISO主机输入从机输出多个从机连在一起如果同时开启输出会造成冲突解决方法是在SS未被选中的状态下从机的MISO引脚需关断输出即配置为高阻态输出状态如图位于中间电平的为高阻态SS下降沿之后从机的MISO被允许开启输出SS上升沿之后从机的MISO必须置回高阻态。 移位传输因为CPHA1SCK第一个边沿移出数据图中可见SCK第一个触发沿是上升沿主机和从机同时移出数据主机通过MOSI移出最高位此时MISO的电平就代表了主机要发送的数据B7从机通过MOSI移出最高位此时MISO表示从机要发送的数据B7。时钟运行产生下降沿此时主机和从机同时移入数据即进行数据采样。主机移出的B7进入从机移位寄存器的最低位从机移出的B7进入主机移位寄存器的最低位当一个时钟脉冲产生完毕时一个数据传输完毕后边的数据交换同理直到最后一个下降沿数据B0传输完成主机和从机完成一个字节的数据交换如果只想交换一个字节数据接下来就可以将SS置高电平结束通信。 在SS的上升沿MISO还可以再进行变化将MOSI置默认的高电平or低电平也可以不管因为SPI没有规定MOSI的默认电平MISO从机必须置回高阻态。如果此时主机的MISO位上拉输入的话那MISO的引脚就是默认的高电平如果主机的引脚为浮空输入那MISO的引脚电平不确定。如果主机还想进行数据交换则不必把SS置回高电平直接重复交换一个字节的时序即可。
模式3与模式1对比 模式1和模式3的区别模式1的CPOL0模式3的CPOL1两者的波形区别在于SCK的极性取反其他地方没区别。
模式0应用最多 模式0的CPHA0在时序上的区别在于模式0的数据移出移入的时机会提前半个时钟也就是相位提前。第一个边沿移入数据第二个边沿移出数据但是数据是需要先移出才能移入的所以SCK在第一个边沿之前就要提前移出数据或者说是在第0个边沿移出第一个边沿移入。 首先SS下降沿开始通信SCK还没有变化但是SCK一旦开始变化就要移入数据。趁SCK还没变化在SS下降沿时就要立刻触发移位输出所以图中MISO和MOSI的输出是对齐到SS的下降沿或者说SS的下降沿也被当做时钟的一部分。 SS下降沿触发了输出SCK上升沿就可以采样输入数据了这样B7传输完毕。接下来SCK下降沿移出B6SCK上升沿移入B6后边持续下降沿移出数据上升沿移入数据最终在第八个上升沿时B0位移入完成整个字节交换完成。之后SCK还有一个下降沿如果主机只需要交换一个字节就结束那么在下降沿时MOSI可以置回低电平或者不管MISO也会变化一次变化的那个地方对应的是下一个字节的B7因为相位提前了所以下一个字节的B7会提前露头如果不需要转换多个字节的话SS上升沿之后从机置回高阻态交换一个字节结束。如果需要转换多个字节的话就继续调用交换字节的时序在最后一个下降沿主机和从机都放下一个字节的B7SCK上升沿正好接着采样第二个字节的B7拼接上时序。 模式0和模式1的区别在于模式0把数据变化的时机给提前了实际应用中模式0应用最多后续程序均以模式0为主。
模式2与模式0对比 模式2与模式0的区别在于模式0的CPOL0模式2的CPOL1两者的波形就是SCK的极性取反剩下的流程完全一致
总结 CPHA表示的是时钟相位决定是第一个时钟采样移入还是第二个时钟采样移入并不是规定上升沿采样还是下降沿采样。在CPOL确定的情况下CPHA会改变采样时刻的上升沿和下降沿比如模式0的时候是SCK上升沿采样移入模式1的时候是SCK下降沿采样移入。CPHA决定是第几个边沿采样但不能单独决定是上升沿还是下降沿。模式0和3都是上升沿采样模式1和2都是下降沿采样。