工作中调试了高通平台的几个项目,解决了几个围绕spi的问题。结合网上资料,写了篇spi调试总结,希望能帮助大家。
SPI总线概述---SPI总线接口---SPI总线结构---SPI总线数据传输过程---SPI四种工作方式---SPI调试案例
SPI总线概述
SPI全称是串行外设接口(Serial PeripheralInterface),全双工同步串行通信接口。
优点:数据传输速率较高
缺点:没有指定的流控制,没有应答机制确认是否接收到数据
SPI总线接口
SPI总线只需四条线就可以完成MCU与各种外围器件的通讯:
1)MOSI – Master数据输出,Slave数据输入
2)MISO – Master数据输入,Slave数据输出
3)SCK – 时钟信号
4)CS – Slave使能信号,由Master控制
SPI总线结构
SPI通信采用主从模式(Master-Slave)架构,一般为一个Master和多个Slave的应用模式。SPI总线构成如图所示。
SPI总线数据传输过程
SPI接口在Master控制下产生的从器件使能信号和时钟信号,两个双向移位寄存器按位传输进行数据交换。传输数据以字节为单位,每个字节高位在前,低位在后(MSB first)。
在一个SPI时钟周期内,会完成如下操作:
1)Master通过MOSI线发送1位数据,同时Slave通过MOSI线读取这1位数据
2)Slaver通过MISO线发送1位数据,同时Master通过MISO线读取这1位数据
Master和Slave各有一个移位寄存器,如图4所示,而且这两个移位寄存器连接成环状。依照SCK的变化,数据以MSB first的方式依次移出Master寄存器和Slave寄存器,并且依次移入Slave寄存器和Master寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。
SPI四种工作方式
下图是4种工作模式:(输入指接收端采样,输出指发送端输出数据)
SPI四种工作方式本质上是区分 数据采样的时间 和 数据输出的时间 这两个元素。
而这个时间区分是依靠sck信号 ,故引出下面两个概念。
CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平
CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样
SPI调试案例
BUG 1
问题现象:
cpu接收到的数据均为0, 抓取spi 4个信号波形,cs clk信号正常,mosi数据正常,miso无数据(为低电位)
原因分析:
1.miso信号线异常问题,故更换外设模组
2.pin脚网络连接问题,故核对引脚接线图
分析验证:
根据分析的1原因 ,更换几个模组发现现象依旧,而模组是量产产品,一般不会都有问题,说明1可以忽略。
根据分析的2原因,核对原理图 ,发现从cpu引出gpio pin网络时 ,MISO与MOSI接反了。然后飞线把顺序换回来,spi通信正常 。
解决方案:
硬件改版 , 修改pin网络
软件互换cpu miso mosi输出的引脚(这要看软体是否支持)
BUG 2
问题现象:
SPI波形显示,miso前8 bit始终为0该如何解释?
原因分析:
因为spi工作需要先把slaver的寄存器地址发送过去 ,且clk是同步的,故前8 bit的miso是没有信号的。故正常。
行文至此,东哥想多说几句,优秀的嵌入式人要具备快速准确解决问题的能力,这不仅要知识面广,经验足,更需要正确的调试思路。需要多思考,深入思考。记得关注我的博客,常来看看。