STM32F407跑FreeRTOS,SPI读AD7606偶发数据错位,快被搞疯了
板子是STM32F407+FreeRTOS,SPI2接AD7606,中断方式读转换结果。批量跑了两周,大概每千次里有那么一两次数据错位,高8位跑到低8位位置上去了,像是位偏移。产线那边已经拿这个卡我们了,说再不稳定就换方案。
已经试过的:SPI时钟从10.5M降到5M,好一点但还是偶发;DMA改成中断收发;临界区也加了。逻辑分析仪抓过波形,出问题时CS和SCLK看着都正常,就是数据移位了。怀疑是AD7606的BUSY信号和SPI读取之间有竞态,但还没抓到实锤。
现在怀疑两个方向:一是中断优先级配置,SPI中断和BUSY外部中断会不会抢出问题;二是SPI的CPHA/CPOL在高速下采样边界不稳。但说实话都是猜。
坛子里有没有兄弟用过AD7606+RTOS的?这种偶发错位一般往哪查?中断里直接读DR还是走DMA更稳?在线等,挺急的。
回答(3)
高8位跑到低8位位置,这不像采样边界问题,更像帧同步错了一拍。先看手册确认AD7606是SPI模式几,读时序是发一个字节再收,还是16个SCLK连续移。重点查三处:一、BUSY中断里是不是立刻拉CS开始读,如果正好卡在转换完成瞬间,首bit可能被吃掉,建议BUSY下降沿后延时或等RD/CS建立时间;二、SPI中断优先级必须低于BUSY外部中断,且读16位期间不能被BUSY打断,用taskENTER_CRITICAL护住整帧;三、确认SPI是8位还是16位数据帧,8位分两次读中间被调度就会错位。直接示波器同时抓CS、SCLK、BUSY,看错位那帧首个SCLK相对CS的延迟。
先别急着换方案,这现象八成不是SPI时序,是AD7606的转换/读取没对齐。AD7606是并行输出,你用SPI2接它?确认下是不是外挂了并转串或者用的是它的串行模式(DB7做DOUT),串行模式下读之前必须等BUSY下降沿且CS拉低后第一个SCLK要落在有效窗口,早一个周期就整体移一位,正好解释高8位跑低8位。排查:1)BUSY中断里别直接读,置信号量给读任务,转换期间绝对不能碰SPI;2)确认CPOL/CPHA=AD7606串行要求(SCLK空闲高、第二边沿采样,即CPOL=1 CPHA=1),手册时序图对着看最快;3)读之前加个几十ns的CS建立延时,F407 SPI2在5M下CS到首SCLK太快,AD7606没准备好。
兄弟别急,数据错位往高位跑一般是采样边沿踩线或者时序竞争。先看CPOL/CPHA,AD7606是SPI模式1(CPOL=0,CPHA=1),时钟下降沿采样数据,配错了高速下就容易错位。再就是BUSY中断和SPI中断的优先级,建议BUSY外部中断优先级高于SPI,确保转换完成后再启动读,别让SPI抢在BUSY下降沿前读。还有一点容易忽略:DMA或中断读之前先清掉SPI的OVR标志,读的时候CS拉低到SCLK第一个沿之间留点建立时间。逻辑分析仪下次把BUSY一起抓,看错位那次BUSY和CS的先后关系,基本就能实锤是不是竞态了。