序列周邊介面

操作

SPI总线可以在有单个主设备与一个或多个从设备的情况下运行。
如果使用单个从设备，则如果从设备允许，SS引脚可以固定为逻辑低电平。 一些从设备需要片选信号的下降沿来启动一个动作。 Maxim MAX1242 ADC就是一个例子，它在高→低转换时开始转换。 对于多个从设备，每个从设备都需要一个独立的SS信号。
大多数从属设备​​具有三态逻辑的特性，所以当器件未被选中时，它们的MISO信号变为高阻抗（ 逻辑断开）。 没有三态输出的器件不能与其他器件共享SPI总线段; 只有一个这样的从设备可以与主设备交换信息。

数据传输

为了开始通信，总线上的主设备需要使用从设备支持的频率来配置时钟，通常是几个MHz。 然后主设备将某根连接到从设备SS的线上的信号置为0来选中这个从设备。 如果需要等待一段时间（例如进行模数转换），主器件在发出时钟周期之前必须至少等待这段时间。
在每个SPI时钟周期内，都会发生全双工数据传输。 主设备在MOSI线上发送一个位，从设备读取它，同时从机在MISO线上发送一位数据，主机读取它。 即使只有单向数据传输的目的，工作方式仍然是双工的。
传输通常会使用到给定字长的两个移位寄存器，一个在主设备中，一个在从设备中; 它们以虚拟环形拓朴连接。 数据通常先移出最大的位。 在时钟边沿，主机和从机均移出一位，然后在传输线上输出给对方。 在下一个时钟沿，每个接收器都从传输线接受该位，并设置为移位寄存器的新的最低有效位。 在完成这样一个移出-移入的周期后，主机和从机就交换寄存器中的一位。 如果需要更多的数据交换，则需要重新加载移位寄存器并重复该过程。 传输可能会持续任意数量的时钟周期。 完成后，主设备会停止切换时钟信号，并通常会取消选择从设备。
传输寄存器通常包含8位。 但是，其他字长也很常见，例如，用于触摸屏控制器或音频编解码器的16位（如德州仪器的TSC2101），或者用于许多数字-模拟或模拟-数字转换的12位。
未使用片选线激活的总线上的每个从设备必须忽略输入时钟和MOSI信号，并且不得驱动MISO。

独立的从设备配置

在独立的从设备配置中，每个从设备都有独立的芯片选择线。 强烈建议在每个独立器件上使用电源和片选线之间使用上拉电阻，以减少器件之间的串扰。 
这是SPI通常被使用的方式。 由于从机的MISO引脚连接在一起，因此它们需要为三态引脚（高，低或高阻抗）。

中断

SPI从设备有时会使用另一条信号线将中断信号发送到主设备的CPU。 例子包括来自触摸屏传感器的笔下中断，来自温度传感器的热限制警报，实时时钟芯片发出的警报， SDIO以及来自手机中声音编解码器的耳机插孔插入。 SPI标准中并不包括中断。 中断的使用既不被禁止也不被标准规定。

SPI代码示例

/* * 通过SPI协议在主设备和从设备之间交换一个字节的数据 * * Polarity and phase are assumed to be both 0, i.e.: *   - 输入数据在SCLK的上升沿捕获。 *   - 输出数据在SCLK的下降沿传播。 * * 返回接收到的一字节的数据 */uint8_t SPI_transfer_byte(uint8_t byte_out){
    uint8_t byte_in = 0;
    uint8_t bit;

    for (bit = 0x80; bit; bit >>= 1) {
        /* Shift-out a bit to the MOSI line */
        write_MOSI((byte_out & bit) ? HIGH : LOW);

        /* Delay for at least the peer's setup time */
        delay(SPI_SCLK_LOW_TIME);

        /* Pull the clock line high */
        write_SCLK(HIGH);

        /* Shift-in a bit from the MISO line */
        if (read_MISO() == HIGH)
            byte_in |= bit;

        /* Delay for at least the peer's hold time */
        delay(SPI_SCLK_HIGH_TIME);

        /* Pull the clock line low */
        write_SCLK(LOW);
    }

    return byte_in;}