SPI频率没错,读回数据为何总错一位?
SPI周期正确只是速度合规,空闲电平和采样边沿错位仍会让字节整体移位
W25Q系列常用SPI模式0或模式3:时钟空闲电平不同,但都在上升沿采样、下降沿更新。MCU配置必须与器件定义对齐,逻辑分析仪的解码模式也要一致。
SPI时钟频率没有超规格,片选也完整拉低,读JEDEC ID却总是错一个固定值。把时钟从几兆降到几百千赫,错误仍像整体左移或右移一位;逻辑分析仪换一个SPI模式后,解码数据突然又正常。
这通常不是速度问题,而是采样边沿错了。SPI的CPOL决定空闲电平,CPHA决定从哪个有效边沿开始采样。主机若在从机更新数据的边沿读取,首个比特的起点就会错位,后面七位即使周期稳定也救不回来。
先确认四根线和数据方向以W25Q16为例,主机通过CS、CLK、DIO和DO与存储器通信。DIO通常承载主机到从机的数据,DO承载从机返回的数据,片选拉低后器件才把后续时钟解释为当前指令。
图1 W25Q16的CS、CLK、DO和DIO与STM32引脚连接
排查时先确认引脚复用、上拉和方向没有接反。若读写线命名沿用了MOSI、MISO或DIO、DO的不同叫法,要回到器件引脚号核对,避免在软件层把方向理解颠倒。
**模式判断之前,先保证时钟、片选和两条数据线指向正确。**
把库函数参数翻译成真实边沿代码里的CPOL_High表示时钟空闲为高。若再选择第二个边沿采样,对很多STM32库而言就对应模式3:空闲高,首个跳变是下降沿,第二个跳变是上升沿。
图2 STM32配置中CPOL与CPHA共同决定SPI模式
不同厂商库可能把CPHA写成1Edge、2Edge、Leading或Trailing。不要只记枚举名称,应画出片选拉低后的第一个和第二个跳变,再标出哪一边沿采样,语义就不会被命名绕晕。
从机数据手册才是模式边界资料中的W25Q说明支持模式0和模式3。两种模式空闲电平不同,但数据输入在上升沿采样,输出在下降沿更新。主机必须在器件保证数据稳定的边沿读取。
图3 W25Q支持模式0与模式3,并规定输入采样和输出更新边沿
如果主机配置成模式1或模式2,就可能在从机刚切换输出时采样。降低频率只能拉长两个边沿之间的时间,却不能改变采样与更新发生在同一个边沿这一事实,所以固定移位错误可能一直存在。
**频率决定边沿间隔,模式决定你站在哪一个边沿上。**
首个采样点最容易暴露错一位片选拉低后,从机需要根据指令定义输出首个比特。模式0与模式3虽然空闲电平不同,都应让主机在上升沿读取稳定数据。若CPHA选错,接收移位寄存器可能把空闲值当成第一个比特,后续数据整体平移。
逻辑分析仪也要配置同一CPOL、CPHA和位序。若更换解码模式后字符变对,只说明波形可以被那个模式解释,还要核对MCU真实寄存器和器件手册,不能把解码器当成硬件配置证据。
图4 模式0与模式3的首个边沿和上升沿采样位置
模式正确后,再查建立保持与片选若低速正常、高速错误,重点再转向走线振铃、电平转换器延迟、时钟占空比和数据建立保持时间。探头要同时看CLK与返回数据,触发点放在片选边沿,避免只截取中间几个稳定周期。
连续读、多字节命令和半双工切换还会引入方向改变与空字节。把指令、地址、dummy cycle和首个有效数据逐段标在波形上,才能区分模式错位、协议字段遗漏与物理层边沿质量。
位序也是固定错位的常见来源。大多数Flash命令以MSB先发,若MCU设成LSB first,时钟和边沿都可能看似整齐,命令值却被逐位反转。从机不会识别指令,返回线可能保持高阻或固定电平,逻辑分析仪若位序也设错还会制造二次误导。
把模式与协议拆成两张检查表片选在一条命令期间必须满足器件定义。某些驱动每发送一个字节就由硬件自动抬高NSS,Flash会把后续地址或dummy byte当成新事务。此时读回也可能表现为固定错位,但波形上能看到片选被切成多段,与CPHA错误不同。
全双工SPI发送一个字节的同时也会接收一个字节。读取Flash数据时,主机需要继续发送dummy byte来提供时钟;若软件少发一个dummy,接收缓冲区的第一个值可能属于指令或地址阶段,看起来就像数据整体移动。
高速调试时可先在模式正确的前提下逐级提高频率,并记录每一级的时钟过冲、数据建立时间和读回错误率。只有错误随频率或边沿质量明显变化,才说明问题进入信号完整性边界;低速也固定错一位,更应回到模式、位序和协议字段。
结论SPI频率正确,只说明时钟周期可能合规;CPOL与CPHA错了,主机仍会在错误边沿装入数据,表现成固定错位或整字节移位。
从机手册、MCU寄存器和逻辑分析仪三处模式必须一致。先对齐首个采样点,再讨论提高频率和优化波形。
声明:
本文由凡亿教育整理,转载请注明来源!
投稿/招聘/广告/课程合作/资源置换 请加微信:13237418207

扫码关注










































