SPI总线协议-一篇文章带你了解
<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('/uploads/AilsonJack/2020.09.05/1599296827605000.gif')"/></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('/uploads/AilsonJack/2020.09.05/1599296827489202.gif')"/></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>
你可能也喜欢:
暂无评论,要不要来个沙发
发表评论
JLink V9掉固件修复(灯不亮) 3Zephyr笔记2 - 在STM32F429上运行HelloWorld 2计算NandFlash要传入的行地址和列地址 1Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式 0Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式 0Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2) 0
标签云
Linux嵌入式实用技巧ARM内核学习问题集合CC++编程语言阅读笔记汇编Linux内核完全注释Windows驱动开发计算机基础ARM11ARMv7-ASTM32IDESublimeLinux内核学习eMMCMMC子系统Ubuntu操作系统OfficeVMWareAPUEgccRTOS中断漫游世界随笔感悟开发工具软件应用编程VsCodearmccarmclang编译器ZephyrSPIJLink网卡驱动安装各种芯片库函数NFSμCOS内核sambaFlashUnix命令与脚本输入法Linux内核设计与实现gitRIFFWAVJATGFTPar8161安装centos有线上网μCGUI字库工程建立右键菜单网络文件系统Firefox百度NTFS文件系统CodeBlocksCentOS数据结构算法PhotoShop51KeilQTUltraEditscanfglibc宏定义UIDGID优先级娱乐天地SourceInsight磁盘扇区总线I2CPDFBComparePythonI2SFPUMakefileSWDCPUARP软件推荐FileZilla