1. SPI通信协议与MSPM0 UNICOMM-SPI模块概述在嵌入式系统开发中微控制器与外围设备如传感器、存储器、显示屏驱动芯片等之间的高效数据交换是核心任务之一。SPISerial Peripheral Interface协议因其简单、高速、全双工的特性成为了这类短距离通信的基石。它不像I2C那样需要复杂的地址寻址和应答机制而是通过一个主设备Controller通常为MCU控制一个或多个从设备Peripheral利用时钟线SCLK、片选线CS以及两根数据线PICO/MOSI, POCI/MISO实现数据的同步收发。这种“一主多从”的架构使得SPI在需要高带宽、低延迟的应用场景中如读取高速ADC数据或驱动TFT屏幕具有无可替代的优势。然而SPI协议本身只是一个宽泛的框架其具体的电气特性和时序细节尤其是时钟极性与相位、数据帧的起止边界并没有一个全球统一的标准。这就催生了两种在工业界广泛应用的实现变体Motorola SPI帧格式和Texas InstrumentsTI同步串行帧格式。这两种格式的核心差异在于时钟空闲状态、数据捕获边界的定义以及片选信号在整个传输周期中的行为。对于嵌入式工程师而言理解这些差异并能在硬件层面正确配置是确保通信稳定可靠的第一步。德州仪器的MSPM0 L系列微控制器其内置的UNICOMM-SPI模块正是这样一个高度灵活且功能强大的通信外设。它不仅完整支持上述两种帧格式还集成了深度可配置的FIFO、多种中断源以及DMA触发机制旨在最大化数据吞吐效率并减轻CPU负担。本篇文章将从一个资深嵌入式开发者的视角深入拆解Motorola与TI两种SPI帧格式的时序奥秘并手把手带你剖析MSPM0 UNICOMM-SPI模块的关键寄存器配置、中断与DMA的使用策略以及在实际项目中容易踩到的“坑”。无论你是正在评估MSPM0芯片还是已经深陷SPI通信调试的泥潭相信这里的细节和经验都能为你提供直接的帮助。2. Motorola与TI SPI帧格式的深度解析与时序实战要正确驱动一个SPI外设第一步永远是看懂它的数据手册中的时序图。而时序图的核心就是帧格式。MSPM0的UNICOMM-SPI模块通过CTL0.FRFFrame Format位域来切换这两种模式。选择错误通信必然失败。2.1 Motorola SPI帧格式极性与相位的四种组合Motorola格式是SPI协议中最经典和最常见的实现。它的时序由两个关键参数决定时钟极性SPOClock Polarity和时钟相位SPHClock Phase。通过CTL0寄存器的SPO和SPH位进行配置可以产生四种模式通常被称为模式0到模式3。时钟极性SPO决定了SCLK线在空闲状态即CS为高电平无数据传输时的电平。SPO 0SCLK空闲时为低电平。SPO 1SCLK空闲时为高电平。时钟相位SPH决定了数据在SCLK的哪个边沿被采样捕获以及在哪个边沿被更新移位输出。SPH 0数据在SCLK的第一个边沿即从空闲状态跳变后的第一个边沿被捕获在第二个边沿更新。SPH 1数据在SCLK的第二个边沿被捕获在第一个边沿更新。你提供的文档图27-6展示的是SPO1, SPH1即模式3的配置。我们来详细拆解这个时序空闲期IdleCS为高SCLK为高由SPO1决定。此时主设备的PICO即MOSI输出被强制拉低。这是一个很重要的细节可以避免总线在空闲时浮空产生干扰。传输启动当SPI控制器使能且TX FIFO中有数据时主设备将CS拉低。这标志着一次传输的开始。紧接着主设备的PICO输出引脚被使能。第一个半周期与数据使能在CS拉低后经过半个SCLK周期主设备和从设备的数据才被使能到各自的传输线上。同时SCLK产生一个下降沿从高到低的跳变。这个“半个周期”的延迟是SPH1模式下的关键特征它为从设备提供了足够的建立时间Setup Time来准备数据。数据捕获与更新在SPO1, SPH1模式下数据在SCLK的上升沿被捕获采样在下降沿被更新移位输出。这意味着主设备在SCLK下降沿改变PICO上的数据从设备在随后的SCLK上升沿读取这个稳定的数据。同时从设备也在SCLK下降沿改变POCI上的数据主设备在下一个上升沿读取。传输结束单字传输所有比特传输完毕后在最后一位被捕获后的一个完整SCLK周期CS线返回高电平空闲状态。连续背靠背传输CS线在多个数据字之间保持低电平直到最后一个字的最后一位被捕获后才返回高电平。实操心得模式选择的“潜规则”大多数SPI设备的数据手册会明确要求使用哪种模式Mode 0, 1, 2, 3。最常见的组合是SPO0, SPH0模式0和SPO0, SPH1模式1。一个快速记忆方法是关注数据捕获的边沿。对于从设备如传感器你只需要关心它在哪个边沿采样你的数据。通常SPH0意味着在SCLK的第一个边沿对于SPO0是上升沿对于SPO1是下降沿采样SPH1则在第二个边沿采样。配置时务必与从设备手册严格一致。2.2 TI同步串行帧格式独特的片选脉冲TI同步串行帧格式是另一种流行的标准尤其在TI自家的许多外设中使用。它与Motorola格式的一个显著区别在于CS在TI文档中常称为FSX或FSS信号的行为。根据文档图27-7TI格式的时序特点如下空闲期IdleSCLK和CS都被强制拉为低电平。主设备的PICO输出引脚处于高阻态Tristate。这与Motorola格式中CS和SCLK可配置为高或低不同TI格式的空闲状态是固定的。传输启动当TX FIFO底部有数据时CS线会被拉高一个SCLK周期。这个脉冲信号标志着帧的开始。同时待发送的数据从TX FIFO转移到发送逻辑的串行移位寄存器中。数据移出在CS脉冲后的下一个SCLK上升沿数据帧的最高有效位MSB从PICO引脚移出。同样外部从设备的MSB也在此刻移出到POCI线上。数据捕获在SCLK的每个下降沿SPI主设备和外部从设备都将数据位采样到各自的串行移位器中。这是一个关键区别在TI格式下数据总是在SCLK的下降沿被捕获。数据存储在最低有效位LSB被锁存后第一个SCLK上升沿将接收到的数据从串行移位器传输到RX FIFO。传输结束CS线在帧结束后恢复低电平。SCLK在空闲期同样保持不活动状态。注意事项TI格式的片选行为TI格式的CS信号是一个短暂的脉冲而非整个传输期间都保持有效的片选。这意味着它更像一个“帧同步”信号。在设计硬件连接时需要确保从设备支持这种脉冲式片选。许多标榜“SPI兼容”的设备实际上只支持Motorola格式的常低片选。误用格式会导致从设备无法正确识别帧起始。2.3 两种格式的对比与选型指南为了更直观地对比我将两种格式的核心差异总结如下表特性Motorola SPI 帧格式TI 同步串行帧格式配置位CTL0.FRF 0(3线) 或1(4线)CTL0.FRF 2空闲状态CS高SCLK由SPO决定0低1高CS低SCLK低片选(CS)行为在整个数据字传输期间保持有效低电平在每个数据字开始前产生一个SCLK周期的高电平脉冲数据捕获边沿由SPO和SPH共同决定可以是上升沿或下降沿固定为SCLK下降沿数据更新边沿与捕获边沿相反SCLK上升沿MSB移出典型应用绝大多数SPI Flash、传感器、ADC/DAC某些TI专属外设部分音频编解码器选型建议优先遵从从设备手册这是铁律。从设备要求什么格式主设备就必须配置成什么格式。Motorola格式的通用性在不确定或需要兼容多种设备时Motorola格式尤其是模式0和模式3是更安全的选择其支持度最广。TI格式的特殊考量仅在明确知道从设备支持TI格式时使用。它的脉冲式CS可以减少总线切换在某些多从机系统中可能有优势但通用性较差。3. MSPM0 UNICOMM-SPI模块的寄存器配置详解理解了帧格式我们接下来就要在MSPM0的寄存器层面进行配置。UNICOMM-SPI的寄存器虽然看起来繁多但按照功能模块化理解就会清晰很多。配置的核心流程通常遵循时钟源配置 - 引脚复用 - 基本参数设置 - 中断/DMA配置 - 使能模块。3.1 时钟与基础控制寄存器配置SPI通信的速率和稳定性首先取决于时钟的精确配置。1. 时钟源选择与分频 (CLKSEL,CLKDIV,CLKCTL)SPI模块的工作时钟SPIclk来源于系统时钟。CLKSEL寄存器用于选择异步或同步的时钟源如PLL、HFCLK、SYSCLK等。对于大多数应用选择系统主时钟SYSCLK即可。 确定了源时钟频率后需要通过CLKDIV和CLKCTL.SCR进行分频以得到最终的SPI比特率。CLKDIV.RATIO对源时钟进行一个粗分频1-8分频。CLKCTL.SCR进行精细分频。SPI的比特率计算公式为SPI Bit Rate SPIclk / ((SCR 1) * 2)。例如系统时钟SPIclk为32MHz目标SPI波特率为4Mbps。则SCR (SPIclk / (Bit Rate * 2)) - 1 (32e6 / (4e6 * 2)) - 1 3。配置SCR3即可。2. 核心控制寄存器0 (CTL0)这个寄存器定义了SPI通信的基本范式。FRF[1:0]帧格式选择。00Motorola 3线01Motorola 4线10TI格式11保留。SPO和SPH如前所述用于配置Motorola格式的时钟极性和相位。在TI格式下这两位通常被忽略。DSS[4:0]数据大小选择。支持4位到16位的数据帧长度。例如发送8位数据则配置DSS0x7对应8位。重要提示当数据长度小于16位时写入TXDATA的数据必须右对齐未使用的高位会被硬件忽略。读取RXDATA时数据也是右对齐的。CSSEL[1:0]选择使用哪个片选线CS0-CS3。在控制器模式下可以动态更改在从设备模式下必须在使能模块前配置好。PACKEN打包使能。当使能时一次32位的写操作会向TX FIFO压入两个16位数据一次32位的读操作会从RX FIFO弹出两个16位数据。这可以提升总线利用率适合连续大批量传输。3. 核心控制寄存器1 (CTL1)这个寄存器包含了一些高级控制和模式选择。ENABLESPI模块总使能位。必须在所有配置完成后最后设置。在修改CTL0、CTL1除ENABLE外等关键配置前必须先清除此位。CP控制器/外设模式选择。1控制器模式0外设模式。MSB数据传输顺序。0LSB先传1MSB先传。需与外设保持一致。LBM回环模式使能。用于模块自测试将发送端数据直接环回到接收端不经过外部引脚。调试时非常有用。POD外设输出禁用在多外设系统中当控制器广播数据时只有一个外设应驱动数据线。将此位置1可以禁用特定外设的输出驱动避免总线冲突。PREN和PES奇偶校验使能和校验类型选择偶校验/奇校验。用于增加通信的可靠性。RXTIMEOUT接收超时值配置仅外设模式。当SCLK线长时间无活动且RX FIFO中有数据时会触发超时中断。3.2 状态寄存器与FIFO操作状态寄存器 (STAT)这个只读寄存器提供了SPI模块的实时状态是编写健壮驱动程序的基础。BUSY最常用的标志位。为1表示SPI正在发送或接收数据。在启动一次传输或查询传输是否完成时都需要检查此位。TXFE/TXFFTX FIFO空/满标志。用于判断是否可以写入新数据。RXFE/RXFFRX FIFO空/满标志。用于判断是否有新数据可读。CDMODE反映当前的命令/数据模式计数值。在启用CDENABLE使用CS3作为C/D线时有用。FIFO操作与中断水平选择 (IFLS)UNICOMM-SPI模块内置了TX和RX FIFO深度取决于具体型号。IFLS寄存器用于设置触发中断或DMA请求的FIFO阈值。TXIFLSEL设置TX FIFO中断触发水平。例如设置为21/2空时当TX FIFO中的数据量少于或等于一半时会触发TX中断提示CPU可以填充更多数据。RXIFLSEL设置RX FIFO中断触发水平。例如设置为21/2满时当RX FIFO中的数据量达到或超过一半时会触发RX中断提示CPU可以读取数据。TXCLR/RXCLR写1可分别清空TX和RX FIFO。在模块初始化或错误恢复时常用。数据寄存器 (TXDATA,RXDATA)TXDATA写入数据到此寄存器数据被压入TX FIFO。如果FIFO已满写入操作会被阻塞或丢失取决于具体实现。RXDATA从此寄存器读取数据数据从RX FIFO弹出。如果FIFO为空读取将返回未定义值或上次读取的值。配置流程示例控制器模式8位数据模式02Mbps假设系统时钟为32MHz目标波特率2Mbps。禁用SPI模块CTL1.ENABLE 0。配置IOMUX将对应GPIO引脚复用为SPI功能SCLK, PICO, POCI, CS。配置时钟CLKSEL选择系统时钟源。计算SCR (32e6 / (2e6 * 2)) - 1 7设置CLKCTL.SCR 7。CLKDIV可根据需要设置此处用默认值1分频。配置CTL0FRF0(Motorola)SPO0,SPH0(模式0)DSS0x7(8位)CSSEL选择使用的CS线。配置CTL1CP1(控制器模式)MSB1(MSB先传常见)LBM0其他如奇偶校验按需设置。配置IFLS根据应用设置中断阈值例如TXIFLSEL2,RXIFLSEL2。配置中断使能IMASK和DMA如果需要。最后使能模块CTL1.ENABLE 1。4. 中断系统与DMA传输的实战应用对于高效的数据传输轮询STAT寄存器的方式会大量占用CPU资源。UNICOMM-SPI提供了丰富的中断事件和DMA触发机制可以实现“后台”数据传输。4.1 中断事件详解与处理流程中断相关的寄存器组CPU_INT包括IIDX中断索引、IMASK中断掩码、RIS原始中断状态、MIS屏蔽后中断状态、ISET软件置位、ICLR软件清除。关键中断源及其含义RX/TX最常用的中断。当RX FIFO数据达到IFLS.RXIFLSEL设定的水平或TX FIFO数据低于IFLS.TXIFLSEL设定的水平时触发。用于流控。RXFIFO_OVFRX FIFO溢出。发生此中断意味着数据丢失通常是由于CPU读取速度跟不上SPI接收速度所致。需要检查并优化代码或启用DMA。TXFIFO_UNFTX FIFO下溢仅外设模式。当控制器送来时钟但外设的TX FIFO已空时触发。外设需要及时填充数据。RTOUT接收超时仅外设模式。当SCLK线长时间无活动且RX FIFO非空时触发。可用于检测通信中断。IDLESPI进入空闲状态。一次传输序列完成时触发。DMA_DONE_RX/DMA_DONE_TXDMA传输完成中断。中断处理流程以RX中断为例使能中断在IMASK寄存器中将RX位bit 2置1。中断发生当RX FIFO数据量达到阈值RIS.RX位被硬件置1。如果IMASK.RX也为1则MIS.RX变为1并向CPU产生中断请求。中断服务程序ISR读取IIDX寄存器。硬件会自动返回最高优先级的中断索引例如0x03对应RX中断并自动清除该中断在RIS和MIS中的标志位。这是自动清除方式。或者在ISR中根据MIS寄存器判断中断源然后通过向ICLR寄存器的对应位写1来手动清除中断标志。数据处理在RX中断的ISR中循环读取RXDATA寄存器直到STAT.RXFE变为1FIFO空或数据量低于阈值以防止中断频繁触发。避坑指南中断标志清除务必仔细阅读数据手册关于中断清除的说明。对于IIDX读取自动清除的方式在ISR中只需读一次IIDX即可。对于手动清除方式写ICLR要确保在离开ISR前清除所有已处理的中断标志否则会导致中断持续触发系统卡死。混合使用两种方式可能导致意外行为建议统一采用一种。4.2 DMA传输配置指南对于大数据块传输如读写SPI Flash、传输图像数据使用DMA可以彻底解放CPU。UNICOMM-SPI提供了独立的DMA_TRIG_RX和DMA_TRIG_TX事件发布者来触发DMA传输。DMA传输的核心思想当SPI的TX FIFO有空位或RX FIFO有数据时自动触发DMA控制器将内存中的数据搬运到TXDATA寄存器或将RXDATA寄存器的数据搬运到内存整个过程无需CPU干预。配置SPI以触发DMA以RX DMA为例使能DMA触发在DMA_TRIG_RX.IMASK寄存器中使能RX触发位。配置DMA通道以MSPM0的DMA架构为例 a.选择通道选择一个可用的DMA通道。 b.配置触发源在DMA通道的触发控制寄存器如DMA_CH[n].DMATCTL中设置触发源为UNICOMM-SPI的RX事件。 c.配置地址 * 源地址 (DMASA)设置为SPI的RXDATA寄存器地址。这是一个外设地址DMA从此读取数据。 * 目的地址 (DMADA)设置为SRAM中接收缓冲区的地址。DMA将数据写入此处。 d.配置传输属性 * 数据宽度 (DMADSTWDTH,DMASRCWDTH)设置为8位或16位与SPI的DSS设置匹配。 * 地址增量源地址RXDATA设置为不增量No Change因为总是读取同一个寄存器。目的地址SRAM设置为递增Increment。 * 传输数量 (DMASZ)设置需要传输的数据总量如字节数。 e.使能DMA通道设置DMAEN位。配置SPI以触发DMATX DMA配置同理触发源改为TX事件源地址是SRAM发送缓冲区目的地址是TXDATA寄存器。实操心得DMA与FIFO阈值的协同DMA的触发同样受IFLS.RXIFLSEL和IFLS.TXIFLSEL控制。例如设置RXIFLSEL为“1/2满”那么当RX FIFO数据达到一半时才会触发DMA请求去读取数据。合理的阈值设置可以平衡响应速度和中断/DMA请求频率。对于大数据量连续传输建议将阈值设得高一些如3/4满以减少触发次数提升效率。对于低延迟要求的小数据包可以设置较低的阈值如1/4满。5. 常见问题排查与调试技巧实录即使理解了所有寄存器实际调试SPI通信时依然会遇到各种问题。下面是我在多年项目中总结的一些典型故障场景和排查手段。5.1 通信完全无响应的排查清单检查最基本的三要素电源与地确保主从设备共地电源电压符合要求。物理连接用万用表或示波器检查SCLK、PICO、POCI、CS四根线3线模式则无POCI是否连通有无短路到电源或地。引脚复用这是新手最常犯的错误。确认MCU的SPI引脚已通过IOMUX正确配置为SPI功能而非默认的GPIO。查阅MSPM0的引脚复用表并检查对应的IOMUX寄存器配置。确认电气电平如果主从设备电压不同如MCU是3.3V外设是5V需要电平转换电路不能直接连接。示波器/逻辑分析仪是终极武器先看CS和SCLK发送数据时CS线是否按预期拉低SCLK上是否有脉冲如果SCLK没有波形检查SPI模块是否已使能CTL1.ENABLE1以及时钟配置CLKSEL,CLKCTL是否正确。再看数据线在SCLK和CS都正常的前提下观察PICO主机输出线上是否有随SCLK变化的数据波形如果主机有输出但从机无回应检查从机是否已上电、使能以及模式控制器/外设是否设反。对照时序图将示波器捕获的波形与芯片手册中的时序图Motorola或TI格式严格对比。重点关注CS有效到第一个SCLK边沿的延迟。数据是在SCLK的哪个边沿上升/下降稳定建立和保持时间。CS在传输结束后的释放时间。5.2 数据错位或字节顺序错误MSB/LSB设置错误检查CTL1.MSB位。大多数设备是MSB先传但有些如某些音频芯片是LSB先传。这个必须与外设手册一致。数据位宽不匹配检查CTL0.DSS设置的数据位宽是否与外设期望的相同。例如外设是12位ADC但SPI配置为8位就会导致数据错乱。FIFO打包问题如果使能了PACKEN打包那么一次32位写操作会向TX FIFO压入两个16位数据。如果实际数据帧不是16位的整数倍或者读写操作不是32位对齐的就会导致数据拼接错误。在不确定时先关闭打包功能。5.3 使用调试工具与软件技巧充分利用回环模式将CTL1.LBM置1使能内部回环。在此模式下发送的数据会被直接环回到接收端。编写一个简单的测试程序发送一组已知数据如0xAA,0x55然后读取接收数据。如果回环测试通过证明SPI模块本身的配置、时钟、数据路径是正常的问题可能出在外部电路或从设备上。模拟器与单步调试在IDE如CCS或IAR中使用仿真器单步执行SPI初始化代码观察关键寄存器CTL0,CTL1,CLKCTL的值是否按预期设置。在发送数据后观察STAT.BUSY位的变化以及TXDATA/RXDATA寄存器的值。超时机制在发送或接收数据时不要无限等待BUSY标志或中断。添加一个基于系统滴答定时器的超时判断。例如等待BUSY变低如果超过10ms仍为高则判定为通信超时进行错误处理并复位SPI模块。这能防止程序因硬件故障而死锁。FIFO状态监控在中断或DMA处理函数中除了处理数据还应监控STAT.RXFF满和STAT.RXFE空标志确保不会溢出或读空。特别是在高波特率下CPU处理速度可能成为瓶颈。5.4 多从机系统与片选管理UNICOMM-SPI支持多个硬件CS线CS0-CS3。在驱动多个SPI从设备时硬件CS为每个从设备分配独立的CS引脚。在传输前通过配置CTL0.CSSEL来选择对应的CS线硬件会自动控制其拉低和拉高。这是最可靠的方式。软件GPIO模拟CS如果硬件CS线不够用可以将额外的GPIO配置为输出在传输前后手动拉低和拉高。注意手动控制CS时要严格遵循时序图确保CS在SCLK空闲期间变化并满足从设备要求的建立和保持时间。CS_MASK_ROTATE功能这是一个高级功能用于在连续传输中自动轮询多个CS线。需要仔细配置CSx_ROTATE_MASK寄存器。在常规应用中手动控制CS更为直观。调试SPI通信耐心和系统性排查是关键。从电源、地线、连接等硬件基础开始再到软件配置的每一个比特最后用仪器验证波形。把问题分解逐一验证总能找到症结所在。MSPM0的UNICOMM-SPI模块功能全面一旦配置正确其稳定性和性能都非常出色。
SPI通信协议深度解析:Motorola与TI帧格式对比及MSPM0配置实战
发布时间:2026/6/30 8:31:41
1. SPI通信协议与MSPM0 UNICOMM-SPI模块概述在嵌入式系统开发中微控制器与外围设备如传感器、存储器、显示屏驱动芯片等之间的高效数据交换是核心任务之一。SPISerial Peripheral Interface协议因其简单、高速、全双工的特性成为了这类短距离通信的基石。它不像I2C那样需要复杂的地址寻址和应答机制而是通过一个主设备Controller通常为MCU控制一个或多个从设备Peripheral利用时钟线SCLK、片选线CS以及两根数据线PICO/MOSI, POCI/MISO实现数据的同步收发。这种“一主多从”的架构使得SPI在需要高带宽、低延迟的应用场景中如读取高速ADC数据或驱动TFT屏幕具有无可替代的优势。然而SPI协议本身只是一个宽泛的框架其具体的电气特性和时序细节尤其是时钟极性与相位、数据帧的起止边界并没有一个全球统一的标准。这就催生了两种在工业界广泛应用的实现变体Motorola SPI帧格式和Texas InstrumentsTI同步串行帧格式。这两种格式的核心差异在于时钟空闲状态、数据捕获边界的定义以及片选信号在整个传输周期中的行为。对于嵌入式工程师而言理解这些差异并能在硬件层面正确配置是确保通信稳定可靠的第一步。德州仪器的MSPM0 L系列微控制器其内置的UNICOMM-SPI模块正是这样一个高度灵活且功能强大的通信外设。它不仅完整支持上述两种帧格式还集成了深度可配置的FIFO、多种中断源以及DMA触发机制旨在最大化数据吞吐效率并减轻CPU负担。本篇文章将从一个资深嵌入式开发者的视角深入拆解Motorola与TI两种SPI帧格式的时序奥秘并手把手带你剖析MSPM0 UNICOMM-SPI模块的关键寄存器配置、中断与DMA的使用策略以及在实际项目中容易踩到的“坑”。无论你是正在评估MSPM0芯片还是已经深陷SPI通信调试的泥潭相信这里的细节和经验都能为你提供直接的帮助。2. Motorola与TI SPI帧格式的深度解析与时序实战要正确驱动一个SPI外设第一步永远是看懂它的数据手册中的时序图。而时序图的核心就是帧格式。MSPM0的UNICOMM-SPI模块通过CTL0.FRFFrame Format位域来切换这两种模式。选择错误通信必然失败。2.1 Motorola SPI帧格式极性与相位的四种组合Motorola格式是SPI协议中最经典和最常见的实现。它的时序由两个关键参数决定时钟极性SPOClock Polarity和时钟相位SPHClock Phase。通过CTL0寄存器的SPO和SPH位进行配置可以产生四种模式通常被称为模式0到模式3。时钟极性SPO决定了SCLK线在空闲状态即CS为高电平无数据传输时的电平。SPO 0SCLK空闲时为低电平。SPO 1SCLK空闲时为高电平。时钟相位SPH决定了数据在SCLK的哪个边沿被采样捕获以及在哪个边沿被更新移位输出。SPH 0数据在SCLK的第一个边沿即从空闲状态跳变后的第一个边沿被捕获在第二个边沿更新。SPH 1数据在SCLK的第二个边沿被捕获在第一个边沿更新。你提供的文档图27-6展示的是SPO1, SPH1即模式3的配置。我们来详细拆解这个时序空闲期IdleCS为高SCLK为高由SPO1决定。此时主设备的PICO即MOSI输出被强制拉低。这是一个很重要的细节可以避免总线在空闲时浮空产生干扰。传输启动当SPI控制器使能且TX FIFO中有数据时主设备将CS拉低。这标志着一次传输的开始。紧接着主设备的PICO输出引脚被使能。第一个半周期与数据使能在CS拉低后经过半个SCLK周期主设备和从设备的数据才被使能到各自的传输线上。同时SCLK产生一个下降沿从高到低的跳变。这个“半个周期”的延迟是SPH1模式下的关键特征它为从设备提供了足够的建立时间Setup Time来准备数据。数据捕获与更新在SPO1, SPH1模式下数据在SCLK的上升沿被捕获采样在下降沿被更新移位输出。这意味着主设备在SCLK下降沿改变PICO上的数据从设备在随后的SCLK上升沿读取这个稳定的数据。同时从设备也在SCLK下降沿改变POCI上的数据主设备在下一个上升沿读取。传输结束单字传输所有比特传输完毕后在最后一位被捕获后的一个完整SCLK周期CS线返回高电平空闲状态。连续背靠背传输CS线在多个数据字之间保持低电平直到最后一个字的最后一位被捕获后才返回高电平。实操心得模式选择的“潜规则”大多数SPI设备的数据手册会明确要求使用哪种模式Mode 0, 1, 2, 3。最常见的组合是SPO0, SPH0模式0和SPO0, SPH1模式1。一个快速记忆方法是关注数据捕获的边沿。对于从设备如传感器你只需要关心它在哪个边沿采样你的数据。通常SPH0意味着在SCLK的第一个边沿对于SPO0是上升沿对于SPO1是下降沿采样SPH1则在第二个边沿采样。配置时务必与从设备手册严格一致。2.2 TI同步串行帧格式独特的片选脉冲TI同步串行帧格式是另一种流行的标准尤其在TI自家的许多外设中使用。它与Motorola格式的一个显著区别在于CS在TI文档中常称为FSX或FSS信号的行为。根据文档图27-7TI格式的时序特点如下空闲期IdleSCLK和CS都被强制拉为低电平。主设备的PICO输出引脚处于高阻态Tristate。这与Motorola格式中CS和SCLK可配置为高或低不同TI格式的空闲状态是固定的。传输启动当TX FIFO底部有数据时CS线会被拉高一个SCLK周期。这个脉冲信号标志着帧的开始。同时待发送的数据从TX FIFO转移到发送逻辑的串行移位寄存器中。数据移出在CS脉冲后的下一个SCLK上升沿数据帧的最高有效位MSB从PICO引脚移出。同样外部从设备的MSB也在此刻移出到POCI线上。数据捕获在SCLK的每个下降沿SPI主设备和外部从设备都将数据位采样到各自的串行移位器中。这是一个关键区别在TI格式下数据总是在SCLK的下降沿被捕获。数据存储在最低有效位LSB被锁存后第一个SCLK上升沿将接收到的数据从串行移位器传输到RX FIFO。传输结束CS线在帧结束后恢复低电平。SCLK在空闲期同样保持不活动状态。注意事项TI格式的片选行为TI格式的CS信号是一个短暂的脉冲而非整个传输期间都保持有效的片选。这意味着它更像一个“帧同步”信号。在设计硬件连接时需要确保从设备支持这种脉冲式片选。许多标榜“SPI兼容”的设备实际上只支持Motorola格式的常低片选。误用格式会导致从设备无法正确识别帧起始。2.3 两种格式的对比与选型指南为了更直观地对比我将两种格式的核心差异总结如下表特性Motorola SPI 帧格式TI 同步串行帧格式配置位CTL0.FRF 0(3线) 或1(4线)CTL0.FRF 2空闲状态CS高SCLK由SPO决定0低1高CS低SCLK低片选(CS)行为在整个数据字传输期间保持有效低电平在每个数据字开始前产生一个SCLK周期的高电平脉冲数据捕获边沿由SPO和SPH共同决定可以是上升沿或下降沿固定为SCLK下降沿数据更新边沿与捕获边沿相反SCLK上升沿MSB移出典型应用绝大多数SPI Flash、传感器、ADC/DAC某些TI专属外设部分音频编解码器选型建议优先遵从从设备手册这是铁律。从设备要求什么格式主设备就必须配置成什么格式。Motorola格式的通用性在不确定或需要兼容多种设备时Motorola格式尤其是模式0和模式3是更安全的选择其支持度最广。TI格式的特殊考量仅在明确知道从设备支持TI格式时使用。它的脉冲式CS可以减少总线切换在某些多从机系统中可能有优势但通用性较差。3. MSPM0 UNICOMM-SPI模块的寄存器配置详解理解了帧格式我们接下来就要在MSPM0的寄存器层面进行配置。UNICOMM-SPI的寄存器虽然看起来繁多但按照功能模块化理解就会清晰很多。配置的核心流程通常遵循时钟源配置 - 引脚复用 - 基本参数设置 - 中断/DMA配置 - 使能模块。3.1 时钟与基础控制寄存器配置SPI通信的速率和稳定性首先取决于时钟的精确配置。1. 时钟源选择与分频 (CLKSEL,CLKDIV,CLKCTL)SPI模块的工作时钟SPIclk来源于系统时钟。CLKSEL寄存器用于选择异步或同步的时钟源如PLL、HFCLK、SYSCLK等。对于大多数应用选择系统主时钟SYSCLK即可。 确定了源时钟频率后需要通过CLKDIV和CLKCTL.SCR进行分频以得到最终的SPI比特率。CLKDIV.RATIO对源时钟进行一个粗分频1-8分频。CLKCTL.SCR进行精细分频。SPI的比特率计算公式为SPI Bit Rate SPIclk / ((SCR 1) * 2)。例如系统时钟SPIclk为32MHz目标SPI波特率为4Mbps。则SCR (SPIclk / (Bit Rate * 2)) - 1 (32e6 / (4e6 * 2)) - 1 3。配置SCR3即可。2. 核心控制寄存器0 (CTL0)这个寄存器定义了SPI通信的基本范式。FRF[1:0]帧格式选择。00Motorola 3线01Motorola 4线10TI格式11保留。SPO和SPH如前所述用于配置Motorola格式的时钟极性和相位。在TI格式下这两位通常被忽略。DSS[4:0]数据大小选择。支持4位到16位的数据帧长度。例如发送8位数据则配置DSS0x7对应8位。重要提示当数据长度小于16位时写入TXDATA的数据必须右对齐未使用的高位会被硬件忽略。读取RXDATA时数据也是右对齐的。CSSEL[1:0]选择使用哪个片选线CS0-CS3。在控制器模式下可以动态更改在从设备模式下必须在使能模块前配置好。PACKEN打包使能。当使能时一次32位的写操作会向TX FIFO压入两个16位数据一次32位的读操作会从RX FIFO弹出两个16位数据。这可以提升总线利用率适合连续大批量传输。3. 核心控制寄存器1 (CTL1)这个寄存器包含了一些高级控制和模式选择。ENABLESPI模块总使能位。必须在所有配置完成后最后设置。在修改CTL0、CTL1除ENABLE外等关键配置前必须先清除此位。CP控制器/外设模式选择。1控制器模式0外设模式。MSB数据传输顺序。0LSB先传1MSB先传。需与外设保持一致。LBM回环模式使能。用于模块自测试将发送端数据直接环回到接收端不经过外部引脚。调试时非常有用。POD外设输出禁用在多外设系统中当控制器广播数据时只有一个外设应驱动数据线。将此位置1可以禁用特定外设的输出驱动避免总线冲突。PREN和PES奇偶校验使能和校验类型选择偶校验/奇校验。用于增加通信的可靠性。RXTIMEOUT接收超时值配置仅外设模式。当SCLK线长时间无活动且RX FIFO中有数据时会触发超时中断。3.2 状态寄存器与FIFO操作状态寄存器 (STAT)这个只读寄存器提供了SPI模块的实时状态是编写健壮驱动程序的基础。BUSY最常用的标志位。为1表示SPI正在发送或接收数据。在启动一次传输或查询传输是否完成时都需要检查此位。TXFE/TXFFTX FIFO空/满标志。用于判断是否可以写入新数据。RXFE/RXFFRX FIFO空/满标志。用于判断是否有新数据可读。CDMODE反映当前的命令/数据模式计数值。在启用CDENABLE使用CS3作为C/D线时有用。FIFO操作与中断水平选择 (IFLS)UNICOMM-SPI模块内置了TX和RX FIFO深度取决于具体型号。IFLS寄存器用于设置触发中断或DMA请求的FIFO阈值。TXIFLSEL设置TX FIFO中断触发水平。例如设置为21/2空时当TX FIFO中的数据量少于或等于一半时会触发TX中断提示CPU可以填充更多数据。RXIFLSEL设置RX FIFO中断触发水平。例如设置为21/2满时当RX FIFO中的数据量达到或超过一半时会触发RX中断提示CPU可以读取数据。TXCLR/RXCLR写1可分别清空TX和RX FIFO。在模块初始化或错误恢复时常用。数据寄存器 (TXDATA,RXDATA)TXDATA写入数据到此寄存器数据被压入TX FIFO。如果FIFO已满写入操作会被阻塞或丢失取决于具体实现。RXDATA从此寄存器读取数据数据从RX FIFO弹出。如果FIFO为空读取将返回未定义值或上次读取的值。配置流程示例控制器模式8位数据模式02Mbps假设系统时钟为32MHz目标波特率2Mbps。禁用SPI模块CTL1.ENABLE 0。配置IOMUX将对应GPIO引脚复用为SPI功能SCLK, PICO, POCI, CS。配置时钟CLKSEL选择系统时钟源。计算SCR (32e6 / (2e6 * 2)) - 1 7设置CLKCTL.SCR 7。CLKDIV可根据需要设置此处用默认值1分频。配置CTL0FRF0(Motorola)SPO0,SPH0(模式0)DSS0x7(8位)CSSEL选择使用的CS线。配置CTL1CP1(控制器模式)MSB1(MSB先传常见)LBM0其他如奇偶校验按需设置。配置IFLS根据应用设置中断阈值例如TXIFLSEL2,RXIFLSEL2。配置中断使能IMASK和DMA如果需要。最后使能模块CTL1.ENABLE 1。4. 中断系统与DMA传输的实战应用对于高效的数据传输轮询STAT寄存器的方式会大量占用CPU资源。UNICOMM-SPI提供了丰富的中断事件和DMA触发机制可以实现“后台”数据传输。4.1 中断事件详解与处理流程中断相关的寄存器组CPU_INT包括IIDX中断索引、IMASK中断掩码、RIS原始中断状态、MIS屏蔽后中断状态、ISET软件置位、ICLR软件清除。关键中断源及其含义RX/TX最常用的中断。当RX FIFO数据达到IFLS.RXIFLSEL设定的水平或TX FIFO数据低于IFLS.TXIFLSEL设定的水平时触发。用于流控。RXFIFO_OVFRX FIFO溢出。发生此中断意味着数据丢失通常是由于CPU读取速度跟不上SPI接收速度所致。需要检查并优化代码或启用DMA。TXFIFO_UNFTX FIFO下溢仅外设模式。当控制器送来时钟但外设的TX FIFO已空时触发。外设需要及时填充数据。RTOUT接收超时仅外设模式。当SCLK线长时间无活动且RX FIFO非空时触发。可用于检测通信中断。IDLESPI进入空闲状态。一次传输序列完成时触发。DMA_DONE_RX/DMA_DONE_TXDMA传输完成中断。中断处理流程以RX中断为例使能中断在IMASK寄存器中将RX位bit 2置1。中断发生当RX FIFO数据量达到阈值RIS.RX位被硬件置1。如果IMASK.RX也为1则MIS.RX变为1并向CPU产生中断请求。中断服务程序ISR读取IIDX寄存器。硬件会自动返回最高优先级的中断索引例如0x03对应RX中断并自动清除该中断在RIS和MIS中的标志位。这是自动清除方式。或者在ISR中根据MIS寄存器判断中断源然后通过向ICLR寄存器的对应位写1来手动清除中断标志。数据处理在RX中断的ISR中循环读取RXDATA寄存器直到STAT.RXFE变为1FIFO空或数据量低于阈值以防止中断频繁触发。避坑指南中断标志清除务必仔细阅读数据手册关于中断清除的说明。对于IIDX读取自动清除的方式在ISR中只需读一次IIDX即可。对于手动清除方式写ICLR要确保在离开ISR前清除所有已处理的中断标志否则会导致中断持续触发系统卡死。混合使用两种方式可能导致意外行为建议统一采用一种。4.2 DMA传输配置指南对于大数据块传输如读写SPI Flash、传输图像数据使用DMA可以彻底解放CPU。UNICOMM-SPI提供了独立的DMA_TRIG_RX和DMA_TRIG_TX事件发布者来触发DMA传输。DMA传输的核心思想当SPI的TX FIFO有空位或RX FIFO有数据时自动触发DMA控制器将内存中的数据搬运到TXDATA寄存器或将RXDATA寄存器的数据搬运到内存整个过程无需CPU干预。配置SPI以触发DMA以RX DMA为例使能DMA触发在DMA_TRIG_RX.IMASK寄存器中使能RX触发位。配置DMA通道以MSPM0的DMA架构为例 a.选择通道选择一个可用的DMA通道。 b.配置触发源在DMA通道的触发控制寄存器如DMA_CH[n].DMATCTL中设置触发源为UNICOMM-SPI的RX事件。 c.配置地址 * 源地址 (DMASA)设置为SPI的RXDATA寄存器地址。这是一个外设地址DMA从此读取数据。 * 目的地址 (DMADA)设置为SRAM中接收缓冲区的地址。DMA将数据写入此处。 d.配置传输属性 * 数据宽度 (DMADSTWDTH,DMASRCWDTH)设置为8位或16位与SPI的DSS设置匹配。 * 地址增量源地址RXDATA设置为不增量No Change因为总是读取同一个寄存器。目的地址SRAM设置为递增Increment。 * 传输数量 (DMASZ)设置需要传输的数据总量如字节数。 e.使能DMA通道设置DMAEN位。配置SPI以触发DMATX DMA配置同理触发源改为TX事件源地址是SRAM发送缓冲区目的地址是TXDATA寄存器。实操心得DMA与FIFO阈值的协同DMA的触发同样受IFLS.RXIFLSEL和IFLS.TXIFLSEL控制。例如设置RXIFLSEL为“1/2满”那么当RX FIFO数据达到一半时才会触发DMA请求去读取数据。合理的阈值设置可以平衡响应速度和中断/DMA请求频率。对于大数据量连续传输建议将阈值设得高一些如3/4满以减少触发次数提升效率。对于低延迟要求的小数据包可以设置较低的阈值如1/4满。5. 常见问题排查与调试技巧实录即使理解了所有寄存器实际调试SPI通信时依然会遇到各种问题。下面是我在多年项目中总结的一些典型故障场景和排查手段。5.1 通信完全无响应的排查清单检查最基本的三要素电源与地确保主从设备共地电源电压符合要求。物理连接用万用表或示波器检查SCLK、PICO、POCI、CS四根线3线模式则无POCI是否连通有无短路到电源或地。引脚复用这是新手最常犯的错误。确认MCU的SPI引脚已通过IOMUX正确配置为SPI功能而非默认的GPIO。查阅MSPM0的引脚复用表并检查对应的IOMUX寄存器配置。确认电气电平如果主从设备电压不同如MCU是3.3V外设是5V需要电平转换电路不能直接连接。示波器/逻辑分析仪是终极武器先看CS和SCLK发送数据时CS线是否按预期拉低SCLK上是否有脉冲如果SCLK没有波形检查SPI模块是否已使能CTL1.ENABLE1以及时钟配置CLKSEL,CLKCTL是否正确。再看数据线在SCLK和CS都正常的前提下观察PICO主机输出线上是否有随SCLK变化的数据波形如果主机有输出但从机无回应检查从机是否已上电、使能以及模式控制器/外设是否设反。对照时序图将示波器捕获的波形与芯片手册中的时序图Motorola或TI格式严格对比。重点关注CS有效到第一个SCLK边沿的延迟。数据是在SCLK的哪个边沿上升/下降稳定建立和保持时间。CS在传输结束后的释放时间。5.2 数据错位或字节顺序错误MSB/LSB设置错误检查CTL1.MSB位。大多数设备是MSB先传但有些如某些音频芯片是LSB先传。这个必须与外设手册一致。数据位宽不匹配检查CTL0.DSS设置的数据位宽是否与外设期望的相同。例如外设是12位ADC但SPI配置为8位就会导致数据错乱。FIFO打包问题如果使能了PACKEN打包那么一次32位写操作会向TX FIFO压入两个16位数据。如果实际数据帧不是16位的整数倍或者读写操作不是32位对齐的就会导致数据拼接错误。在不确定时先关闭打包功能。5.3 使用调试工具与软件技巧充分利用回环模式将CTL1.LBM置1使能内部回环。在此模式下发送的数据会被直接环回到接收端。编写一个简单的测试程序发送一组已知数据如0xAA,0x55然后读取接收数据。如果回环测试通过证明SPI模块本身的配置、时钟、数据路径是正常的问题可能出在外部电路或从设备上。模拟器与单步调试在IDE如CCS或IAR中使用仿真器单步执行SPI初始化代码观察关键寄存器CTL0,CTL1,CLKCTL的值是否按预期设置。在发送数据后观察STAT.BUSY位的变化以及TXDATA/RXDATA寄存器的值。超时机制在发送或接收数据时不要无限等待BUSY标志或中断。添加一个基于系统滴答定时器的超时判断。例如等待BUSY变低如果超过10ms仍为高则判定为通信超时进行错误处理并复位SPI模块。这能防止程序因硬件故障而死锁。FIFO状态监控在中断或DMA处理函数中除了处理数据还应监控STAT.RXFF满和STAT.RXFE空标志确保不会溢出或读空。特别是在高波特率下CPU处理速度可能成为瓶颈。5.4 多从机系统与片选管理UNICOMM-SPI支持多个硬件CS线CS0-CS3。在驱动多个SPI从设备时硬件CS为每个从设备分配独立的CS引脚。在传输前通过配置CTL0.CSSEL来选择对应的CS线硬件会自动控制其拉低和拉高。这是最可靠的方式。软件GPIO模拟CS如果硬件CS线不够用可以将额外的GPIO配置为输出在传输前后手动拉低和拉高。注意手动控制CS时要严格遵循时序图确保CS在SCLK空闲期间变化并满足从设备要求的建立和保持时间。CS_MASK_ROTATE功能这是一个高级功能用于在连续传输中自动轮询多个CS线。需要仔细配置CSx_ROTATE_MASK寄存器。在常规应用中手动控制CS更为直观。调试SPI通信耐心和系统性排查是关键。从电源、地线、连接等硬件基础开始再到软件配置的每一个比特最后用仪器验证波形。把问题分解逐一验证总能找到症结所在。MSPM0的UNICOMM-SPI模块功能全面一旦配置正确其稳定性和性能都非常出色。