1. 项目概述:为什么需要深入理解SSP的帧格式?
在嵌入式开发中,尤其是使用像NXP LPC21xx/22xx这类经典ARM7微控制器时,与外设通信是家常便饭。SPI(Serial Peripheral Interface)大家都很熟悉,但当你翻开芯片手册,看到SSP(Synchronous Serial Port)模块支持SPI、TI同步串行和Microwire三种帧格式时,是不是有点头大?特别是手册里那些时序图,乍一看都差不多,细看却各有各的“脾气”。我当年第一次调一个TI的ADC芯片,死活不通,最后才发现是帧格式没选对,不是简单的CPOL/CPHA问题。所以,今天我们就抛开手册那种平铺直叙的描述,结合我踩过的坑和实际调试经验,把LPC21xx/22xx的SSP接口,特别是这三种帧格式的“门道”彻底讲透。这不是照本宣科,而是让你真正理解每种格式的时序灵魂,知道在什么场景下该用哪个,以及配置寄存器时每一个比特位背后的实际意义。
2. SSP接口核心框架与工作模式解析
2.1 SSP模块的定位与核心能力
LPC21xx/22xx的SSP不是一个简单的SPI控制器,而是一个高度可配置的同步串行通信引擎。它的核心能力是提供一个兼容多种行业标准的串行通信接口,其灵活性主要体现在两个层面: 帧格式 和 时钟时序 。模块内部包含独立的发送和接收FIFO(通常是8级深度),支持4到16位的数据帧长度,这使其既能应对高速数据流(如音频编码芯片),也能适配那些使用非标准字长的老式器件。
注意 :SSP的“同步”特性是其与UART等异步接口的根本区别。同步意味着通信双方共享一个时钟信号(SCK),数据位的采样和输出都严格以这个时钟为基准,因此没有波特率的概念,通信速率直接由主设备产生的SCK频率决定,最高可达外设时钟(PCLK)的若干分之一,具体取决于预分频器(CPSDVSR)和时钟分频比(SCR)的设置。
2.2 主从模式与关键信号线
无论哪种帧格式,SSP都遵循主从架构。作为**主设备(Master) 时,SSP负责生成通信时钟SCK,并控制数据传输的发起与结束。作为 从设备(Slave)**时,SSP则被动地响应外部主设备提供的时钟和数据。
关键的物理信号线通常包括:
- SCK (Serial Clock) :串行时钟,由主设备产生,是所有数据移位的节拍器。
- MOSI (Master Out Slave In) :主设备输出、从设备输入的数据线。在SPI全双工模式下,这是主设备发送数据的通道。
- MISO (Master In Slave Out) :主设备输入、从设备输出的数据线。在SPI全双工模式下,这是主设备接收数据的通道。
- SSEL (Slave Select) :从设备片选信号,低有效。这是主设备用来选择与哪个从设备通信的关键信号。在SPI模式下,其行为与CPHA位紧密相关。
在TI格式和Microwire格式下,这些信号线的命名和功能略有不同(如DX/DR, SO/SI),但物理连接的本质是相通的。理解这些信号线在不同模式下的行为,是调试通信问题的第一步。
3. 三大帧格式深度剖析与实战对比
手册里把三种格式并列,但实际应用场景和复杂度差异很大。我们不仅要看时序图,更要理解设计这些格式的初衷和它们解决的特定问题。
3.1 SPI帧格式:灵活性与复杂性的双刃剑
SPI是应用最广泛的格式,以其简单和全双工著称。但“简单”往往意味着配置的多样性。LPC21xx/22xx的SSP通过 SSPCR0 寄存器中的 CPOL (时钟极性)和 CPHA (时钟相位)两个位,提供了四种可能的时序模式。这常常是新手第一个绊倒的地方。
CPOL (Clock Polarity) :这个位决定了SCK线在空闲状态(即两次传输之间,SSEL为高时)的电平。
-
CPOL=0:空闲时SCK为低电平。 -
CPOL=1:空闲时SCK为高电平。 你可以把它想象成时钟信号的“静态偏置”。
CPHA (Clock Phase) :这个位决定了数据在时钟的哪个边沿被采样(捕获),以及在哪个边沿被更新(输出)。
-
CPHA=0:数据在时钟的第一个边沿(即从空闲状态跳变到有效状态的边沿)被采样,在第二个边沿更新。 -
CPHA=1:数据在时钟的第二个边沿被采样,在第一个边沿更新。
两者的组合构成了四种模式,通常外设的数据手册会明确规定其所需的模式。这里我分享一个快速记忆和调试的心得: 核心是抓住“采样边沿” 。配置时,先根据外设手册确定数据在SCK的上升沿还是下降沿被采样,然后反推CPHA。
- 如果要求在SCK的 第一个边沿 采样,则设
CPHA=0。 - 如果要求在SCK的 第二个边沿 采样,则设
CPHA=1。 确定CPHA后,再看外设要求的SCK空闲状态,决定CPOL。
模式0 (CPOL=0, CPHA=0) 实战细节 : 这是最常见的一种模式。空闲时SCK为低。当主设备拉低SSEL启动传输后, 主设备会立即在MOSI上输出数据的MSB(最高位) 。经过半个SCK周期后,SCK产生第一个边沿(上升沿)。在这个上升沿,从设备采样MOSI上的数据(即主设备发送的MSB),同时主设备采样MISO上的数据(即从设备发送的MSB)。在接下来的下降沿,双方各自输出下一位数据。
- 单次传输 :传输完最后一位(LSB)后,主设备会在一个SCK周期后将SSEL拉高,结束本次通信。
- 连续传输(Back-to-Back) :这是最容易出错的地方!当
CPHA=0时,从设备内部的移位寄存器在SSEL为低期间是“冻结”的。这意味着,如果你想连续发送多个数据帧, 必须在每帧之间将SSEL拉高至少一个SCK周期 ,以“解锁”从设备,使其能加载下一个待发送数据。否则,从设备会一直重复发送第一个帧的数据。这个特性在驱动如OLED屏这类需要连续写入命令和数据的设备时至关重要。
模式3 (CPOL=1, CPHA=1) 实战细节 : 空闲时SCK为高。启动传输后,主设备先输出数据MSB,半个周期后SCK产生第一个边沿(下降沿),此时数据被更新。在随后的上升沿,数据被采样。在连续传输时,由于 CPHA=1 ,从设备移位寄存器在SSEL为低期间是透明的,因此SSEL可以一直保持低电平,实现真正的无缝连续传输,这在需要极高数据吞吐率的场景(如高速ADC连续读数)中非常有用。
3.2 Texas Instruments (TI) 同步串行帧格式
TI格式可以看作是SPI模式0(CPOL=0, CPHA=0)的一个特化版本,但它有自己独特的帧同步信号 FS (Frame Sync,相当于SPI中的SSEL)。其最大特点是 帧同步脉冲非常短 。
工作流程解析 :
- 空闲状态 :CLK(即SCK)和FS均被强制拉低,主设备的发送数据线DX呈高阻态。整个总线处于一种“静默”状态。
- 启动传输 :一旦主设备的发送FIFO中有数据,FS信号会 产生一个CLK周期宽的高电平脉冲 。这个脉冲就是帧开始的标志。同时,待发送数据从FIFO转移到发送移位寄存器。
- 数据移出 :在FS脉冲结束后的 第一个CLK上升沿 ,数据帧的MSB被移出到DX引脚。注意,这里FS的下降沿到第一个数据位移出之间没有延迟,时序非常紧凑。
- 数据采样 : 主设备和从设备都在每个CLK的下降沿将数据采样到各自的移位寄存器中 。这是一个关键点,数据采样边沿是固定的(下降沿)。
- 传输结束 :当LSB被锁存后,在 下一个CLK上升沿 ,接收到的数据从移位寄存器转移到接收FIFO。FS信号恢复低电平。
与SPI模式0的核心差异与适用场景 :
- FS行为不同 :SPI的SSEL在整帧传输期间保持有效(低电平),而TI格式的FS只是一个短暂的启动脉冲。这使得TI格式在需要严格帧同步、且帧间间隔可能不固定的多设备系统中更有优势,FS脉冲明确指示了每一帧的开始。
- 采样边沿固定 :TI格式固定为下降沿采样,而SPI模式0是上升沿采样。 这是硬件连线后通信不通的最常见原因之一 。如果你用的TI系外设(如许多TI的ADC、DAC),务必在SSP的
SSPCR0寄存器中将FRF(帧格式)字段设置为10(TI格式),而不是简单地配置成SPI模式0。我曾调试过一个TI的音频编解码器,就因为帧格式选错,只能收到乱码。 - 应用场景 :这种格式常见于TI自家的音频芯片、数据转换器以及一些需要严格主从同步的工业传感器。
3.3 Microwire帧格式:半双工的命令-响应模型
Microwire是National Semiconductor(现被TI收购)推出的一种协议。它与SPI最大的不同在于 半双工 和 分时的命令-响应结构 ,更像是一种简化的、带握手的串行通信。
通信相位分解 : 一次完整的Microwire传输分为两个截然不同的阶段:
- 命令阶段(8位控制字) :主设备向从设备发送一个固定的8位控制字节。在此期间,主设备只发送(SO输出),不接收(SI输入为高阻)。这个控制字通常包含操作码(读、写等)和地址信息。从设备在SCK(Microwire中常称为SK)的上升沿锁存这些位。
- 等待阶段(1个时钟周期) :在发送完第8位控制字后,主设备会 额外等待一个完整的SK时钟周期 。这个周期是留给从设备解码控制字并准备响应数据的。在此期间,总线保持空闲。
- 数据响应阶段(4-16位数据) :从设备根据解码后的命令,将数据通过SI线发送回主设备。数据长度由之前发送的控制字或设备本身决定,可以是4到16位。主设备在SK的上升沿采样SI线上的数据。
关键配置与实战陷阱 :
- 半双工切换 :硬件上,你需要将主设备的MISO(输入)和MOSI(输出)引脚分别连接到从设备的SO(输出)和SI(输入)吗?不,通常更简单。在Microwire模式下,SSP模块会 自动管理方向 。你只需要将MCU的一个引脚(如P0.4)配置为SO(主出),另一个引脚(如P0.5)配置为SI(主入)即可。模块在命令阶段将SO引脚作为输出,在数据阶段将其置为高阻,同时开始从SI引脚采样。
- CS信号的作用 :CS(Chip Select)在整个帧传输期间保持低有效,其作用类似于SPI的SSEL,但时序要求更严格。手册中特别强调了 建立时间(tSETUP)和保持时间(tHOLD) 。如果主设备的SK是自由运行的(Free-running),你必须确保CS信号在SK采样边沿(上升沿)之前有足够长的稳定时间(至少2个SK周期),并在前一个SK边沿之后有足够的保持时间(至少1个SK周期)。如果不能满足,轻则数据错位,重则通信完全失败。在软件模拟CS或使用GPIO控制CS时,要特别注意插入足够的延时。
- 应用场景 :Microwire常用于一些简单的EEPROM(如93C46系列)、温度传感器和数字电位器。它的优势在于协议简单,通过8位命令字可以灵活地寻址和操作内部寄存器,比单纯的SPI数据流更适合控制类外设。
4. 寄存器精讲与驱动编写实战
理解了时序,最终都要落实到寄存器配置上。LPC21xx/22xx的SSP寄存器不多,但每个位都至关重要。
4.1 核心控制寄存器SSPCR0配置详解
SSPCR0 是配置的基石,地址为 0xE005 C000 。
- DSS[3:0] (Data Size Select) :数据大小选择。这是第一个坑!手册明确说明
0000-0010(即0-2)的值是 不支持 的。有效值从0011(4位)开始,到1111(16位)结束。如果你想传输8位数据,必须写入0111(二进制7),而不是1000(二进制8)。很多粗心的开发者会在这里出错,导致帧长度不对。 - FRF[5:4] (Frame Format) :帧格式选择。
00= SPI,01= SSI(保留),10= TI同步串行,11= Microwire。 这个字段和DSS、CPOL/CPHA是联动的 。例如,选择TI或Microwire格式时,CPOL和CPHA位可能被忽略或具有固定含义。 - CPOL, CPHA :如前所述,仅在SPI格式下有效。
- SCR[15:8] (Serial Clock Rate) :串行时钟速率分频因子。最终的SCK频率计算公式为: SCK = PCLK / (CPSDVSR * (SCR + 1)) 。其中
CPSDVSR是SSPCPSR寄存器的值。SCR可以理解为每比特位所需的时钟周期数减一。例如,若SCR=0,则每比特占用1个时钟周期;若SCR=1,则每比特占用2个时钟周期,速率减半。
4.2 时钟预分频寄存器SSPCPSR的坑
SSPCPSR 寄存器(地址 0xE005 C010 )用于配置预分频值 CPSDVSR 。手册用加粗字体警告: 必须正确初始化,否则SSP控制器可能无法正确发送数据 。
- 取值范围 :必须是 2到254之间的偶数 。写入奇数值可能导致不可预知的行为。通常我们取2, 4, 6等值。
- 主从模式差异 :在 主模式 下,SCK由该寄存器及SCR共同分频PCLK产生。在 从模式 下,SCK由外部主设备提供,此时
CPSDVSR寄存器的值 不相关 ,但外部SCK频率有一个硬性限制: 不得超过PCLK频率的1/12 。例如,如果PCLK是60MHz,那么外部主设备提供的SCK不能超过5MHz。超过此限可能导致数据采样错误。这是调试从机模式时一个非常关键的检查点。
4.3 数据收发与FIFO操作
数据寄存器 SSPDR (地址 0xE005 C008 )是16位宽的。读写这个寄存器实际上是在操作底层的硬件FIFO。
- 发送数据 :在写数据前, 必须检查状态寄存器
SSPSR中的TNF位(Transmit FIFO Not Full) 。只有当TNF=1(FIFO非满)时,写入SSPDR的数据才会进入发送FIFO排队。如果数据长度小于16位(比如8位),你需要将数据 右对齐 写入SSPDR的高位部分会被忽略。 - 接收数据 :在读数据前, 必须检查
RNE位(Receive FIFO Not Empty) 。只有当RNE=1时,才能从SSPDR中读取到有效数据。读取的数据也是右对齐的,高位补零。 - 驱动编写示例(查询方式发送一个字节) :
全双工SPI传输 通常将上述两个函数结合,即在发送一个字节的同时,也接收一个字节(来自从设备的上一次响应或哑元数据)。void SSP_SendByte(uint8_t data) { // 等待发送FIFO有空间 while ((LPC_SSP->SSPSR & (1<<1)) == 0); // 等待TNF位为1 // 将8位数据右对齐写入16位数据寄存器 LPC_SSP->SSPDR = (uint16_t)data; } uint8_t SSP_ReceiveByte(void) { // 等待接收FIFO有数据 while ((LPC_SSP->SSPSR & (1<<2)) == 0); // 等待RNE位为1 // 读取数据,并转换为8位(丢弃高8位) return (uint8_t)(LPC_SSP->SSPDR & 0x00FF); }
4.4 中断的使用策略
SSP提供了丰富的中断源( SSPIMSC 可屏蔽),合理使用可以解放CPU。
- 接收超时中断(RTIM) :当接收FIFO非空,且超过32个位时间没有新数据到来也未读取时触发。这可用于检测通信意外中断。
- 接收FIFO半满中断(RXIM) :适合在需要连续接收大量数据时使用,可以批量读取,提高效率。
- 发送FIFO半空中断(TXIM) :适合需要连续发送大量数据时,可以提前填充数据,避免FIFO断流。
- 接收溢出中断(RORIM) :这是 错误中断 !当接收FIFO已满,又收到一个完整帧时触发。发生溢出时,旧数据会被新数据覆盖。一旦发生,必须读取
SSPDR清空FIFO,并检查SSPRIS和SSPICR来处理中断标志,否则通信会卡死。在高速通信中,必须确保你的接收处理速度跟得上数据到达速度。
5. 典型问题排查与调试心得
调不通串行通信是嵌入式开发的日常。下面是我总结的一套排查流程和常见坑点。
5.1 通信完全无响应的排查清单
- 检查物理连接 :这是最基础也最容易被忽视的。用万用表或示波器检查SCK、MOSI、MISO、SSEL线是否连通,有无对地短路或与电源短路。确保从设备已供电。
- 确认引脚复用 :LPC21xx/22xx的引脚功能是复用的。你必须通过
PINSELx寄存器将相关引脚配置为SSP功能,而不是默认的GPIO。例如,将P0.4、P0.5、P0.6、P0.7分别配置为SCK、MISO、MOSI、SSEL。 - 验证时钟与电源 :测量主设备的PCLK是否正常?SSP模块的时钟是否使能(在PCONP寄存器中)?从设备的电源电压是否在要求范围内?
- 检查基本配置 :
-
SSPCR1中的SSE位(SSP Enable)是否置1? -
SSPCR1中的MS位(Master/Slave)是否设置正确?主模式为0,从模式为1。 -
SSPCR0中的DSS是否设置了有效的帧长度(如8位对应0111)? -
FRF格式选择是否正确?SPI、TI、Microwire选错了肯定不通。 - 对于SPI,
CPOL和CPHA是否与外设手册要求严格一致?
-
- 检查片选信号SSEL :用示波器看SSEL信号。作为主设备,你启动传输时它是否被拉低?拉低的时间长度是否符合帧格式要求(SPI整帧低,TI短脉冲,Microwire整帧低)?作为从设备,外部主设备提供的SSEL信号是否连接到了正确的引脚并被正确识别?
5.2 能发送但接收不到数据,或数据错位
- 时序相位问题(最常见) :用示波器同时捕捉SCK和MOSI/MISO信号。对照外设数据手册的时序图,检查:
- 数据采样边沿 :数据是否在正确的时钟边沿(上升沿/下降沿)保持稳定?如果数据变化边缘太靠近采样边沿,就会导致采样不稳定。这时可能需要降低SCK频率,或检查PCB走线是否过长引入了延迟。
- CPOL/CPHA匹配 :这是SPI模式不匹配的典型症状。主从设备的CPOL和CPHA必须完全一致。一个快速验证方法是尝试四种组合(0,0; 0,1; 1,0; 1,1)。
- 帧格式不匹配 :如果你连接的是TI或Microwire设备,却配置成了SPI模式,很可能能发出一些信号,但收到的是乱码或固定值。务必核对设备手册推荐的通信协议。
- 从设备输出使能 :有些从设备需要特定的命令或硬件引脚(如输出使能OE)来激活其MISO/SO输出。确保从设备已正确配置为输出模式。
- 主从设备位序(MSB/LSB) :大多数SPI设备是MSB先行,但有些设备(特别是某些显示驱动器)可能是LSB先行。SSP模块固定为MSB先行。如果外设是LSB先行,你需要在软件中对发送和接收的数据进行位反转。
- Microwire的等待周期 :在Microwire模式下,发送完8位控制字后,你是否在程序中留出了那一个额外的SK时钟等待周期?如果没有,从设备可能来不及准备数据。
5.3 高速通信下的稳定性问题
- SCK频率超限 :在从机模式下,切记外部SCK频率不能超过PCLK/12。在主机模式下,过高的SCK频率可能导致信号质量下降(边沿变缓)。用示波器观察SCK波形,是否还是干净的方法?过冲或振铃都会影响采样。
- FIFO溢出 :在中断服务程序(ISR)中处理数据不够快,导致接收FIFO溢出(RORIM中断触发)。优化ISR,或者改用DMA(如果芯片支持)来搬运数据。
- 电源噪声 :高速切换的数字信号会产生噪声。确保电源去耦电容(通常为0.1uF和10uF)紧靠芯片电源引脚放置,并保证地平面完整。
5.4 一个真实的调试案例:驱动TI ADS8320 ADC
这是一个典型的TI同步串行格式设备。我的初始配置是SPI模式0,结果读回来的数据永远是一个固定值。排查过程如下:
- 用示波器看,发现SCK、CS(即FS)、DIN(主出)信号都有,波形也干净。
- 仔细看ADS8320手册的时序图,发现它要求: CS下降沿启动转换,在CS为低期间,在SCK的下降沿输入数据位(DIN),并在随后的SCK上升沿输出数据位(DOUT) 。这描述听起来有点绕。
- 对比LPC21xx SSP的TI格式时序:FS(即CS)一个正脉冲后,在CLK上升沿移出数据,下降沿采样数据。等等,采样边沿是下降沿!而我的SPI模式0配置是上升沿采样。
- 虽然采样边沿对了(都是下降沿采样从设备输出),但 启动方式完全不同 。SPI是SSEL持续低有效,TI是FS短脉冲。ADS8320明显需要CS持续低。
- 最终解决方案: 将SSP配置为TI同步串行格式(FRF=10) 。但手册描述TI格式下FS是短脉冲。这里需要变通:实际上,在TI格式下,你可以通过软件控制SSEL(即FS)引脚,在启动传输前手动拉低,并在传输结束后手动拉高,模拟出SPI模式0中SSEL的行为,同时利用了TI格式固定的下降沿采样特性。或者,更简单的方法是, 将SSEL引脚配置为普通GPIO,由软件手动控制其电平 ,而SSP模块配置为TI格式,这样它只负责产生SCK和收发数据,帧同步信号完全由软件掌控。这个案例告诉我们,手册是基础,但实际应用需要灵活理解和变通。
6. 不同应用场景下的配置策略与优化建议
掌握了底层原理和调试方法,我们来看看如何为不同的应用场景选择最佳配置。
6.1 场景一:高速传感器数据流(如IMU、高速ADC)
- 需求 :高带宽、低延迟、连续不间断的数据流。
- 推荐配置 :
- 帧格式 :SPI模式3(CPOL=1, CPHA=1)。因为在此模式下,SSEL可以在连续传输中保持低电平,避免了帧间切换的开销,实现了最高的理论吞吐率。
- 数据长度 :根据传感器数据格式选择,通常为8位或16位。如果传感器输出是24位,可能需要拆分为3个8位传输,此时要特别注意字节序。
- 时钟速率 :在满足信号完整性的前提下,尽可能提高SCK频率。计算时注意
CPSDVSR和SCR的取值,确保最终频率是传感器所能支持的最高频率。 - 数据交换 :使用DMA(如果MCU支持)来搬运SSP FIFO中的数据到内存,彻底解放CPU。如果只能用中断,则使能“接收FIFO半满”或“发送FIFO半空”中断,进行批量处理。
- 注意事项 :务必监控接收溢出中断(RORIM)。高速数据流下,任何一点处理延迟都可能导致溢出。
6.2 场景二:控制多个简单外设(如数码管驱动器、IO扩展芯片)
- 需求 :需要频繁、快速地切换控制多个设备,每个设备的通信量不大。
- 推荐配置 :
- 帧格式 :SPI模式0(CPOL=0, CPHA=0)最为通用。
- 关键技巧 :利用SSEL信号。将每个外设的片选连接到MCU不同的GPIO引脚。在通信时,只拉低目标外设的SSEL,其他保持高电平。这样可以在同一条SPI总线上挂载多个设备(即SPI总线复用)。
- 软件优化 :将每个外设的读写操作封装成函数,函数内部处理SSEL的拉低和拉高。对于简单的写操作,可以尝试使用“背靠背”连续传输模式(如果CPHA=0,记得在帧间拉高SSEL),一次性写入多个寄存器,减少SSEL切换次数。
- 注意事项 :注意总线的负载电容。挂载设备过多可能导致SCK信号边沿变差,通信距离和速度受限。必要时可增加总线驱动器。
6.3 场景三:连接传统Microwire或TI格式设备
- 需求 :与特定协议的老式芯片通信,如93C46 EEPROM或TI的模拟前端。
- 推荐配置 :
- 严格遵循协议 :对于Microwire,务必在发送8位命令字后,在程序中主动插入一个相当于SCK周期的延时,以满足从设备的解码等待时间。对于TI格式,确认好FS脉冲宽度和数据采样边沿。
- SSEL/CS管理 :对于这些协议,SSEL/CS的时序往往有严格要求(如Microwire的建立保持时间)。如果SSP硬件行为与设备要求不完全一致(如TI格式要求FS持续低,但SSP硬件是短脉冲),最可靠的方法是 将SSEL/CS引脚配置为GPIO,由软件精确控制其时序 ,而SSP模块仅用于生成SCK和收发数据。这样牺牲了一点效率,但换来了最大的兼容性和可靠性。
- 调试工具 :逻辑分析仪是调试这类定序协议的神器。可以清晰看到命令字、等待周期、数据响应等各个阶段,便于比对实际波形与数据手册的差异。
6.4 性能优化与计算示例
假设系统PCLK = 60 MHz,我们需要配置SSP产生一个1.5 MHz的SCK时钟。 根据公式: SCK = PCLK / (CPSDVSR * (SCR + 1)) 我们需要找到合适的 CPSDVSR (偶数,2~254)和 SCR (0~255)组合。
- 计算总分频系数:
PCLK / SCK = 60MHz / 1.5MHz = 40。 - 分解40为两个整数乘积,且第一个为偶数。例如:
40 = 2 * 20, 或40 = 4 * 10, 或40 = 8 * 5。 - 选择一组:令
CPSDVSR = 4, 则(SCR + 1) = 10, 所以SCR = 9。 - 验证:
SCK = 60MHz / (4 * (9+1)) = 60MHz / 40 = 1.5 MHz。符合要求。 - 代码配置:
尽量选择较小的LPC_SSP->SSPCPSR = 4; // CPSDVSR = 4 LPC_SSP->SSPCR0 |= (9 << 8); // SCR = 9CPSDVSR和较大的SCR,因为预分频器CPSDVSR的稳定性可能更高,但最终应以实际测试的波形稳定度为准。

840


被折叠的 条评论
为什么被折叠?



