spi通信单个从机的片选信号问题
在 SPI 通信中,可以有一个主机和多个从机,一般情况每个从机都有一个片选信号,片选信号默认为高,主机通过拉低片选信号来选中对应从机进行通信,但是实际情况很多时候只有一个从机,一开始会认为这时候的片选信号没多大意义,实际上即使只有一个从机,也必须只在通信时(发送或接收数据包)将片选信号(CS)拉低,并在通信结束将其拉高。绝对不应该持续拉低片选信号。所以即使在只有一个从机的情况下,也必须只在每次数
·
在 SPI 通信中,可以有一个主机和多个从机,一般情况每个从机都有一个片选信号(CS),CS 默认为高,主机通过拉低 CS 来选中对应从机进行通信,但是实际情况很多时候只有一个从机,一开始会认为这时候的 CS 没多大意义,因为选中不选中都是只有他一个,当选项只有一个的时候选择也就没有意义了,实际上即使只有一个从机,也必须只在通信时(发送或接收数据包)将片选信号拉低,并在通信结束将其拉高。不能持续拉低片选信号。原因如下:
- 协议要求:
- SPI 通信的本质是基于交易(Transaction)的。基于交易的意思本质是说spi通信实际上就是主机和从机的信息交换,一次完整的交易始于 CS 信号下降沿,结束于 CS 信号上升沿。
- CS 的下降沿告诉从机:“主机准备开始发送/接收数据了”。
- CS 的上升沿告诉从机:“主机完成这次通信了”。
- 它标识一个完整命令或数据包的结束。
- 它可能触发从机执行内部操作(如将接收到的数据写入寄存器、准备待发送数据)。
- 它使从机内部状态机复位,为下一次通信做准备。
- 区分交易:
- 即使连续发送多次数据包,CS 也需要在每个数据包之间短暂拉高(保持高电平一段时间 tsu,数据手册可以查到这个时间)。这清晰地界定了“上一次通信结束”和“下一次通信开始”的时刻。持续低电平会让从机无法区分连续的数据包是一个长命令还是多个独立命令,可能导致从机状态机混乱和数据处理错误。
- 防止误操作/噪声干扰:
- 当 CS 处于低电平时,从机会持续监听时钟信号 (SCK) 和数据线 (MOSI/MISO),时钟线上的时钟信号也只会在数据通信的时候出现,区分是否处于数据通信状态就是根据CS信号的上升沿和下降沿来判断进入和退出数据通信状态。
- 如果 CS 持续拉低,任何出现在 SCK 线上的噪声或毛刺都可能被误认为是时钟信号(这一点可以通过示波器进行验证,当持续拉低 CS 信号的时候,测到的时钟信号就是一堆毛刺。正确配置CS信号的话就会在数据发送的时候观测到标准的方波)。这会导致从机错误地采集 MOSI 线上的数据(可能是随机的噪声电平),从而意外覆盖其内部寄存器。即使主机没有主动驱动 MOSI,未定义电平也可能被捕获。
- 时钟的下降沿或上升沿(根据 CPOL/CPHA 设置)会触发数据的采集或更新。 持续的 CS 低电平意味着只要有 SCK 信号变化(即使不是主机产生的,或来自其他外设干扰),从机就在“工作”。
- 功耗考虑 (尤其重要):
- 当 CS 被拉高(无效)时,许多从设备(如传感器、无线模块等)会进入低功耗休眠模式,极大地降低电流消耗(可能从 mA 级降到 μA 级)。
- 如果 CS 持续拉低,从设备无法进入低功耗状态。它会持续激活其接收逻辑,等待时钟信号。这会显著增加系统的静态功耗和电池消耗。
- 将通信之外的 CS 释放为高电平,是节能设计的必需步骤。
- 时序要求:
- 从机芯片的数据手册会规定 CS 信号的最小高电平时间(tcs 或 tsu)。这个时间是为了确保从机有足够的时间处理完当前事务并准备好接收下一个事务。持续拉低 CS 违反了这一要求。
所以即使在只有一个从机的情况下,也必须只在每次数据传输开始的时候将 CS 信号拉低,并在传输结束后将其拉高。
更多推荐



所有评论(0)