SPI总线协议-一篇文章带你了解
 2020.09.05    |      嵌入式学习    |     AilsonJack    |     暂无评论    |     561 views
By: Ailson Jack
Date: 2020-09-05
个人博客: http://www.only2fire.com/
<p class="artical_littlestyle1">1.SPI总线概述</p><p style="text-indent: 2em;">SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。主要应用在EEPROM,FLASH,实时时钟,AD转换器,数字信号处理器和数字信号解码器等设备与MCU之间进行通信。</p><p style="text-indent: 2em;">SPI具有通信简单,支持全双工通信,数据传输速度快的优点。但是由于SPI没有指定的流控制,没有应答机制确认数据是否发送或接收成功,所以SPI总线跟IIC总线比较的话,SPI总线在数据可靠性上有一定的缺陷。<br/></p><p class="artical_littlestyle2">2.SPI信号线</p><p style="text-indent: 2em;">SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备。SPI使用3条通讯总线和1条片选线。<br/>(1).MOSI<br/></p><p style="text-indent: 2em;">主设备数据输出,从设备数据输入。<br/>(2).MISO<br/></p><p style="text-indent: 2em;">主设备数据输入,从设备数据输出。<br/>(3).SCLK(或叫SCK)<br/></p><p style="text-indent: 2em;">时钟信号线,用于通讯同步,该信号由主机产生和控制。<br/>(4).CS<br/></p><p style="text-indent: 2em;">片选线,从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时就需要设置从设备对应的片选引脚,来使能从设备。<br/></p><p style="text-indent: 2em;">SPI通讯设备之间的连接方式,如下图所示:</p><p style="text-align:center"><img src="/uploads/AilsonJack/2020.09.05/1599296827605000.gif" onclick="preview_image(&#39;/uploads/AilsonJack/2020.09.05/1599296827605000.gif&#39;)"/></p><p class="artical_littlestyle3">3.SPI总线的4种通讯模式</p><p style="text-indent: 2em;">SPI通信有4种不同的通讯模式,不同的从设备可能在出厂时就配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式。<br/></p><p style="text-indent: 2em;">MOSI和MISO线在SCK的每个时钟周期传输一位数据,开发者可以自行设置MSB或LSB先行,不过需要保证两个通讯设备都使用同样的协定。<br/></p><p style="text-indent: 2em;">时钟极性CPOL是用来配置SCK空闲状态的电平,时钟相位CPHA是用来配置数据采样是在第几个边沿。<br/>CPOL=0,表示当SCK=0时处于空闲态,所以有效状态就是SCK处于高电平时;<br/>CPOL=1,表示当SCK=1时处于空闲态,所以有效状态就是SCK处于低电平时;<br/>CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿;<br/>CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿;<br/></p><p style="text-indent: 2em;">CPOL和CPHA进行组合配置之后产生四种时序关系,也就是四种通讯模式。<br/></p><p style="text-indent: 2em;">四种通讯模式文字描述如下:<br/></p><p style="text-indent: 2em;">CPOL=0,CPHA=0:此时空闲态时,SCK处于低电平,数据采样是在第1个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。<br/></p><p style="text-indent: 2em;">CPOL=0,CPHA=1:此时空闲态时,SCK处于低电平,数据发送是在第1个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。<br/></p><p style="text-indent: 2em;">CPOL=1,CPHA=0:此时空闲态时,SCK处于高电平,数据采集是在第1个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。<br/></p><p style="text-indent: 2em;">CPOL=1,CPHA=1:此时空闲态时,SCK处于高电平,数据发送是在第1个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。</p><p style="text-align:center"><img src="/uploads/AilsonJack/2020.09.05/1599296827489202.gif" onclick="preview_image(&#39;/uploads/AilsonJack/2020.09.05/1599296827489202.gif&#39;)"/></p><p style="text-indent: 2em;">下面的表格是对上述描述的SPI四种通讯模式的总结:</p><table><tbody><tr class="firstRow"><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">SPI模式<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">CPOL<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">CPHA<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">SCK空闲时电平<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">数据采样<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">数据发送<br/></td></tr><tr><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">0<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">0<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">0<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">低电平<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">第1个边沿<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">第2个边沿<br/></td></tr><tr><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">1<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">0<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">1<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">低电平<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">第2个边沿<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">第1个边沿<br/></td></tr><tr><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">2<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">1<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">0<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">高电平<br/></td><td style="border-width: 1px; border-right-style: solid; border-bottom-style: solid; word-break: break-all;" width="163" valign="middle" align="center">第1个边沿<br/></td><td style="border-width: 1px; border-right-style: solid; border-bottom-style: solid; word-break: break-all;" width="163" valign="middle" align="center">第2个边沿<br/></td></tr><tr><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">3<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">1<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">1<br/></td><td style="border-width: 1px; border-style: solid; word-break: break-all;" width="163" valign="middle" align="center">高电平<br/></td><td style="border-width: 1px; border-right-style: solid; border-bottom-style: solid; word-break: break-all;" width="163" valign="middle" align="center">第2个边沿<br/></td><td style="border-width: 1px; border-right-style: solid; border-bottom-style: solid; word-break: break-all;" width="163" valign="middle" align="center">第1个边沿<br/></td></tr></tbody></table><p style="text-indent: 2em;">模式0和模式3的差异主要是,模式0的SCK空闲电平是低电平,模式3的SCK空闲电平是高电平。因为模式0的SCK空闲电平是低电平,数据采样发生在SCK的第1个边沿,也就是SCK的上升沿,数据发送发生在SCK的第2个边沿,也就是SCK的下降沿。同样的因为模式3的SCK空闲电平是高电平,数据采样发生在SCK的第2个边沿,也就是SCK的上升沿,数据发送发生在SCK的第1个边沿,也就是SCK的下降沿。<br/></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">从上面一段文字,可以对模式0和模式3进行一个总结:模式0和模式3的主要差异是SCK空闲电平的状态不一样,模式0的SCK空闲电平是低电平,模式3的SCK空闲电平是高电平;模式0和模式3都在SCK的上升沿进行数据采样,在SCK的下降沿进行数据发送。<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">同样的,可以对模式1和模式2进行一个总结:模式1和模式2的主要差异是SCK空闲电平的状态不一样,模式1的SCK空闲电平是低电平,模式2的SCK空闲电平是高电平;模式1和模式2都在SCK的下降沿进行数据采样,在SCK的上升沿进行数据发送。</span><br/></p>
欢迎关注博主的公众号呀,精彩内容随时掌握:
热情邀请仔细浏览下博客中的广告,万一有对自己有用或感兴趣的呢。◕ᴗ◕。。
如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^,当然了能够赞赏博主,那就非常感谢啦!
注: 转载请注明出处,谢谢!^_^
转载请注明来源: 本文链接:  By: AilsonJack
SPI总线协议-一篇文章带你了解  |  说好一起走
暂无评论,要不要来个沙发
发表评论

 
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号