SPI协议

        这篇文章将开始叙述SPI协议,作为一种高速、全双工、同步的串行通信协议,广泛应用于嵌入式系统中的短距离设备间通信,是嵌入式开发过程中不可或缺的通信过程。这里我用一个快递驿站取件的举例来加深理解,如有错误之处,还请批评指正。

    一、SPI的简述

    SPI协议仅需4根信号线:

    • SCLK(Serial Clock):主设备产生的同步时钟信号,控制数据传输速率和时序。
    • MOSI(Master Out Slave In):主设备发送数据到从设备的通道。
    • MISO(Master In Slave Out):从设备发送数据到主设备的通道。
    • CS/SS(Chip Select/Slave Select):主设备通过拉低该线选择特定从设备,允许多从机共存
    • 场景设定

      • 快递公司(主设备Master):负责调度快递员(时钟信号),向不同快递点(从设备Slave)发起取件请求。
      • 快递点(从设备Slave):每个快递点有唯一编号(设备地址),如“快递点1”、“快递点2”。
      • 快递员(时钟信号SCLK):按不同规则在不同时间点检查包裹(数据采样)。
      • 取件规则(时钟模式):由两个参数决定——
        • CPOL(快递员待命位置):快递员平时在1楼(低电平)或2楼(高电平)。
        • CPHA(包裹检查时机):快递员到达时立即检查包裹(第一边沿)或离开前检查包裹(第二边沿)。

    二、通讯过程

            如下图所示,在实际应用中经常是一个主机对应多个从设备的情况,所以在正式通讯前需要找到自己要通讯哪个设备。

                       

            第一步:当想选择与哪个从设备进行通信,只需将对应的NSS(片选信号)拉低。其余的NSS(片选信号)拉高。相当于选择快递点

    选择快递点(片选信号CS/SS)

    • 动作:快递公司拨打“快递点1”的电话(拉低CS1),其他快递点(CS2、CS3)保持挂断状态。
    • 协议意义:通过片选信号激活目标从设备,避免多设备冲突。

            第二步:选择好设备后,接下来就需要进行选择怎么样的时钟信号,即我在取快递任务前的待命地点以及包裹交接后的动作

    快递员出发(时钟信号SCLK)
    • CPOL定义快递员待命位置
      • CPOL=0:快递员平时在1楼待命(时钟空闲为低电平)。
      • CPOL=1:快递员平时在2楼待命(时钟空闲为高电平)。
    包裹交接(数据采样)
    • CPHA定义包裹检查时机
      • CPHA=0:快递员到达快递点时(时钟边沿从空闲到活动)立即检查包裹(数据采样)。
      • CPHA=1:快递员离开快递点前(时钟边沿从活动到空闲)检查包裹(数据采样)。

    根据这样的取件流程排列组合,可以获得四种组成方式即:

    4种模式的取件流程对比
    模式CPOLCPHA快递员行为对应SPI时序
    模式000快递员在1楼待命,到达快递点(上升沿)立即检查包裹。数据在时钟上升沿采样,下降沿切换。
    模式101快递员在1楼待命,离开快递点前(下降沿)检查包裹。数据在时钟下降沿采样,上升沿切换。
    模式210快递员在2楼待命,到达快递点(下降沿)立即检查包裹。数据在时钟下降沿采样,上升沿切换。
    模式311快递员在2楼待命,离开快递点前(上升沿)检查包裹。数据在时钟上升沿采样,下降沿切换。

            第三步:信息交互过程,即MOSI和MISO同时工作,这就是全双工。当主机给从机发消息的时候,主机可以不获取任务的信息。但是主机读取从机信息时,需要发送一段虚拟的信息。发送哑数据(dummy data)如0x00或0xFF。这就是快递员在往快递点送快递的时候我告诉你一声,快递已经放你这了,至于这个快递如何处理,那是你的事情。我已经交给你了。但是我从你快递点拿走快递的时候,必须进行登记,因为快递点必须要确认你是否拿走,是否拿错了,这样能够避免将其他客户的快递错拿。例子举的比较生硬。见谅哈。

    三、工作原理

            主机和从机有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。串行移位寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的串行移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换(高位先行)。

    假设主机有个数据 10101010 1010101010101010 要发送给从机,同时从机也有个数据 01010101 0101010101010101 要发送到主机,

    首先驱动时钟,先产生一个上升沿,这时,所有的位,会往左移动一次,从最高位移出去的数据,就会放到通信线上,数据放到通信线上(实际上是放到了输出数据寄存器),此时 MOSI 数据是 1,所以 MOSI 的电平就是高电平;而 MISO 的数据是 0,所以 MISO 的电平就是低电平,这就是第一个时钟上升沿执行的结果。
    然后把主机和从机中移位寄存器的最高位分别放到 MOSI 和 MISO 的通信线上,这就是数据的输出。
    之后时钟继续运行,上升沿之后,下一个边沿就是下降沿,在下降沿时主机和从机内,都会进行数据采样输入,也就是,MOSI 的 1,会采样输入到从机这里的最低位;MISO 的 0,会采样输入到主机这里的最低位,这就是第一个时钟结束后的现象。
    时钟继续运行,下一个上升沿,同样操作,移位输出,主机现在的最高位,也就是原始数据的最高位,输出到 MOSI,从机现在的最高位,输出到 MISO,变成主机的最低位…
    八个时钟后,原来主机的 10101010,跑到从机里,而原来从机的 01010101跑到主机里了。

    完整通信示例(以模式0为例)

    1. 选择快递点:快递公司呼叫“快递点1”(拉低CS1)。
    2. 快递员待命:快递员在1楼待命(CPOL=0)。
    3. 发起取件
      • 快递员前往快递点(时钟从低→高,上升沿)。
      • 立即检查包裹(CPHA=0):读取包裹信息(MISO线数据)或放置新包裹(MOSI线数据)。
    4. 完成取件:快递员离开(时钟从高→低,下降沿),包裹切换为下一批数据。
    5. 结束通信:快递公司挂断电话(拉高CS1)
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值