SPI(Serial Peripheral Interface,串行外设接口)的片选信号(Chip Select,简称 CS 或 SS,即 Slave Select)是 SPI 通信中用于选择从设备的关键控制信号,其作用是在多从设备的 SPI 总线上,指定当前与主设备进行通信的从设备。
片选信号的基本原理
- SPI 总线通常包含 4 根线:SCLK(时钟线)、MOSI(主发从收数据线)、MISO(主收从发数据线)和 CS(片选线)。
- 主设备通过拉低某个从设备的 CS 信号,来选中该从设备进行通信;未被选中的从设备,其 CS 信号为高电平,会忽略总线上的通信数据。
- 在通信过程中,被选中的从设备会响应主设备的指令,而其他从设备则处于空闲状态。
片选信号的有效电平
- 片选信号通常是低电平有效,即当 CS 信号为低电平时,从设备被选中;当 CS 信号为高电平时,从设备未被选中。
片选信号的控制方式
硬件片选(芯片控制)
由 SPI Master自动生成和控制片选信号,主设备在发送数据时,硬件会自动拉低对应从设备的 CS 信号,数据发送完成后自动拉高。软件片选(GPIO 控制)
将片选信号连接到主设备的 GPIO 引脚,通过软件编程(如设置 GPIO 输出高低电平)来控制片选信号的状态。
硬件片选和软件片选的选择问题实测:
以前用官方SDK移植开发通常直接用硬件片选,把管脚复用成芯片内部的CS信号,用起来很方便,但是后面调试了一些SPI驱动设备后发现,用GPIO控制可能是更好的选择,主要是发现有些从设备的时序不允许你中途拉高CS,比如以下图片就要求在特定模式下持续拉低CS信号:
如果没有注意对多个字节分开读取,就会导致时序出现问题从而读上来顺序有问题。
还有一个例子是对于有些从设备芯片,只能每次从它特定的寄存器读数据(比如四字节data寄存器这种),当数据量大的时候没办法用驱动接口一次性读取完,这时候如果是硬件片选必然会出现多次CS拉高拉低,就会导致数据异常。
所以配置成GPIO整体来说更灵活可控,在多设备情况下也能实现更好的控制,代价就是需要频繁操作GPIO会带来一定资源开销。