SPI通信协议深度解析:从寄存器操作到中断与错误处理实战

📅 2026/6/19 16:43:30
SPI通信协议深度解析:从寄存器操作到中断与错误处理实战
1. SPI数据传输机制与错误处理详解从寄存器操作到中断控制搞嵌入式开发SPISerial Peripheral Interface几乎是绕不开的通信协议。从简单的EEPROM读写到复杂的传感器数据采集SPI以其简单、高速、全双工的特性在各类MCU和DSC数字信号控制器中扮演着关键角色。但很多开发者尤其是刚入行的朋友往往只停留在“配好时钟、读写数据”的层面一旦遇到数据错乱、通信中断或者莫名其妙的溢出错误就有点抓瞎。今天我就结合飞思卡尔现恩智浦5685X系列DSC的SPI模块手册把SPI从数据传输的底层寄存器操作到错误处理的完整逻辑以及如何利用中断构建稳健驱动彻底讲透。这不仅仅是手册翻译而是我十多年踩坑填坑后对SPI核心机制的理解和实战经验的总结。无论你是用STM32、NXP还是其他家的MCUSPI的核心思想和寄存器操作逻辑都是相通的这篇文章能帮你建立起一套完整的调试和问题排查框架。2. SPI核心机制深度拆解不止于四根线很多人对SPI的印象就是SCK、MOSI、MISO、SS四根线。这没错但仅仅是物理层。在控制器内部SPI模块是一个精密的“数据流水线”和“状态机”其稳定运行依赖于对一系列寄存器和标志位的精确操控。理解这个内部状态机是写出高效、可靠SPI驱动的关键。2.1 双缓冲机制流畅传输的基石SPI通信是同步的意味着数据传输的节奏完全由时钟SCLK控制。数据从主设备的MOSI引脚移出同时从从设备的MISO引脚移入实现全双工。但这里有个关键问题当移位寄存器正在一位一位地向外发送数据时如果CPU想准备下一帧要发送的数据或者读取刚刚接收完的数据该怎么办如果只有一个共享的数据寄存器就会发生冲突。飞思卡尔5685X的SPI模块采用了一种经典且高效的解决方案双缓冲数据寄存器。SPDTR (SPI Data Transmit Register)数据发送寄存器。这是一个只写Write-Only寄存器。当CPU需要发送数据时就将数据写入这里。注意写入SPDTR并不意味着数据立刻被发送到引脚上它只是进入了“发送缓冲区”。移位寄存器 (Shift Register) 这是真正进行“串行化”操作的硬件单元。它从SPDTR中加载并行数据然后在SCLK的每个时钟沿将数据一位一位地通过MOSI主模式或MISO从模式推出去。同时它也从对应的输入引脚接收数据并组装成并行数据。SPDRR (SPI Data Receive Register)数据接收寄存器。这是一个只读Read-Only寄存器。当移位寄存器接收完一整帧数据例如16位后会自动将组装好的并行数据转存到SPDRR中等待CPU读取。这个“双缓冲”流程是这样的CPU检查SPTE (SPI Transmitter Empty)标志。如果SPTE1表示发送缓冲区SPDTR为空可以写入新数据。CPU将数据DATA_A写入SPDTR。写入操作会自动清除SPTE标志置0表示缓冲区已满。当移位寄存器空闲即上一帧数据已发送完毕时硬件会自动将DATA_A从SPDTR加载到移位寄存器中。这个加载操作会自动置位SPTE标志置1通知CPU“缓冲区又空了你可以准备下一帧数据DATA_B了”。与此同时移位寄存器开始在SCLK驱动下一边发送DATA_A的位一边接收从设备返回的数据位。当一整帧数据接收完成硬件会将移位寄存器中接收到的数据DATA_RX转存到SPDRR并自动置位SPRF (SPI Receiver Full)标志置1通知CPU“有数据收到了快来读”。CPU读取SPDRR读取操作会自动清除SPRF标志置0。关键点与避坑指南SPTE是“可写”标志SPTE1是写入SPDTR的唯一安全时机。如果在SPTE0时强行写入会覆盖尚未被加载到移位寄存器的数据导致发送数据错误。手册中明确警告“Do not write to the SPI Data Register unless the SPTE bit is high.”SPRF是“可读”标志SPRF1是读取SPDRR的时机。及时读取非常重要否则会导致溢出错误OVRF我们后面会详细讲。“背靠背”传输双缓冲的精妙之处在于支持“背靠背Back-to-Back”传输。CPU可以在当前帧DATA_A还在移位寄存器中发送时就将下一帧数据DATA_B写入SPDTR进行排队。这样当前一帧发送完成的瞬间DATA_B可以立即被加载开始下一帧传输最大限度地利用了总线带宽减少了帧间的空闲时间。2.2 时钟相位与极性主从设备对话的“暗号”CPOL (Clock Polarity) 和 CPHA (Clock Phase) 是SPI配置中最容易混淆也最关键的参数。它们共同定义了数据采样和变化的时钟边沿。主从设备必须配置一致否则通信必然失败。CPOL (时钟极性) 定义SCLK在空闲状态无数据传输时的电平。CPOL0 SCLK空闲时为低电平。CPOL1 SCLK空闲时为高电平。CPHA (时钟相位) 定义数据在SCLK的哪个边沿被采样捕获以及在哪个边沿发生变化输出。CPHA0 数据在SCLK的第一个边沿对于CPOL0是上升沿对于CPOL1是下降沿被采样在下一个边沿发生变化。CPHA1 数据在SCLK的第二个边沿被采样在第一个边沿发生变化。手册中的时序图Figure 11-10清晰地展示了CPHA:CPOL 1:0模式下的波形。在这种模式下CPOL0 空闲时SCLK为低。CPHA1 数据在SCLK的第二个边沿下降沿被采样在第一个边沿上升沿发生变化。因此MOSI数据在SCLK上升沿时变化在下降沿时被从设备稳定采样。为什么需要两种模式这主要取决于从设备如传感器、ADC芯片的硬件设计。有些芯片要求在时钟边沿A采样有些则在边沿B。作为主设备我们必须严格按照从设备数据手册的要求来配置CPOL和CPHA。一个常见的记忆方法是CPHA决定了采样边沿是“奇数”还是“偶数”个边沿从帧同步信号开始算。实战经验先查从设备手册 在编写驱动前第一件事就是确认从设备的SPI模式Mode 0, 1, 2, 3。Mode 0对应CPOL0, CPHA0Mode 1对应CPOL0, CPHA1以此类推。示波器是终极裁判 当通信不通时用示波器同时抓取SCLK和MOSI/MISO波形。对照理论时序看数据变化和采样边沿是否匹配。这是排查SPI硬件问题最直接有效的方法。CPHA0的特殊要求 手册特别指出当CPHA0时从设备的SS引脚必须在两次完整的数据传输之间被拉高置为逻辑1。这是因为在CPHA0模式下SS的下拉沿本身就标志着传输的开始MISO会立即输出MSB。如果SS一直为低从设备会认为传输一直在持续导致逻辑混乱。在使用CPHA0时务必在软件中控制好SS引脚的电平切换。3. 寄存器操作详解与硬件对话的语言理解了核心机制我们来看看如何通过寄存器来指挥这个硬件模块。5685X的SPI模块主要涉及四个寄存器它们的访问类型和功能各不相同操作不当会导致未定义行为。3.1 核心寄存器功能解析寄存器缩写全称访问类型核心功能SPSCRSPI状态与控制寄存器读/写 (Word)核心控制中心。包含波特率选择、主从模式、时钟相位/极性、模块使能、中断使能以及所有关键状态标志SPTE, SPRF, OVRF, MODF。SPDSCRSPI数据大小与控制寄存器读/写 (Word)配置传输数据位宽2-16位、使能DMA模式、使能Wired-OR模式。SPDRRSPI数据接收寄存器只读 (Word)存放从移位寄存器转存过来的已接收数据。读取该寄存器会清除SPRF标志。SPDTRSPI数据发送寄存器只写 (Word)存放待发送的数据。写入该寄存器会清除SPTE标志。重要警告 SPSCR和SPDSCR这两个读/写寄存器必须使用字Word访问。使用字节或半字访问会导致“未定义的结果”通常意味着某些位可能被错误地写入或读取引发难以排查的故障。在C语言中确保将它们定义为volatile的32位或16位取决于架构变量并使用指针进行字访问。3.2 关键控制位与状态位操作指南SPSCR寄存器中的关键位SPE (Bit 5) - SPI使能 这是SPI模块的总开关。SPE0时模块被禁用会进行一次“部分复位”清空移位寄存器、状态计数器等但控制位如MODFEN, ERRIE和状态标志SPRF, OVRF, MODF不会被清除。这允许你在传输间隙关闭SPI以省电而无需重新配置所有参数。再次开启时直接置SPE1即可。SPMSTR (Bit 8) - 主模式选择1为主机0为从机。这个位决定了SCLK、MOSI、MISO引脚的方向。特别注意在主机模式下如果MODFEN1SS引脚被意外拉低会产生模式故障MODF这会导致SPE被自动清零SPI被禁用这是一个重要的硬件保护机制。SPRIE (Bit 9) SPTIE (Bit 4) - 接收/发送中断使能SPRIE1 当SPRF接收寄存器满置位时产生接收中断。SPTIE1 当SPTE发送寄存器空置位时产生发送中断。注意此中断仅在SPE1SPI使能时有效。ERRIE (Bit 11) - 错误中断使能 这是一个“总开关”同时控制着OVRF溢出和MODF模式故障两个错误标志是否能产生中断。ERRIE1则两者任一置位都会触发“接收/错误中断”。不能单独使能OVRF或MODF的中断。MODFEN (Bit 10) - 模式故障检测使能 此位控制是否检测SS引脚上的模式故障。如果MODFEN0则SS引脚的电平变化不会被监控MODF标志永远不会被置位。这在一些特殊应用如多主机软件模拟中可能有用但通常建议保持使能MODFEN1以利用硬件保护。状态位操作与清除机制SPTE(Bit 0)只读。当SPDTR的数据被加载到移位寄存器后硬件自动置1。清除它的唯一方法是向SPDTR写入新数据。SPRF(Bit 3)只读。当接收数据从移位寄存器转存到SPDRR后硬件自动置1。清除它的唯一方法是读取SPDRR。OVRF(Bit 2)只读。发生接收溢出时置1。清除它需要一个特定序列先读取SPSCR此时OVRF1然后再读取SPDRR。这个顺序不能错。MODF(Bit 1)只读。发生模式故障时置1。清除方法是向该位写1注意是写1清零这是一种常见的标志清除方式。但手册强调清除操作必须在MODF条件已不存在即SS引脚电平已恢复正常时进行否则写1无效。避坑指南操作寄存器的“潜规则”避免使用位操作指令 手册明确警告避免使用BFCLR位清除或BFSET位置位这类指令来修改SPSCR。因为这类指令是“读-修改-写”操作在读取和回写之间硬件可能已经改变了状态位如SPRF、SPTE你的回写操作可能会意外地清除这些由硬件置位的标志导致数据丢失或状态机混乱。安全的做法是先读取整个寄存器值到一个变量在变量中修改控制位再将整个变量写回寄存器。数据对齐 无论数据位宽TDS设置是多少SPDRR和SPDTR都是16位寄存器。当传输数据小于16位时例如8位数据总是存放在寄存器的低有效位高位用0填充。写入SPDTR时也只需将数据放在变量低字节高位写0即可。4. 错误处理机制构建稳健通信的防线SPI通信在复杂电磁环境或多设备系统中出错是难免的。硬件提供的错误检测机制是我们构建稳健系统的第一道防线。5685X的SPI模块主要提供了两种错误检测溢出错误OVRF和模式故障错误MODF。4.1 溢出错误数据丢失的“元凶”溢出错误OVRF的本质是CPU读取数据的速度跟不上SPI接收数据的速度。触发条件 当SPRF标志已经为1表示SPDRR中有未读数据而下一帧数据的第一个位的捕获时钟沿对于16位数据是第15个SCLK的中间点到来时OVRF标志就会被置位。严重后果触发溢出时正在接收的这帧数据图11-11中的DATA 3会丢失不会被转移到SPDRR。SPRF标志不会被置位因为新数据没进来。之前已经存在于SPDRR中的旧数据DATA 2仍然可以正常读取。如果ERRIE1会触发接收/错误中断。最危险的情况——静默数据丢失 这是手册Figure 11-11重点警告的场景。假设我们只使能了SPRF中断SPRIE1来处理接收数据而没有使能错误中断ERRIE0。流程如下DATA 1接收完成SPRF置位触发中断。中断服务程序ISR中我们读取SPSCR看到SPRF1然后读取SPDRR获取DATA 1。读取SPDRR会清除SPRF。在ISR执行期间或之后DATA 2接收完成SPRF再次置位等待下次中断。然而在CPU来得及响应DATA 2的中断之前DATA 3已经开始接收了。此时SPDRR中仍然是未读的DATA 2于是OVRF在DATA 3接收中途被置位DATA 3丢失。由于OVRF中断未使能CPU对此一无所知。DATA 2的SPRF中断终于到来ISR读取DATA 2。后续的DATA 4接收时因为OVRF标志未被清除我们没处理它硬件会阻止SPRF再次被置位。于是DATA 4及之后的所有数据都“静默”丢失了SPRF中断再也无法触发程序看似正常实则通信已断。解决方案启用错误中断推荐 直接设置ERRIE1。这样一旦发生OVRF会立即进入错误中断服务程序。在错误ISR中按照“读SPSCR - 读SPDRR”的顺序清除OVRF标志并记录错误、尝试恢复通信例如重置缓冲区。双读SPSCR法无错误中断时 如果因某些原因不能启用错误中断则必须在每次SPRF中断服务程序中采用以下安全读取序列// 在SPRF中断服务程序中 volatile uint16_t status SPI_SPSCR; // 第一次读SPSCR获取状态 volatile uint16_t data SPI_SPDRR; // 读数据清除SPRF status SPI_SPSCR; // 第二次读SPSCR检查OVRF是否在刚才被置位 if (status SPI_OVRF_MASK) { // 发生了溢出需要处理清除OVRF并可能丢弃缓冲区的数据或进行复位 data SPI_SPDRR; // 再次读SPDRR以清除OVRF根据手册序列 // ... 错误处理逻辑 ... } // 正常处理 data第二次读取SPSCR就是为了捕捉在“第一次读SPSCR”和“读SPDRR清除SPRF”这个极短时间窗口内可能发生的溢出。4.2 模式故障硬件冲突的“保险丝”模式故障MODF是一种硬件保护机制用于防止因主从模式配置与SS引脚电平冲突而导致的总线竞争和硬件损坏。触发条件主机模式(SPMSTR1) 当MODFEN1时如果SS引脚被拉低变为逻辑0则立即触发MODF。从机模式(SPMSTR0) 当MODFEN1时如果SS引脚在传输过程中被拉高则触发MODF。这里的“传输过程”定义与CPHA有关CPHA0 传输从SS变低开始到最后一个数据位移出后SCLK回到空闲电平结束。在此期间SS变高即触发。CPHA1 传输从SCLK离开空闲电平开始此时SS必须已为低到SCLK回到空闲电平结束。在此期间SS变高即触发。触发后的硬件行为在主机上 MODF是严重错误。一旦发生硬件会自动清除SPE位禁用SPI模块。置位SPTE。清除SPI状态计数器。如果ERRIE1产生中断。 这相当于对SPI进行了一次“急刹车”防止主机在SS被拉低可能意味着另一个设备想成为主机时继续驱动总线造成短路。在从机上 MODF不会禁用SPI。它只是置位MODF标志如果ERRIE1则产生中断。从机的MISO引脚会进入高阻态并忽略所有SCLK时钟。软件可以通过清除SPE位来主动中止传输。清除MODF 需要向MODF位写1来清除。但前提是导致MODF的条件已经消失主机上SS已恢复为高从机上SS已稳定为低或传输已结束。否则写1操作无效。实战心得MODF的预防与处理主机SS引脚处理 在标准单主机、多从机系统中主机通常将SS引脚配置为通用输出GPIO并直接控制其电平来选通从机。此时务必设置主机的MODFEN0或者确保主机的SS引脚即使配置为输入不会被意外拉低。否则任何干扰导致主机SS引脚为低都会触发MODF并禁用SPI导致通信瘫痪。从机SS引脚连接 从机的SS引脚必须由主机可靠控制。在CPHA0模式下要特别注意SS的下降沿和上升沿都是传输的一部分必须保证时序。长线缆可能引入毛刺导致意外MODF。必要时可考虑在软件中暂时禁用MODF检测MODFEN0但会失去保护。多主机系统 在多主机争用总线的系统中MODF机制是关键。每个主机平时配置为从机SPMSTR0当要发送数据时先尝试拉低总线上的SS线通常作为总线仲裁线。如果自己拉低成功且未触发MODF说明没有其他主机在活动则将自己切换为主机SPMSTR1开始通信。通信结束后再切换回从机。这个过程需要软件精心设计。5. 中断与DMA配置解放CPU实现高效传输对于需要连续、高速传输大量数据的应用如音频流、图像传感器依赖CPU轮询SPTE和SPRF标志是不现实的会消耗大量CPU资源。中断和DMA才是正确的选择。5.1 中断驱动传输流程设计一个典型的中断驱动、双缓冲SPI发送流程如下以主机发送为例初始化配置GPIO、时钟、SPI为主机模式、设置CPOL/CPHA、波特率等。使能发送中断SPTIE1和接收中断SPRIE1。使能错误中断ERRIE1。使能SPI模块SPE1。此时发送缓冲区为空SPTE会立即置位触发第一次发送中断。发送中断服务程序 (SPTE中断)void SPI_Transmit_IRQHandler(void) { if (tx_buffer_index tx_buffer_length) { SPI-SPDTR tx_buffer[tx_buffer_index]; // 写入数据清除SPTE } else { // 所有数据发送完毕 SPI-SPSCR ~SPI_SPTIE_MASK; // 可选禁用发送中断 tx_complete_flag 1; // 设置完成标志 } // 清除中断标志通常写SPDTR即清除了SPTE中断源 }关键点只要SPTE1中断就会触发。在ISR中写入SPDTR硬件加载数据后SPTE会再次置1从而触发下一次中断形成链式反应直到我们主动停止如禁用中断或不再写入数据。接收中断服务程序 (SPRF中断)void SPI_Receive_IRQHandler(void) { volatile uint16_t status SPI-SPSCR; // 先读状态 uint16_t data SPI-SPDRR; // 读数据清除SPRF // 安全检测检查是否发生溢出 if (status SPI_OVRF_MASK) { // 发生了溢出错误 data SPI-SPDRR; // 再次读SPDRR以清除OVRF遵循手册序列 overflow_counter; // 可能需要重置接收状态或上报错误 } else { // 正常处理数据 if (rx_buffer_index rx_buffer_size) { rx_buffer[rx_buffer_index] data; } } }关键点遵循“先读SPSCR再读SPDRR”的规范并在读数据后检查OVRF以实现安全的数据读取。5.2 DMA模式极致性能的追求对于超高带宽或极低CPU占用的场景DMA直接存储器访问是终极方案。SPI模块的DMA模式通过TDMAEN发送DMA使能和RDMAEN接收DMA使能位来启用。DMA模式下的变化中断抑制 当DMA使能后正常的SPTE和SPRF中断被抑制。取而代之的是硬件会向DMA控制器发出传输请求。标志清除机制简化 在DMA模式下清除SPTE和SPRF标志的机制从“读SPSCR读/写数据寄存器”简化为直接读写数据寄存器本身。DMA控制器在完成一次SPDTR写入或SPDRR读取后会自动完成标志清除工作无需软件干预。错误中断依然有效OVRF和MODF错误中断由ERRIE控制不受DMA模式影响依然可以触发CPU中断。这对于在DMA传输过程中监控致命错误至关重要。DMA配置步骤配置SPI为所需的工作模式。设置TDMAEN和/或RDMAEN。配置DMA控制器设置源/目标地址内存缓冲区地址 vs. SPI数据寄存器地址。设置传输数据宽度与SPI的TDS设置一致。设置传输数量。将DMA请求与SPI的TX/RX请求线连接。启动DMA传输然后启动SPI传输例如向SPDTR写入第一个数据或由外部主机提供时钟。在DMA传输完成中断或SPI错误中断中处理后续事宜。性能调优与注意事项缓冲区管理 中断驱动下双缓冲乒乓缓冲是常见策略即准备两个缓冲区一个用于发送/接收另一个用于CPU处理交替使用。DMA模式下可以设置更大的循环缓冲区。中断优先级 SPI接收中断的优先级通常应高于发送中断因为接收数据不及时会导致溢出。错误中断OVRF/MODF的优先级应设为最高以便及时响应致命错误。波特率与CPU速度 高速SPI通信时必须确保ISR的执行时间足够短能在下一帧数据到来前完成读写操作。计算一下假设SPI波特率为10 Mbps传输16位数据则一帧耗时1.6微秒。你的ISR必须在1.6微秒内完成否则就可能溢出。此时DMA几乎是必须的。CPHA0与DMA 手册特别指出不要在DMA模式下使用CPHA0。这是因为在CPHA0模式下从机的SS引脚需要在帧切换而DMA传输是连续的很难精确插入SS的控制时序容易导致通信故障。在DMA应用中优先使用CPHA1模式。6. 典型问题排查与调试技巧实录即使理解了所有原理实际调试中还是会遇到各种问题。下面是我总结的一些常见问题场景和排查思路。6.1 通信完全无反应检查清单电源与时钟 测量MCU和从设备供电是否正常。确认MCU的SPI外设时钟是否使能例如在STM32中需要开启APB总线时钟。引脚配置 确认SCK、MOSI、MISO、SS引脚是否已正确配置为SPI复用功能而非普通GPIO。用万用表或示波器检查引脚是否有输出。SPE位 确认SPI使能位SPE是否已设置为1。这是一个非常低级但常见的疏忽。主从模式 确认SPMSTR位设置是否正确。主机应设为1从机设为0。SS引脚主机 如果主机MODFEN1检查SS引脚电平。如果被意外拉低会触发MODF并自动禁用SPISPE被清0。读取MODF标志确认。6.2 能发送但接收不到数据或数据全为0/0xFF检查清单CPOL/CPHA这是最常见的原因用示波器同时测量主机的SCK和MOSI以及从机的MISO。对照数据手册检查数据采样边沿是否匹配。主从设备的CPOL和CPHA必须绝对一致。从设备是否被选中 确认从设备的SS引脚已被主机拉低。有些从设备在SS为高时会关闭MISO输出高阻态导致主机读到全10xFF。MISO引脚连接 检查MISO线路是否连接正确有无虚焊或短路。从设备本身 确认从设备是否工作正常是否需要特定的初始化序列例如某些Flash芯片需要先发送命令才能读数据。接收中断或轮询 确认是否已使能接收中断SPRIE1或在轮询SPRF标志。数据收到后必须及时从SPDRR读出否则会卡住。6.3 数据错位或字节顺序错误检查清单数据移位顺序 检查DSO位。DSO0为MSB先出DSO1为LSB先出。主从设备必须一致。常见协议如SD卡多用MSB first而有些ADC芯片用LSB first。数据位宽 检查TDS位设置。主从设备传输的数据位数必须相同。如果你配置为8位TDS7却按16位去读写寄存器就会发生错位。软件数据处理 读取SPDRR后是否根据DSO和TDS对数据进行了正确的移位和掩码操作例如12位ADC数据在16位寄存器中可能左对齐或右对齐需要移位才能得到真实值。6.4 偶尔发生数据丢失或溢出错误检查清单中断响应延迟 这是导致OVRF的主要原因。检查系统中断是否被长时间关闭全局中断禁用、高优先级中断阻塞。优化ISR代码使其尽可能短小精悍。缓冲区处理不及时 在中断服务程序中如果只是将数据复制到软件缓冲区要确保缓冲区足够大不会因为生产速度大于消费速度而被写满。考虑使用环形缓冲区。遵循安全读取序列 是否在接收ISR中遵循了“读状态-读数据-再读状态查溢出”的安全序列如果没有可能会漏检溢出。波特率过高 计算一下CPU处理中断的最坏情况时间是否超过SPI传输一帧数据的时间如果接近或超过必须降低波特率或使用DMA。6.5 调试工具与技巧逻辑分析仪 这是调试SPI的神器。可以同时捕获SCK、MOSI、MISO、SS四路信号直观地看到每一位数据、每个帧的时序。能清晰展示CPOL/CPHA配置是否正确数据内容是什么。示波器 用于观察信号质量检查是否有过冲、振铃、毛刺。测量SCK频率是否与配置相符。寄存器查看 在调试器中实时查看SPSCR等关键寄存器的值。观察SPTE、SPRF、OVRF、MODF标志的变化可以快速定位是发送卡住、接收未就绪还是发生了错误。软件模拟 在硬件问题难以排查时可以尝试将SPI引脚先配置为GPIO用软件模拟SPI时序位翻转来与从设备通信。如果软件模拟能通但硬件SPI不通问题很可能出在SPI模块的配置上。