SPI是嵌入式里最常用的板级总线之一,接Flash、接屏幕、接传感器,速度比I2C快得多,接线也就四根:SCK、MOSI、MISO、CS。但新手最容易卡住的地方不是接线,而是时序模式配不对,数据读出来全是乱码。
根源在于两个参数:时钟极性和时钟相位。极性决定空闲时SCK是高还是低,相位决定数据在第一个边沿还是第二个边沿采样。这两个组合起来就是四种模式,代码里常写成0到3。器件手册里一定会写清楚用哪种,比如很多Flash用模式0,有些ADC用模式3。配错了不会报错,只会读出一堆看着像但不对的数。
看时序图有个笨办法但特别好用:先找CS拉低的那一段,再看数据线上哪个箭头对应采样点。如果箭头画在SCK上升沿,说明是在上升沿采样,结合空闲电平就能推出模式。别死记模式编号,直接对着图确认采样沿,基本不会错。
片选也不能忽视。一条总线上挂多个从设备时,每个设备一根独立的CS,通信时只拉低目标那根,其余保持高电平。有些器件要求CS在整帧数据传输期间一直保持低电平,中间不能抬起来,否则内部状态机复位,数据就断了。用硬件SPI还好,软件模拟的时候时序容易被中断打断,CS被误拉高就会出现偶发错误。
速率方面,SPI没有标准上限,跑多少取决于从设备和走线。板内短线跑几十兆很常见,排线长一点、上拉弱一点,就得降速。调试时先低速跑通,再一点点往上加,加到头开始出错,退回来留三成余量,这个经验值比看手册管用。
还有几个实际会踩的点:MISO是输入,配置成推挽输出会跟从设备对着干;多设备共总线时,没选中的从设备MISO应该是高阻态,如果它强行输出就会冲突;长距离传输最好串个几十欧的电阻做阻抗匹配,能明显减少振铃。
总的来说,SPI不难,难在细节。把模式、片选、速率这三件事对准手册,再用逻辑分析仪抓一帧对比,问题基本都能定位。真调不通的时候,先怀疑时序和接线,别急着换芯片。
上一篇:TFTP协议是干什么的:路由器刷机、批量升级为什么都离不开它
下一篇:没有了