打印
[国产单片机]

STC单片机SPI测试总结

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


评分
参与人数 1威望 +2 收起 理由
autopccopy + 2 很给力!

相关帖子

沙发
JY-DX-JY| | 2015-8-13 16:45 | 只看该作者
林妹妹

使用特权

评论回复
板凳
autopccopy| | 2015-8-14 12:11 | 只看该作者
很详细,顶LZ!

有些人不看数据手册,发现一点小问题也不去思考和试验,就认为单片机有问题,太浮躁了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

163

帖子

7

粉丝