深入解析TI McSPI控制器:从SPI协议基础到寄存器配置实战

发布时间:2026/7/22 18:38:01
深入解析TI McSPI控制器:从SPI协议基础到寄存器配置实战 1. SPI接口基础从四线制到通信协议SPI全称Serial Peripheral Interface是嵌入式世界里最经典、最常用的同步串行通信接口之一。如果你玩过单片机大概率接触过它。它不像I2C那样需要复杂的地址协议也不像UART那样需要精确的波特率匹配SPI以其简单、高速、全双工的特性成为了连接Flash、传感器、显示屏、ADC/DAC等外设的首选。它的核心思想很简单一个主设备Master控制时钟通过片选线选择从设备Slave然后主从双方在时钟的节拍下同时收发数据。SPI的物理连接通常被称为“四线制”但这只是最基础的形态。这四根线分别是SCLK (Serial Clock) 时钟信号由主设备产生是所有数据收发的节拍器。时钟的频率和相位直接决定了数据采样和锁存的时刻这是SPI配置中最关键的部分之一。MOSI (Master Out Slave In) 主设备输出从设备输入。数据从主设备流向从设备。MISO (Master In Slave Out) 主设备输入从设备输出。数据从从设备流向主设备。CS/SS (Chip Select / Slave Select) 片选信号低电平有效通常。主设备通过拉低对应从设备的CS线来“选中”它通知其准备通信。一个主设备可以连接多个从设备通过多根CS线进行管理。注意 在实际应用中你可能会遇到三线制SPI半双工共用一根数据线或更复杂的变体但四线制全双工是理解和配置的基石。SPI通信的灵活性或者说“麻烦”之处在于其时钟极性和相位的可配置性也就是常说的CPOL和CPHA。这两个参数定义了时钟的空闲状态和数据采样的边沿必须与从设备严格匹配否则通信必然失败。CPOL (Clock Polarity) 时钟极性。CPOL0表示时钟空闲时为低电平CPOL1表示时钟空闲时为高电平。CPHA (Clock Phase) 时钟相位。CPHA0表示数据在时钟的第一个边沿对于CPOL0是上升沿对于CPOL1是下降沿被采样在第二个边沿切换CPHA1则相反数据在第二个边沿被采样。这四种组合构成了SPI的四种模式Mode 0, 1, 2, 3。例如最常用的Mode 0就是CPOL0, CPHA0时钟空闲低数据在上升沿采样下降沿更新。在配置任何SPI控制器包括TI的McSPI时你首先要查清你的从设备比如一个温湿度传感器要求哪种模式然后在主设备的寄存器中对应设置。SPI的另一个特点是它没有定义数据帧的格式。数据位宽Word Length可以是4到32位传输时通常是高位MSB在前但有些设备也可能要求低位LSB在前这需要查看具体外设的数据手册。通信的启动和停止完全由CS信号控制CS有效通信开始CS无效通信结束。在此期间主设备产生时钟数据在时钟边沿被移入移出。2. TI McSPI模块架构与核心设计思路德州仪器TI在其许多处理器如Sitara系列、部分DSP中集成了名为McSPI (Multi-channel Serial Peripheral Interface)的增强型SPI控制器。它不仅仅是实现基础的SPI协议更是一个高度可配置、支持多通道、集成DMA和FIFO的通信引擎。理解其架构是进行有效寄存器编程的前提。McSPI的核心设计围绕通道Channel概念展开。一个McSPI模块通常包含多个独立的通道例如4个CH0-CH3。每个通道都有一套几乎完整的配置寄存器CHxCONF, CHxCTRL等和收发缓冲区。这意味着你可以将不同的外设分配到不同的通道每个通道可以独立配置为不同的时钟模式、位宽、速率甚至主从模式从而实现高度并发的SPI通信管理。这是它比许多单片机内置的简单SPI控制器强大的地方。模块的另一个核心是中断与DMA事件系统。McSPI为每个通道的发送TX和接收RX事件都提供了独立的中断标志和使能位。例如TX0_EMPTY表示通道0的发送缓冲区空可以写入新数据RX0_FULL表示通道0的接收缓冲区满可以读取数据。这些中断可以极大地解放CPU实现高效的事件驱动通信。更进一步它支持DMA直接存储器访问通过DMAR和DMAW寄存器位可以让DMA控制器自动搬运收发缓冲区的数据实现大批量数据传输而几乎不占用CPU时间。FIFOFirst In First Out缓冲区的引入是提升吞吐量的关键。传统的单缓冲区SPICPU或DMA必须在下一个数据字传输完成前及时服务缓冲区否则会造成上溢或下溢。McSPI的可配置FIFO深度可能是64字节、128字节等由硬件决定充当了数据的“蓄水池”允许一定程度的传输延迟使系统设计更加从容。寄存器中的FFEW和FFER位就是用来启用发送和接收FIFO的。电源与时钟管理也是工业级控制器必须考虑的部分。McSPI的SYSCONFIG寄存器提供了AUTOIDLE、SIDLEMODE、ENAWAKEUP等位用于在设备空闲时自动关断时钟以节能以及在特定事件如从设备片选激活时唤醒系统。这对于电池供电的嵌入式设备至关重要。因此配置McSPI不仅仅是设置CPOL和CPHA。你需要从一个系统设计者的角度思考用哪个通道用轮询、中断还是DMA是否启用FIFO时钟分频比是多少以满足目标速率功耗如何管理接下来的寄存器详解和配置实践就是回答这些问题的过程。3. 核心寄存器详解从全局控制到通道配置面对数十个寄存器新手容易眼花缭乱。我们可以将其分层理解全局模块寄存器、中断与系统寄存器、通道专用寄存器。下面我们挑最核心的进行拆解理解每一位的“脾气”。3.1 模块级控制寄存器MCSPI_MODULCTRL这个寄存器是McSPI的“大脑”决定了模块的基础工作模式。MS (Bit 2): 主从模式选择。0为主模式模块产生SCLK和CS1为从模式。这是首先要确定的。PIN34 (Bit 1): 引脚模式选择。这是一个关键且容易出错的配置。0是标准4引脚模式使用SPI_SCS[n]作为片选线。1是3引脚模式不使用专用的片选线片选功能可能由其他GPIO或数据包内的特定位实现。务必根据硬件连接选择选错了通信无法建立。SINGLE (Bit 0): 单/多通道模式仅主模式有效。0为多通道模式允许在多个通道间分时复用SPI总线通过切换不同的SPI_SCS[n]1为单通道模式通常用于强制某个CS线持续有效需结合FORCE位使用。在大多数多外设场景下我们使用多通道模式SINGLE0。FDAA (Bit 8): FIFO DMA地址对齐。这是一个与DMA控制器配合的高级功能。当使用FIFO且DMA控制器只支持256位对齐访问时需将此位置1此时DMA应访问MCSPI_DAFTX和MCSPI_DAFRX而非普通的TXn/RXn寄存器。一般情况下如果DMA支持任意地址访问保持为0即可。3.2 通道配置寄存器MCSPI_CH(i)CONF这是每个通道的“个性设置”中心内容最丰富。PHA (Bit 0) POL (Bit 1): 这就是前面讲的SPI模式核心。POL定义时钟空闲极性PHA定义采样相位。必须与从设备匹配。WL (Bits 11:7):字长Word Length。这个5位字段定义了每次传输的数据位数从4位0x3到32位0x1F可选。例如与一个8位ADC通信就应设置为0x78位。这是最常配错的地方之一必与外设数据位宽一致。CLKD (Bits 5:2):时钟分频器。这是设置SPI通信速率的关键。SPI时钟SCLK的频率由模块输入时钟CLKSPIREF分频得到。当CLKG0时分频系数为2的CLKD次幂。例如CLKD0x2二进制0010表示分频系数为2^24。假设CLKSPIREF为48MHz则SCLK为12MHz。计算速率时一定要考虑这个分频关系。TRM (Bits 13:12): 传输模式。0为全双工收发1为只收2为只发。根据实际需求选择。DPE0 (Bit 16) DPE1 (Bit 17) IS (Bit 18): 数据引脚使能和输入选择。这三位共同决定了数据线的用法需要参考数据手册中的“Data Lines Configurations”表格如输入资料中的Table 22-33。简单来说DPE00使能MOSI线SPI_D[0]输出DPE10使能MISO线SPI_D[1]输出作为主设备时MISO是输入此配置可能令人困惑需结合模式理解。通常在全双工模式下主设备设置DPE00使能MOSI输出DPE11禁用MISO输出因为MISO是输入引脚IS1选择SPI_D[1]即MISO线作为输入。IS位选择接收数据来自哪条线0来自SPI_D[0]1来自SPI_D[1]。FFER (Bit 28) FFEW (Bit 27): 接收/发送FIFO使能。如果硬件支持且需要FIFO缓冲则置1。注意文档注明“Only one channel can have this bit set”意味着通常只能有一个通道启用FIFO功能规划通道用途时需注意。EPOL (Bit 6): 片选信号极性。0表示片选高电平有效1表示低电平有效。绝大多数芯片是低电平有效EPOL1。3.3 中断与状态寄存器MCSPI_IRQENABLE 与 MCSPI_IRQSTATUS这是实现中断驱动通信的关键。MCSPI_IRQSTATUS: 中断状态寄存器。当某个事件如发送空、接收满、传输结束发生时对应的状态位会被硬件置1。清除中断标志的方法通常是向该位写1注意不是写0这是一个常见的操作习惯差异。MCSPI_IRQENABLE: 中断使能寄存器。你需要将IRQSTATUS中关心的事件对应的使能位置1该事件发生时才会触发CPU中断。例如使能TX0_EMPTY_ENABLE后每当通道0发送缓冲区空就会产生中断你可以在中断服务程序ISR中写入下一个要发送的数据。3.4 传输控制寄存器MCSPI_CHxCTRL 与 MCSPI_XFERLEVELMCSPI_CHxCTRL[0] EN: 这是通道的总开关。向此位写1该通道使能CS线如果配置有效激活开始传输过程。写0则停止通道。任何配置更改前都应确保EN0。MCSPI_XFERLEVEL: 传输水平寄存器主要用于FIFO和DMA控制。其中的WCNT字段可以设置通过中断或DMA传输的“字数”。当传输字数达到WCNT时会触发EOWEnd of Word Count中断。这对于需要精确控制传输数据量的场景非常有用。4. McSPI配置实战以中断方式读写为例理论说再多不如一行代码。假设我们要用TI的ARM Cortex-A8处理器如AM335x的McSPI0通道1以中断方式全双工Mode 0CPOL0CPHA0与一个8位SPI Flash通信时钟频率设为12.5MHz假设输入时钟CLKSPIREF为100MHz。以下是基于寄存器直接操作的配置步骤和代码思路。4.1 硬件与初始化准备首先需要配置处理器的引脚复用Pin Mux将SPI0_CLK, SPI0_D0MOSI SPI0_D1MISO SPI0_CS1对应通道1这几个引脚的功能设置为SPI模式而非普通的GPIO。这通常通过操作芯片的CONTROL_MODULE相关寄存器完成具体地址需查阅芯片手册。然后确保McSPI模块的时钟已经使能通过Power and Clock Management模块。接着对McSPI模块进行全局初始化。// 假设 McSPI0 的基地址为 0x48030000 #define MCSPI0_BASE 0x48030000 #define MCSPI_SYSCONFIG (*(volatile unsigned int *)(MCSPI0_BASE 0x110)) #define MCSPI_MODULCTRL (*(volatile unsigned int *)(MCSPI0_BASE 0x128)) #define MCSPI_CH1CONF (*(volatile unsigned int *)(MCSPI0_BASE 0x140)) #define MCSPI_CH1CTRL (*(volatile unsigned int *)(MCSPI0_BASE 0x148)) #define MCSPI_IRQENABLE (*(volatile unsigned int *)(MCSPI0_BASE 0x11C)) #define MCSPI_IRQSTATUS (*(volatile unsigned int *)(MCSPI0_BASE 0x118)) void mcspi_init(void) { // 1. 软件复位模块 (可选但推荐在初始化工序中执行) MCSPI_SYSCONFIG (1 1); // 将SOFTRESET位写1 while(!(MCSPI_SYSSTATUS 0x1)); // 等待复位完成RESETDONE位变1 // 2. 配置模块控制寄存器主模式、4引脚、多通道 MCSPI_MODULCTRL 0x0; // MS0(主), PIN340(4pin), SINGLE0(多通道) // 3. 配置系统使能自动空闲时钟门控以省电 MCSPI_SYSCONFIG (1 0); // AUTOIDLE 1 }4.2 通道参数精细配置接下来针对通道1进行通信参数配置。这是最核心的步骤。void mcspi_ch1_config(void) { // 在配置前确保通道是禁用的 MCSPI_CH1CTRL ~(0x1); // 清除EN位 // 计算时钟分频值: 目标SCLK CLKSPIREF / (2^CLKD) // CLKSPIREF 100MHz, 目标 SCLK 12.5MHz // 分频系数 100 / 12.5 8 2^3 // 因此 CLKD 3 (二进制 0011) unsigned int clk_div 3; // 对应分频系数8 // 组装 MCSPI_CH1CONF 寄存器的值 unsigned int ch1conf_value 0; // 1. 基本SPI模式: CPOL0, CPHA0 (Mode 0) // PHA0, POL0 // Bits [1:0] 0b00 // 2. 时钟分频: CLKD 3 // Bits [5:2] 0b0011 ch1conf_value | (clk_div 2); // 3. 片选极性: 低电平有效 (常见) // EPOL 1 // Bit 6 1 ch1conf_value | (1 6); // 4. 字长: 8 bits // WL 7 (0x7) - 8位 // Bits [11:7] 0b00111 ch1conf_value | (7 7); // 5. 传输模式: 全双工发送接收 // TRM 0 // Bits [13:12] 0b00 // 6. 数据引脚配置: 主设备全双工 // IS 1 (接收数据来自 SPI_D[1] 即 MISO) // DPE1 1 (SPI_D[1] 不用于输出因为它是我们的输入线) // DPE0 0 (SPI_D[0] 用于输出即 MOSI) // Bits [18:16] 0b1 1 0 ch1conf_value | (1 18); // IS ch1conf_value | (1 17); // DPE1 // DPE0 默认为0无需设置 // 7. 不使用FIFO、Turbo等高级功能首次配置保持简单 // FFEW0, FFE0, TURBO0, CLKG0等保持默认0 // 8. 片选控制时间 (TCS) 和起始位 (SBE) 根据外设要求设置这里用默认 // TCS 0 (0.5个时钟周期), SBE0 // 将配置写入寄存器 MCSPI_CH1CONF ch1conf_value; // 9. 配置中断我们希望在发送缓冲区空时得到中断以便连续发送 // 使能 TX1_EMPTY 中断 (对应 MCSPI_IRQENABLE[4]) MCSPI_IRQENABLE | (1 4); // 同时如果也需要在接收满时中断可以开启 RX1_FULL_ENABLE (Bit 6) // MCSPI_IRQENABLE | (1 6); // 10. 清除可能存在的旧中断标志 MCSPI_IRQSTATUS 0xFFFFFFFF; // 向所有状态位写1以清除 }4.3 中断服务程序与数据传输流程配置好硬件后我们需要编写中断服务程序ISR来处理数据传输。这里以发送一串数据为例采用“发送空中断”来驱动。// 假设有一个发送数据缓冲区和一个索引 unsigned char tx_buffer[] {0x03, 0x00, 0x00, 0x00}; // 假设是Flash读命令 unsigned int tx_index 0; unsigned int tx_length sizeof(tx_buffer); // 接收缓冲区 unsigned char rx_buffer[10]; unsigned int rx_index 0; void SPI_IRQ_Handler(void) { // 假设这是连接到的系统中断处理函数 unsigned int irq_status MCSPI_IRQSTATUS; // 处理通道1发送空中断 if (irq_status (1 4)) { // TX1_EMPTY 位 if (tx_index tx_length) { // 发送缓冲区空写入下一个数据 // 注意数据寄存器是32位但我们的字长是8位写入低8位即可 MCSPI_TX1 tx_buffer[tx_index]; } else { // 所有数据已发送完毕禁用发送空中断避免持续进入中断 MCSPI_IRQENABLE ~(1 4); // 可以在这里设置一个标志通知主程序发送完成 } // 清除 TX1_EMPTY 中断标志 (写1清除) MCSPI_IRQSTATUS (1 4); } // 处理通道1接收满中断 (如果使能了) if (irq_status (1 6)) { // RX1_FULL 位 // 读取接收到的数据 rx_buffer[rx_index] MCSPI_RX1 0xFF; // 读取低8位 // 清除 RX1_FULL 中断标志 MCSPI_IRQSTATUS (1 6); } // 处理传输结束中断 (如果使用了字计数功能) if (irq_status (1 17)) { // EOW 位 // 传输字数达到预设值进行后续处理 // ... MCSPI_IRQSTATUS (1 17); // 清除EOW标志 } } // 主程序中的启动函数 void start_spi_transfer(void) { // 1. 确保配置已完成 mcspi_init(); mcspi_ch1_config(); // 2. 重置发送/接收索引 tx_index 0; rx_index 0; // 3. 先手动写入第一个数据到发送寄存器以启动传输链 MCSPI_TX1 tx_buffer[tx_index]; // 4. 使能通道开始传输CS线会随之激活。 MCSPI_CH1CTRL | 0x1; // 设置EN位为1 // 5. 此后传输将由中断服务程序驱动。 // 主程序可以去做其他事情或者等待一个“传输完成”的标志。 }实操心得在使能通道EN1前先往发送寄存器TXn里写入第一个数据是一个好习惯。因为一旦使能通道如果发送寄存器为空可能会立即触发发送下溢TX_UNDERFLOW错误取决于硬件。先填一个数据进去可以确保传输平滑开始。5. 高级功能与性能优化技巧掌握了基础配置和中断驱动后可以探索McSPI的高级功能来提升系统性能和可靠性。5.1 DMA与FIFO的协同使用对于大数据量传输如图像数据刷屏、音频流、大块Flash读写使用DMA是必须的。配置步骤如下启用FIFO在MCSPI_CHxCONF中设置FFEW1和/或FFER1。注意文档限制通常只有一个通道能使用FIFO。配置DMA请求在MCSPI_CHxCONF中设置DMAW1使能DMA写请求用于发送和DMAR1使能DMA读请求用于接收。配置传输量在MCSPI_XFERLEVEL寄存器中设置WCNT字段指定要通过DMA传输的总字数。配置DMA控制器在系统的DMA控制器中设置源地址内存发送缓冲区、目标地址MCSPI_TXx或MCSPI_DAFTX、传输数据宽度与SPI字长匹配、传输数量与WCNT一致并启用DMA通道。启动传输使能SPI通道EN1。DMA控制器会自动将数据从内存搬运到SPI发送FIFO或从接收FIFO搬运到内存。传输完成后可能会产生EOW中断通知CPU。优势CPU完全被解放仅需处理传输开始和结束事件数据传输由DMA硬件完成效率极高且避免了因中断响应延迟导致的数据丢失。5.2 功耗管理与唤醒机制在电池供电设备中功耗至关重要。McSPI提供了灵活的电源管理AUTOIDLE (MCSPI_SYSCONFIG[0]) 置1时模块在检测到内部OCP接口空闲时会自动门控其时钟节省动态功耗。SIDLEMODE (MCSPI_SYSCONFIG[4:3]) 设置模块对系统空闲请求的响应模式。0Force-idle无条件进入空闲中断/DMA请求被取消。最省电但响应慢。1No-idle从不空闲功耗高响应最快。2Smart-idle智能空闲根据模块内部状态决定是否响应系统空闲请求。是功耗和响应速度的平衡之选。唤醒功能 在从设备模式下当主设备拉低片选线SPI_SCS[n]时可以唤醒处于休眠状态的处理器。在MCSPI_SYSCONFIG中设置ENAWAKEUP1使能模块的唤醒能力。在MCSPI_WAKEUPENABLE中设置WKEN1允许片选事件触发唤醒。在对应通道的MCSPI_CHxCONF中正确配置SPIENSLV指定监听哪个片选线。 当系统进入低功耗模式后一旦指定的片选线被激活McSPI会产生一个唤醒事件将系统从休眠中唤醒。5.3 多通道管理与时序优化多通道分时复用 当SINGLE0多通道模式时McSPI模块可以在不同通道间切换。关键在于SPI_SCS[n]信号。每个通道可以独立配置但共享SPI_SCLK,SPI_MOSI,SPI_MISO线。当使能某个通道时其对应的SPI_SCS[n]线会根据EPOL配置有效其他通道的CS线无效。这要求软件在切换通道时先禁用当前通道EN0再配置并启用下一个通道。硬件不会自动管理通道切换。Turbo模式 (TURBO位) 当进行连续的多字传输时将此位置1可以消除字与字之间的间隔最大化总线利用率提升吞吐量。注意这要求从设备能够支持连续的背靠背back-to-back传输。芯片选择建立/保持时间 (TCS位) 有些时序敏感的外设对CS信号相对于SCLK第一个和最后一个边沿的时间有要求。TCS字段可以配置这个延迟0.5, 1.5, 2.5, 3.5个时钟周期以满足外设的时序规格书要求。6. 调试排错与常见问题实录SPI调试是嵌入式开发的必修课。以下是我在实际项目中踩过的坑和总结的排查思路。6.1 问题排查清单现象可能原因排查步骤与解决方案完全无通信1. 引脚复用未配置。2. 模块时钟未使能。3. 主从模式配置错误。4. 片选信号问题。1. 用示波器或逻辑分析仪检查SCLK、MOSI、CS引脚是否有信号。如果没有首先检查Pin Mux配置和时钟使能。2. 确认MS位主从设置正确。3. 确认PIN34模式选择正确4线/3线。4. 检查CS线是否被正确拉低主模式或检测从模式。确认EPOL极性设置与外设匹配。能发送但接收全是0或0xFF1. MISO/MOSI线接反。2.IS,DPE0,DPE1配置错误。3. 从设备未正常工作或未选中。1. 核对硬件连接主设备的MISO应接从设备的MISO或DO。2.重点检查MCSPI_CHxCONF中的IS,DPE0,DPE1位。对于主设备全双工典型配置是IS1从MISO读DPE11MISO线不输出DPE00MOSI线输出。3. 确保从设备已上电且其CS引脚被正确拉低。数据错位或乱码1. SPI模式CPOL/CPHA不匹配。2. 数据位宽WL不匹配。3. 字节序MSB/LSB不匹配。4. 时钟速率过高。1.这是最常见的原因。用逻辑分析仪捕获SPI波形对照从设备数据手册检查SCLK空闲电平和数据采样边沿是否一致。调整POL和PHA位。2. 确认WL设置与从设备数据帧长度一致例如很多设备是8位或16位。3. 大部分SPI设备是MSB先行但少数是LSB先行。如果数据位反转需在软件中处理。4. 降低CLKD分频值降低SCLK频率再试。中断无法触发1. 中断使能位未开启。2. 中断标志清除方式错误。3. CPU全局中断未开启或向量表未配置。4. 中断共享问题。1. 确认MCSPI_IRQENABLE中对应位置1。2.牢记McSPI是写1清除中断标志不是写0。在ISR中读取MCSPI_IRQSTATUS后向对应位写1清除。3. 确认处理器内核的中断全局使能并且McSPI模块的中断线已正确连接到中断控制器向量表配置正确。4. 如果多个中断源共享一个中断线需要在ISR中遍历检查所有可能的中断状态寄存器。DMA传输不工作1. DMA请求未使能。2. FIFO未启用如果使用。3. DMA控制器配置错误地址、数据宽度、传输量。4. 数据对齐问题。1. 确认MCSPI_CHxCONF中DMAW/DMAR已置1。2. 如果使用FIFO缓冲确保FFEW/FFER已置1且注意FDAA位对齐设置。3. 仔细检查DMA控制器的源/目标地址、传输数据宽度8/16/32位需与SPI字长匹配、传输总数设置。4. 确保内存缓冲区地址符合DMA控制器的对齐要求。通信不稳定偶尔出错1. 电源噪声或地线问题。2. 时钟抖动过大。3. 布线过长信号完整性差。4. 未正确处理FIFO溢出/下溢。1. 检查电源滤波确保地线连接良好且低阻抗。2. 在靠近MCU的SPI时钟线上串联一个小电阻如22-100欧姆以减少振铃。3. 高速或长距离通信时考虑使用屏蔽线或降低速率。4. 在中断服务程序中检查TX_UNDERFLOW和RX_OVERFLOW状态位并设计相应的错误恢复机制如重置FIFO、重发。6.2 调试工具与技巧逻辑分析仪是神器 一个支持SPI协议解码的逻辑分析仪如Saleae能直观地显示SCLK、MOSI、MISO、CS上的波形和数据是排查时序、模式、数据问题最快最直接的工具。没有它调试SPI就像蒙着眼睛走路。寄存器查看 在调试器如CCS, GDB中实时查看McSPI的关键寄存器值特别是状态寄存器IRQSTATUS,CHxSTAT确认中断标志是否置起通道状态EOT,TXFFE等是否正常。从简到繁 先使用轮询Polling方式实现最基本的收发功能。轮询代码简单易于设置断点调试。确认底层通信无误后再改为中断方式最后再尝试DMA。这样可以隔离问题避免软硬件问题交织。利用系统测试模式MCSPI_SYST寄存器可以手动控制SPI引脚的电平方向和数据值。在怀疑硬件连接问题时可以用这个模式将MOSI引脚配置为输出并写一个固定的值然后用万用表或示波器测量快速验证引脚和通路是否正常。配置SPI寄存器尤其是像TI McSPI这样功能丰富的控制器是一个从理解协议到掌握硬件细节的实践过程。开始时可能会被众多的寄存器位吓到但按照“全局配置 - 通道参数 - 中断/DMA - 高级优化”的步骤结合逻辑分析仪进行验证一步步下来你会发现它其实是一套逻辑清晰、功能强大的工具。最终的目标是让SPI这个“车轮”在你的系统里平稳、高效地转起来可靠地服务于上层应用。