AM1806 SPI接口深度解析:从3/5引脚模式到时序设计实战

发布时间:2026/7/26 16:13:19
AM1806 SPI接口深度解析:从3/5引脚模式到时序设计实战 1. SPI接口核心原理与AM1806模块架构解析搞了这么多年嵌入式SPISerial Peripheral Interface绝对是我打交道最多的外设接口之一。它不像I2C那样有复杂的地址协议也不像UART那样需要精确的波特率匹配SPI的哲学就是“简单粗暴有效”——一个主设备带着一个或多个从设备用四根线有时更少就能实现高速全双工通信。今天咱们不聊那些泛泛的概念直接深入到德州仪器AM1806这颗经典处理器的SPI模块内部看看它的3/4/5引脚模式到底是怎么玩的特别是那些手册里写了但新手容易忽略的电气时序细节。SPI的本质就是一个大号的移位寄存器。主设备和从设备各有一个移位寄存器通过MOSIMaster Out Slave In和MISOMaster In Slave Out两根数据线首尾相连形成一个巨大的、跨越两个芯片的16位环形移位寄存器。当主设备产生时钟脉冲时数据就在这个环形寄存器里同步移动。主设备移出去一位同时就从从设备移进来一位反之亦然这就实现了全双工。AM1806的SPI模块框图清晰地展示了这一点核心就是一个16位移位寄存器加一个16位缓冲器Buffer。你写入SPIDAT寄存器的数据实际上先到了缓冲器传输开始时才加载到移位寄存器里一位一位往外挪接收时数据从移位寄存器末尾移入整帧传输完毕后才一次性读到缓冲器里供CPU读取。这个“缓冲器-移位寄存器”的双缓冲结构是关键它允许你在当前帧传输的同时准备下一帧要发送的数据或者读取上一帧收到的数据从而实现连续传输而不必等待。AM1806提供了两个独立的SPI模块SPI0和SPI1每个模块都支持可配置为主模式或从模式。作为主设备时它掌控着时钟线SPIx_CLK的生杀大权并负责发起通信作为从设备时它则乖乖地听主设备的时钟指挥。无论是主是从其数据交换的核心机制都是这个环形移位。模块还集成了中断和DMA请求逻辑这意味着你既可以用CPU轮询状态标志位也可以配置为传输完成或缓冲区就绪时产生中断甚至让DMA控制器来搬运数据极大解放了CPU。注意很多人初学SPI会混淆“数据寄存器”和“移位寄存器”。在AM1806里你编程操作的是SPIDAT0/1或SPIBUF这是数据缓冲器。真正的移位操作对程序员是透明的由硬件状态机控制。理解这一点对调试时序问题至关重要——你写入数据后传输并非立即开始而是由硬件在适当时间例如在主模式下写入后满足条件即开始在从模式下需等待主设备时钟自动发起。2. AM1806 SPI的3/4/5引脚模式深度剖析AM1806的SPI模块之所以灵活在于它支持从3引脚到5引脚的可配置操作模式。这不仅仅是多了一两根线的问题而是整个通信握手机制的升级。2.1 基础3引脚模式最简配置3引脚模式是最基础的SPI配置只使用三根线SPIx_CLK时钟、SPIx_SIMO主出从入即MOSI、SPIx_SOMI主入从出即MISO。在这种模式下通信完全由主设备主导。主设备启动时钟数据就在SIMO和SOMI上同步交换。它适用于单一主设备、单一从设备的场景或者从设备本身不需要片选比如唯一从设备的情况。但这里有个隐藏问题如果总线上有多个从设备3引脚模式无法区分数据是发给谁的因为所有从设备的MISO线如果直接并联会产生冲突。因此3引脚模式在实际系统中使用较少除非是点对点通信。2.2 4引脚模式带片选SPIx_SCS多从设备管理4引脚模式在3根线的基础上增加了**SPIx_SCSSlave Chip Select**信号。这根线就是常说的“片选”或“从设备选择”。它的作用非常直观主设备在需要与某个特定从设备通信时将该从设备对应的SCS线拉低有效而其他从设备的SCS线保持高电平无效。被选中的从设备才会激活其SOMI输出驱动器响应主设备的时钟进行数据交换未被选中的从设备则将其SOMI引脚置于高阻态避免总线冲突。在AM1806作为从设备时SPIx_SCS引脚是输入。只有当检测到自己的SCS被主设备拉低后它的内部状态机才允许其移位寄存器工作并驱动SOMI线输出数据。手册里特别强调“The device will only shift data and drive the SPIx_SOMI pin when SPIx_SCS is held low.” 这是硬件级的互斥保证。作为主设备时SPIx_SCS是输出由主设备控制器主动产生用于选择目标从设备。2.3 5引脚模式带片选与使能SPIx_ENA硬件流控与性能优化5引脚模式是AM1806 SPI的一个高级特性它在4引脚的基础上又增加了一根SPIx_ENAEnable/Ready信号线。这根线引入了一个硬件握手机制用于协调主从设备之间的数据传输节奏从而优化总线吞吐量。理解SPIx_ENA的关键在于它的方向是变化的在从设备端SPIx_ENA是一个输出信号。它反映了从设备内部发送缓冲区SPIDAT寄存器的状态。当从设备准备好发送新数据即发送缓冲区为空或已准备好新数据时它会将ENA拉低有效告诉主设备“我准备好了你可以发起下一次传输了”。如果发送缓冲区未就绪ENA则被释放高电平或高阻态主设备会等待。在主设备端SPIx_ENA是一个输入信号。主设备可以被配置为在发起下一次传输前先检查ENA信号是否有效。只有检测到从设备的ENA信号有效低电平主设备才会启动下一次时钟和数据传输。这个握手机制的精妙之处在于它避免了主设备采用“盲等”策略。在没有ENA的传统SPI中主设备发送完一帧数据后必须等待一个足够长的时间通常按从设备处理数据的最坏情况延迟来估算才能发起下一帧传输否则可能因为从设备未准备好而丢失数据。这造成了总线空闲降低了平均吞吐量。而有了ENA握手主设备可以“即插即用”从设备一准备好传输立刻开始总线利用率接近100%。在5引脚模式下从设备输出ENA信号的条件更为严格必须同时满足“发送缓冲区满/就绪”和“自身的SPIx_SCS被主设备选中”。这意味着即使从设备缓冲区准备好了只要它没被选中SCS为高它也不会驱动ENA有效。这个设计允许多个从设备共享同一根ENA线通常需要外部上拉电阻实现了一种简单的共享就绪信号机制。主设备选中某个从设备后只需观察共享的ENA线就能知道当前选中的从设备是否就绪。3. 时钟相位与极性配置详解SPI通信的另一个核心概念是时钟相位CPHA和时钟极性CPOL。AM1806的SPI模块支持四种组合模式CPOL, CPHA(0,0), (0,1), (1,0), (1,1)。这两个参数决定了时钟空闲时的电平以及数据在时钟的哪个边沿被采样和驱动。时钟极性CPOL定义SPIx_CLK线在空闲状态无数据传输时的电平。CPOL0时钟空闲时为低电平。CPOL1时钟空闲时为高电平。时钟相位CPHA定义数据采样的边沿。注意数据的输出驱动边沿总是与采样边沿相反。CPHA0数据在时钟的第一个边沿对于CPOL0是上升沿对于CPOL1是下降沿被采样在相反的边沿被驱动更新。CPHA1数据在时钟的第二个边沿被采样在第一个边沿被驱动更新。这四种模式对应的时序图在AM1806手册的Figure 6-35和6-36中有清晰展示。选择哪种模式完全取决于你的从设备如传感器、Flash芯片的要求。你必须严格按照从设备数据手册的规定来配置AM1806的SPI主模式。配置错误会导致数据采样错位通信完全失败。在AM1806中时钟相位和极性通过格式寄存器SPIFMT0-3中的POLARITY和PHASE位域进行配置。每个SPI模块支持多达4种可预先编程的格式可以在传输过程中通过SPIDAT1寄存器的CSNR位动态选择这在与多个要求不同时序模式的从设备通信时非常有用。4. AM1806 SPI寄存器配置实战指南理解了原理和模式我们来看看如何通过寄存器来驾驭AM1806的SPI模块。SPI模块的寄存器分为几大类全局控制、中断控制、引脚控制、数据寄存器和格式/延时控制。4.1 关键寄存器功能解析SPIGCR0/1全局控制寄存器0/1这是SPI模块的总开关。SPIGCR1的ENABLE位必须置1才能使能整个SPI模块。SPIGCR0则包含主/从模式选择MASTER位、循环回测LOOPBACK、时钟使能等全局设置。SPIPC0-5引脚控制寄存器这组寄存器控制SPI相关引脚的功能复用、方向和输入/输出值。例如你需要通过SPIPC0将对应管脚配置为SPI功能而非GPIO通过SPIPC1配置引脚方向输入或输出。SPIDAT0/1和SPIBUF数据寄存器SPIDAT0基本数据移位寄存器。写入的数据会直接或经格式化后进入发送流程。SPIDAT1带格式选择的数据移位寄存器。除了数据位它还包含CSNR片选编号和CSHOLD保持片选等控制位。写入SPIDAT1会同时触发数据传输并应用指定的格式和片选。SPIBUF缓冲寄存器。读取它可获得最近一次完整传输后接收到的数据。它是一个只读寄存器。SPIFMT0-3格式寄存器每个格式寄存器定义了数据传输的一整套参数包括CHARLEN字符长度数据位宽3-16位可调。POLARITY和PHASE时钟极性和相位。PRESCALE时钟预分频器用于产生SPI通信比特率。比特率 模块输入时钟 / (PRESCALE 1)。DELAY帧间延时可控制CS有效到第一个时钟边沿C2TDELAY以及最后一个时钟边沿到CS无效T2CDELAY的时间。SPIDELAY延时寄存器专门用于精细控制4/5引脚模式下的时序。C2TDELAY控制从片选有效到第一个时钟沿的延时T2CDELAY控制从最后一个时钟沿到片选无效的延时。这在满足某些从设备苛刻的建立/保持时间要求时非常有用。SPIFLG标志寄存器和SPIINT0中断寄存器SPIFLG中的BUFFULL_FLAG接收缓冲区满和INT0_FLAG传输完成是常用的状态标志。你可以通过查询这些标志或配置SPIINT0使能相应中断来获知传输状态。4.2 主模式初始化与数据传输示例假设我们要将AM1806的SPI0配置为主模式使用4引脚带片选CPOL0CPHA08位数据比特率5MHz假设输入时钟为100MHz。// 1. 使能SPI0模块时钟此步骤依赖系统时钟配置此处略 // 2. 配置引脚功能为SPI0 // 假设 SPI0_CLK 对应管脚为 PINMUX_REG_0[3:0] 0x1 (SPI0功能) // 假设 SPI0_SIMO 对应管脚为 PINMUX_REG_0[7:4] 0x1 // 假设 SPI0_SOMI 对应管脚为 PINMUX_REG_0[11:8] 0x1 // 假设 SPI0_SCS[0] 对应管脚为 PINMUX_REG_0[15:12] 0x1 (使用片选0) // 具体寄存器地址和位域请参考AM1806的PinMux文档 PINMUX_REG_0 (PINMUX_REG_0 0xFFFF0000) | 0x1111; // 3. 配置SPI0引脚方向 (SPIPC1) // CLK, SIMO, SCS[0] 配置为输出SOMI配置为输入 volatile uint32_t *spi_spipc1 (volatile uint32_t *)0x01C41018; *spi_spipc1 (1 0) | (1 1) | (1 3); // 假设bit0:CLK_OUT, bit1:SIMO_OUT, bit3:SCS0_OUT // 4. 全局控制寄存器配置 (SPIGCR1, SPIGCR0) volatile uint32_t *spi_spigcr1 (volatile uint32_t *)0x01C41004; volatile uint32_t *spi_spigcr0 (volatile uint32_t *)0x01C41000; *spi_spigcr1 0x00000001; // 使能SPI模块 (ENABLE1) *spi_spigcr0 0x00000001; // 配置为主模式 (MASTER1), 其他位默认 // 5. 配置格式寄存器0 (SPIFMT0) // 比特率 100MHz / (PRESCALE1) 5MHz PRESCALE 19 (0x13) // CHARLEN 8-1 7 (0x7), POLARITY0, PHASE0 volatile uint32_t *spi_spifmt0 (volatile uint32_t *)0x01C41050; *spi_spifmt0 (19 24) | (0 22) | (0 21) | (7 16); // 根据需要设置DELAY // 6. 发送一字节数据 (0xAA) 到片选0并接收数据 volatile uint32_t *spi_spidat1 (volatile uint32_t *)0x01C4103C; // 写入数据并触发传输数据0xAA, 使用格式0 (CSNR0), 传输后释放片选 (CSHOLD0) *spi_spidat1 (0 28) | (0 24) | (0xAA 0xFFFF); // CSNR0, CSHOLD0, DATA0xAA // 7. 等待传输完成 (轮询标志位) volatile uint32_t *spi_spiflg (volatile uint32_t *)0x01C41010; while (!(*spi_spiflg 0x00000100)) { // 等待 INT0_FLAG (bit8) 置位 // 空循环或短暂延时 } // 8. 清除中断标志 (通过向SPIINT0对应位写1清零) volatile uint32_t *spi_spiint0 (volatile uint32_t *)0x01C41008; *spi_spiint0 0x00000100; // 9. 读取接收到的数据 volatile uint32_t *spi_spibuf (volatile uint32_t *)0x01C41040; uint16_t received_data *spi_spibuf 0xFFFF; // 读取16位缓冲器根据CHARLEN取有效位 uint8_t received_byte received_data 0xFF; // 我们配置为8位取低8位实操心得在配置SPI引脚时务必先查阅AM1806的《Pin Multiplexing Control》章节正确设置PINMUX寄存器将管脚功能切换到SPI模式。这是新手最容易栽跟头的地方——寄存器配了半天没反应往往是引脚还工作在GPIO或其他功能上。另外SPI模块的输入时钟源可能是SYSCLK或分频后的时钟也需要在系统级PLL和时钟控制器中正确配置否则计算出的比特率会完全不对。5. 电气时序参数解读与设计要点手册中Table 6-61到Table 6-76那一大堆时序参数表乍看令人头疼但它们是保证SPI通信稳定可靠的金科玉律。我们以SPI0主模式通用时序Table 6-61为例拆解几个关键参数。理解这些参数你就能自己计算系统所能支持的最高SPI时钟频率并判断时序是否满足从设备要求。5.1 主模式关键时序参数tc(SPC)M(序号1) - SPI主时钟周期这是最基础的参数决定了SPI的比特率。例如在1.2V供电下最小周期是20ns对应最大时钟频率50MHz。但注意注释(2)这个时间受限于3PP是SYSCLK2周期或20ns两者中的较大值。这意味着即使你软件配置的时钟分频比算出来周期小于20ns硬件实际运行周期也不会短于20ns。最大频率受限于硬件物理特性。td(SIMO_SPC)M(序号4) - 主设备数据输出建立时间这个参数定义了主设备在时钟有效边沿到来之前需要提前多长时间将第一位数据放到SIMO线上。对于(CPOL,CPHA)(0,0)模式数据需要在时钟上升沿之前至少5ns有效。这个时间保证了从设备有足够的tsu输入建立时间在时钟沿采样数据。tsu(SOMI_SPC)M(序号7) - 主设备数据输入建立时间这个参数定义了从设备发送的数据在SOMI线上必须在主设备采样时钟边沿到来之前保持稳定的最短时间。对于(0,0)模式数据需要在时钟下降沿之前至少1.5ns有效。这是主设备能正确采样从设备数据的保证。如果你的从设备数据变化太慢接近时钟边沿就可能违反这个参数导致采样错误。tih(SPC_SOMI)M(序号8) - 主设备数据输入保持时间这个参数定义了在采样时钟边沿之后从设备数据还需要保持稳定的最短时间4ns。建立时间和保持时间共同构成了从设备数据的“稳定窗口”。5.2 如何应用这些参数进行系统设计设计SPI接口时你需要进行时序预算分析。以一个AM1806作为主设备连接一个SPI Flash作为从设备为例确定主设备时序从AM1806手册Table 6-61获取tsu(SOMI_SPC)M主设备要求的最小输入建立时间例如1.5ns和tih(SPC_SOMI)M最小输入保持时间例如4ns。确定从设备时序查阅SPI Flash的数据手册找到其对应的参数通常是tV数据输出有效时间相对于时钟边沿和tHO数据输出保持时间。计算裕量建立时间裕量 (从设备tV最大值) - (主设备tsu最小值) - (PCB走线延迟等)。保持时间裕量 (从设备tHO最小值) - (主设备tih最小值) - (PCB走线延迟等)。裕量必须为正且最好有一定余量例如2ns。考虑时钟频率根据最严格的时序路径通常是建立时间确定系统能稳定运行的最高SPI时钟频率。如果裕量为负你需要降低SPI时钟频率增大tc(SPC)M或者利用AM1806的SPIDELAY寄存器增加延时来满足时序。5.3 4/5引脚模式的特殊时序对于4引脚带片选和5引脚带片选和使能模式手册提供了额外的时序表如Table 6-63至6-68。这些参数主要围绕SPIx_SCS和SPIx_ENA信号。td(SCS_SPC)M(如序号19)从主设备拉低片选SCS有效到第一个SPI时钟边沿之间的延时。这个延时确保了从设备在时钟开始之前有足够的时间识别到片选信号有效。AM1806允许通过SPIDELAY.C2TDELAY寄存器位域来增加这个延时以适应慢速从设备。td(SPC_SCS)M(如序号20)从最后一个SPI时钟边沿到主设备释放片选SCS无效之间的延时。这个延时保证了从设备在片选无效前有足够的时间完成最后的操作。同样可通过SPIDELAY.T2CDELAY调整。td(ENA_SPC)M(如序号17)在5引脚模式下从设备拉低ENA表示就绪到主设备发出第一个时钟边沿的延时。这给了主设备一个响应从设备就绪信号的时间。td(SPC_ENA)M(如序号18)在5引脚模式下从最后一个时钟边沿到从设备释放ENA表示传输结束的最大允许延时。如果从设备释放ENA太慢主设备可能错误地开始下一次传输。注意事项在高速SPI通信10MHz或长走线情况下PCB的寄生电容和电感会引入信号延迟和边沿退化严重蚕食时序裕量。务必使用示波器测量SCK、MOSI、MISO和CS线上的实际信号质量检查建立/保持时间是否满足要求。对于关键信号可能需要考虑端接电阻或调整驱动强度。6. 不同工作模式下的配置流程与调试技巧6.1 3引脚模式配置要点3引脚模式配置最简单但局限性最大。初始化时只需配置基本的三根线CLK, SIMO, SOMI无需关心SPIx_SCS和SPIx_ENA相关的寄存器位如SPIDEF默认片选寄存器、SPIDELAY中的片选延时等。在作为主设备发送数据时直接写入SPIDAT0或SPIDAT1此时CSNR和CSHOLD位可能被忽略或需设置为特定值需查手册确认。这种模式通常用于点对点通信且从设备不需要片选或片选通过GPIO单独控制。6.2 4引脚模式带片选配置流程引脚配置除了CLK、SIMO、SOMI还需将至少一个GPIO/外设引脚配置为SPIx_SCS功能例如SPI0_SCS[0]。寄存器配置在SPIDEF寄存器中可以设置默认的片选信号极性高有效或低有效。在SPIDELAY寄存器中根据从设备需求合理设置C2TDELAY片选有效到时钟开始和T2CDELAY时钟结束到片选无效。如果从设备对这两个时间有要求必须配置。在SPIFLG寄存器中使能ENABLE_HIGHZ位如果支持可以控制从设备未被选中时SOMI引脚是高阻态还是上拉到高电平。数据传输通过写入SPIDAT1寄存器进行传输是最方便的方式。在写入数据的同时通过CSNR位域选择使用哪个片选引脚例如0对应SPIx_SCS[0]并通过CSHOLD位决定传输完成后是保持片选有效还是立即释放。对于连续传输多帧数据到同一从设备设置CSHOLD1可以避免片选在帧间反复跳变提高效率。6.3 5引脚模式带片选与使能配置流程5引脚模式是功能最全的模式配置也稍复杂。引脚配置需要配置CLK、SIMO、SOMI、SPIx_SCS和SPIx_ENA共5个引脚。主设备端配置在SPIGCR1或相关控制寄存器中使能“ENA”功能并配置ENA引脚的方向为输入用于监测从设备就绪。配置主设备在开始传输前检查ENA信号是否有效。这通常通过设置某个控制位实现具体请查阅寄存器描述使主设备的状态机在发起传输前先查询ENA引脚状态。从设备端配置配置ENA引脚方向为输出。配置从设备在何种条件下驱动ENA有效低电平。通常当从设备的发送缓冲区SPIDAT为空或已准备好新数据且自身片选有效时驱动ENA有效。配置SPIINT0.ENABLE_HIGHZ位。如果该位置1则从设备在传输结束后或未就绪时将ENA引脚置于高阻态此时需要外部上拉电阻确保主设备看到的是无效高电平。如果清0则从设备内部驱动ENA为高电平。硬件连接在多从设备共享ENA线的应用中所有从设备的ENA引脚需要连接在一起并接一个上拉电阻到VCC。主设备的ENA输入也连接到这根共享线上。这样只有当当前被选中的从设备就绪时共享ENA线才会被拉低。6.4 调试实战技巧与常见问题排查问题SPI通信无任何反应时钟线没有波形。排查首先检查SPI模块的时钟是否使能系统级时钟门控。然后检查SPIGCR1.ENABLE位是否置1。接着检查引脚复用PINMUX是否正确配置为SPI功能而非GPIO。最后用示波器测量SPI_CLK引脚在向SPIDAT寄存器写入数据后应该能看到时钟波形。如果没有检查主/从模式配置是否正确以及是否满足了传输启动条件如主模式直接写数据即可启动从模式需等待外部时钟。问题有时能通信有时数据错误尤其在高速时。排查这极有可能是时序裕量不足。首先用示波器同时测量CLK和MOSI/MISO信号。检查建立/保持时间在CLK的采样边沿根据CPHA确定确保数据信号已经稳定了一段时间满足tsu并且在采样边沿之后还保持稳定了一段时间满足tih。如果数据变化太靠近时钟边沿就需要降低SPI时钟频率或者利用SPIDELAY寄存器增加片选到时钟的延时C2TDELAY给从设备更多准备时间。检查信号完整性观察波形是否有严重的过冲、振铃或边沿退化。这在高频或长走线时常见。可以考虑在驱动端串联一个小电阻如22-33欧姆进行源端端接或在接收端并联一个小电容到地注意会增加负载。检查电源和地确保SPI接口两侧的器件电源干净地回路良好。噪声可能通过电源耦合进来。问题多从设备系统中某个从设备无法被选中或数据冲突。排查检查每个从设备的片选CS线是否独立连接到主设备的不同SPIx_SCS引脚或GPIO。确保主设备在通信时同一时刻只有一个CS线被拉低。检查从设备MISO引脚是否配置为开漏或高阻态输出当未被选中时其MISO必须与总线断开高阻态否则会与其他被选中从设备的MISO输出冲突。问题使用5引脚模式ENA时主设备一直等待不发起传输。排查首先测量ENA线的电平。如果一直是高电平说明从设备没有驱动它为低未就绪。检查从设备配置ENA功能是否使能发送缓冲区是否已准备好数据从设备自身的片选SCS是否被主设备有效拉低如果ENA线为低电平但主设备仍不启动检查主设备的ENA输入配置是否正确是否被设置为“等待ENA有效”模式。最后检查ENA线上拉电阻是否连接阻值是否合适通常4.7k-10kΩ。利用中断和DMA提高效率对于大量数据连续传输避免使用轮询SPIFLG标志位的方式这会大量占用CPU。配置SPI传输完成中断INT0在中断服务程序中处理数据收发。对于更高效的数据搬运可以配置SPI的DMA请求与EDMAEnhanced DMA控制器配合实现数据在内存和SPI缓冲器之间的自动搬移几乎零CPU开销。这需要配置SPI的DMA事件映射以及EDMA通道的参数表。踩坑记录曾经调试一个AM1806与高速ADC的SPI通信速率跑到20MHz。一开始数据总是不定期的出错。用示波器抓波形发现MISO数据线的边沿在时钟采样点附近有轻微的“台阶”和抖动。排查后发现是ADC芯片的MISO输出驱动能力较弱而PCB走线较长且靠近一个开关电源受到干扰。解决方案是在靠近AM1806端的MISO线上对地加了一个5pF的小电容不宜过大否则会减缓边沿同时优化了电源滤波问题得以解决。教训是高速数字信号也是模拟信号必须关注信号完整性。