测试目的:理解通讯原理以及CPOL和CPHA对通讯的影响
测试器材:STC12C5A60S2单片机*2、面包板*1、DT9205A万用表*1、USB转串口线*1、
11.0592MHz晶振*2、排针和杜邦线若干
测试一:测量从机输出的数据
测试方法是通过IO口模拟时钟信号并测量MISO引脚的电压来判断从机的输出与时钟信号的关系。由于时钟信号受CPOL和CPHA的影响,所以需要分步实验。
第一步 测试放入数据后不输入时钟,数据的第一位是否在MISO引脚上
| |
SS控制主从模式、先采样后移位、空闲时钟为低电平、大端模式。 | 放入数据后,拉高SS,MISO为高电平且不受移位寄存器的数据影响。拉低SS,移位寄存器的第一位数据出现在MISO。 |
| 结果同上。按手册中的时序图的情况这时的MISO输出是未定义的。 |
忽略SS引脚且MSTR=0、SS=1,其他同上两次 | |
结论:为从机模式时移位寄存器的第一位马上出现在了MISO引脚上 |
第二步 CPHA和CPOL对数据输出的影响
| |
SS控制主从模式、先采样后移位、空闲时钟为低电平、大端模式。 | |
| |
| |
结论:CPHA影响采样和移位的顺序,如果CPHA=1则第一个时钟沿是“忽略的”(可能在其他设备的SPI中的作用是使数据出现在MISO上)。CPOL影响采样和移位的触发沿(上升沿还是下降沿)。只要CPHA和CPOL确定下来采样和移位的触发沿也确定了下来,例如CPHA=0,CPOL=0则下降沿为移位。 |
第三步 SPIF置位的条件
| |
| |
| |
结论:SPIF置位不是由SS电平变化引起的,主机模式在任何情况下都可以通过拉低SS变为从机。 |
测试二:测试主从机不同CPHA设置对通讯的影响
测试方法是利用两片单片机,一片设置为从机模式连接电脑串口,另一片设置为主机模式不断发送数据。通过电脑串口调试助手即可查看传输的数据是否正确。
主从机都可以设置CPHA为0或1,所以总共有四种组合,即需要四次实验。下表是时钟为系统时钟/4从机接收到的数据实验结果。
| | | |
| |
| | | |
| |
| | | 传36h有时会出现7Eh、传1Ah有时会出现3Eh |
| |
| | | |
| |
如果我们想知道上面表格结果的原因那么就需要理解SPI数据的传输原理,这边说的原理包括硬件和协议。首先我们来看下硬件层是如何实现数据传输的。下面的图是一张SPI硬件结构图。
从图中看出如果不去深入研究实现的细节,那么其实本质上就是一个移位寄存器连接在IO口上,唯一复杂点的是移位寄存器移位用的时钟。手册介绍说两个单片机用SPI通讯其实相当于是两个8位移位寄存器首尾相连组成一个16位移位寄存器。但是这边有个地方要注意,实际拿两个移位寄存器首尾相连一个有效时钟沿就移动一位,而在SPI通讯中确需要两个时钟沿,这是为什么呢?手册上说需要一个时钟沿用于采样数据。初学单片机时都有知道IO读取数据时有个采样过程(作用类似于按键消除抖动),采样需要一定的时间所以采样和移位不可能同时,一个时钟沿到来时要么触发IO采样读取数据要么使移位寄存器移位。IO读取到的数据送到哪里呢?如果送到移位寄存器中需要一个时钟沿用于移位才能放入。IO有个寄存器,猜想会不会先暂存在IO的寄存器中。要验证这个想让可以设计一个实验,读取IO寄存器的数据不能用MOV指令,要用“读-修改-写”类输入指令(如:ANL P2,A)。下面的几行代码就可以实现验证过程。
void main()
{
P20 = 0; //接SCLK用于模拟时钟信号
InitSPI(); //SPCTL = 0x40
P21 = 0; //接SS用于模拟使能控制信号
P20 = 1 //送一个时钟沿开始采样读取数据
CY = 1;
P15 &= CY; //读取MOSI所在IO的寄存器数据
while(1);
}
实验中把P15接与高/低电平复位单片机运行后测量P15为高/低。通过实验说明采样读取的数据是先放到IO口寄存器中,再次来的时钟沿把IO口寄存器中的数据移入移位寄存器,移位寄存器也同时移出了下一位数据。
下面通过时序图理解通讯的过程。
有了以上对SPI协议的分析现在可以解释SPI四次通讯实验产生结果的原因分析了。
第一次是主从都是先采样再移位。从表中可以看出该种方式可以正确通讯。
第二次是主机先移位再采样而从机时先采样再读取。从表中发现主机丢失了从机的第一位数,而从机
可以正确读取。
第三次是主从机都是先移位再采样读取。该方式同第一种,只是第一时钟沿无效。至于传输出错了个别数据可能是该种方式没有第一种稳定,降低了时钟后发现不会有错误数据出现。
第四次是主机先采样再移位而从机是先移位再采样。该方式和第二种类似,只不过这种是主机读取正确而从机丢失主机的第一个数据。