本帖最后由 neqee 于 2018-12-3 10:43 编辑
这篇文章也许现在对你没什么用,但以后需要的时候希望能帮到你.
之前在论坛也有很多人讨论过长距离通信的最佳方案,希望能找到一种传输距离几十米,速度不要太慢,但又不需要太快,稳定可靠又简单的通信方法,我个人认为非SPI莫属,不过需要将SPI转换成差分信号传输才能做到稳定可靠的超长距离通信。相比之下,RS232、RS485、Can速度太慢, I2C、UART速度不行距离更不行,Ethernet、USB应用复杂成本高而且不够稳定可靠。
SPI作为同步、单向通信接口,时序严谨,支持推挽驱动,支持驱动缓冲,就算不转换为差分传输,如果布线和对地阻抗做地好的话,比如使用灰排线并且每根信号用地间隔,18MHz时钟频率,一般环境下,2米距离通信完全没有问题;但如果是强干扰环境,超远距离通信,就必须考虑将TTL信号转为差分传输,而常用、简单、高速、低成本的差分传输是LVDS:
为什么用DVI线传输LVDS差分信号?原因有下:
(1)连接器可靠性好,非常适合工业应用.
(2)标准线,有各种长度选择,有18+1和24+1两种规格选择,便宜成本低.
(3)双绞线,绕线严谨稳定,100Ω传输阻抗适合LVDS信号传输要求,带屏蔽并且屏蔽效果非常好。
(4)扩展性强,还有好几根线没用到可以用作其他用途,比如从机可以通过DVI线供电,还可以用24+1的DVI线,增加多机通信片选信号。
下面是SPI时序分析,如果不对SPI时序理解透彻,实际操作时有可能会发现通信不稳定,或者通信时钟频率上不去,但又查不出什么原因。
上面我也已经提到,SPI是同步通信,严谨的理解时钟线和数据线的关系是非常重要的,不过在这里我也不可能对这方面做非常详细的讲解,只能说一说需要注意的地方,更多的知识可以到网上查资料学习。
做进一步探讨之前,我们先来看STM32的SPI主机和从机的时序图,在这里我只说明CPOL=1,CPHA=0模式的情况:
对于CPOL=1,CPHA=0模式,不管是主机还是从机,都是下沿获取数据上沿输出数据:
(1)tc是时钟频率,也可以说是时钟周期宽度,这个好理解。
(2)tv是时钟边沿到数据有效时间,理解这个很重要,MISO是经过D触发器输出,时钟边沿(跳变)到触发器输出是需要时间的,也就是数据相对于时钟边沿来说有一定的延迟,这个延迟就是tv,当然,这个tv是相对于单片机I/O那个点来说,事实上,时钟和数据输出还要同时经过最外面一层延迟,那就是I/O处的一个缓冲器。
(3)tsu和th是数据的建立和保持时间,书上长篇大论反而越看越糊涂,其实就是你要用一个时钟边沿去采集一个数据,你总该往数据的中心点采集才可靠吧?tsu意思就是时钟边沿已经到I/O引脚处,MOSI的数据必须提前tsu时间准备好;th意思就是时钟边沿已经从I/O引脚处消失,但MOSI的数据不能马上消失,至少还要保持th这么长时间,否则SCK采集MOSI线的电平可能会发生错误。
从机又多了几个时间概念:ta、tdis、tsu(NSS)、th(NSS):
(1)ta意思就是主机NSS变低有效之后,从机最迟会在ta时间之前把MISO上的数据准备好。
(2)tdis意思是主机NSS变高之后,从机MISO上的数据还会维持tdis时间之后才会消失。
(3)tsu(NSS)、th(NSS),因为对于从机来说,NSS也是数据,当然也要和MOSI一样有建立和保持时间要求。
上面对SPI时序的说明只是帮助理解,下面才是重点:
既然我们要做远距离传输,那么线的延迟就不能忽略了,事实上,相对于几十MHz的信号来说,线的延迟影响是非常大的。
我们先讨论假如没有MISO的情况,SCK、MOSI、NSS三根线的方向都是主机发送到从机,那么经过TTL转LVDS延迟t1、DVI线延迟t2、LVDS转TTL延迟t3,幸运的是, SCK、MOSI、NSS三根线的延迟差不多相等,都是t1+t2+t3,那么到达从机端之后它们之间的时序关系还是保持不变,所以DVI线的长度多少并不会影响到信号传输,如果暂不考虑信号衰减,1米和100米效果是一样的。
但对于MISO来说,情况就完全不一样了,SCK上沿从主机出发,经过延迟t1+t2+t3到达从机I/O,SCK上沿到达从机I/O之后,MISO还要经过延迟t5才会输出到从机I/O处,MISO再经过延迟t1+t2+t3才能到达主机I/O,也就是经过一个环路延迟;而且DVI线越长,这个环路延迟将变的越大;而前面说到SCK是上沿输出下沿获取,意味着这个环路延迟必须要在半个时钟周期之内,否则主机内部的SCK下沿没法正确采集MISO。
这样带来的后果是什么?又想速度快又想接线长就变的矛盾了,我实测在15MHz速率下DVI线最长只能2米左右,那么有什么办法可以解决这个问题?
办法就是稍微改一下从机的时序,让从机不在上沿输出,而是在下沿输出,即主机不变从机改为下沿输出下沿获取,也就是从机的MISO提前半个时钟周期输出,这样就可以多出半个时钟周期的时间给信号延迟使用。这样做之后,我实测在15MHz速率下DVI线长度可延长至5米,10MHz速率下DVI线长度可以做到8米。
那么新的问题又来了,任何单片机的SPI都不能改为下沿输出下沿获取啊,那怎么办?这就没办法了,或者用一个CPLD做转换,或者乖乖的降低时钟,按照上沿输出下沿获取方式工作,只是时钟频率刚好要降低一半。
还有一种方法,也是比较好的方法,加长的线在原来基础上再多延迟1个时钟周期,比如原来SPI频率最高只能到10MHz(100ns),频率不变情况下,线你再加长一点点可不行,干脆加地很长,让增加部分双向延迟等于1个周期100ns或小一点,让主机的SCK对MISO采集多偏移1个时钟周期。这样带来的问题是对于主机采集MISO来说,多出一个没用的最高位,但最低位不见了,怎么办?这个问题是可以解决的,比如你要传一个字节8bit数据,可以把SPI设定为16bit模式,收到之后再移位回来就行,这种方法确实可行而且可靠性不会受任何影响,这样SPI速率是不是可以做到很高?
但位数增加以及软件移位也消耗了速度,所以需要自己衡量,这里只是告诉你有这个思想,如果主机是FPGA就不会有这个问题;这种方法特别适合主机发送多接收少的情况,因为对MISO采集移位是主机接收的事,和主机发送、从机接收没有半毛钱关系;如果你接线很长很长的话,甚至可以偏移几个时钟周期,但下面要说的余量要大一些;按这样算的话,SPI通信速率20MHz传几十米完全没问题!
到这里可能会有人问我,如果拉几十米的线,我该怎么知道SPI时钟频率设置多少合适? 最好的方法是: 大概计算SPI最高频率->实验测试SPI可靠通信最高频率->将SPI时钟频率降低个8至几十ns以保证有一定的余量.
根据上面提供的SPI时钟频率和最大通信线长(从机下沿获取下沿输出),我们就可以大概算出1米线造成的双向延迟是多少,这样我们就可以根据需要的通信距离大概算出SPI可以工作在什么时钟频率,5米@15MHz(66.6ns),8米@10MHz(100ns)-->1米双向延迟11.1ns左右.
如果从机工作在正常时序--上沿获取下沿输出,由前面我们可以推断出线长和最高速率:2米@15MHz(66.6ns),3.5米@10MHz(100ns);如果使用前面所说的"延迟偏移"方法,那么我们可以推断出:
偏移1个周期线长和最高速率是: 8米@15MHz(66.6ns),17米@10MHz(100ns).
偏移2个周期线长和最高速率是: 14米@15MHz(66.6ns),26米@10MHz(100ns).
偏移3个周期线长和最高速率是: 20米@15MHz(66.6ns),35米@10MHz(100ns).
15MHz速率下线长由2米提高到20米,"延迟偏移"方法很厉害吧?
如果使用24+1的DVI线,还可以增加三组片选即总共四组片选信号,如果用编解码方式就可以组建成带16个从机的SPI差分总线(编解码器用高速的):
备注[1]:对于主机接收来说,每一个从机的环路延迟都不一样,如果使用"延迟偏移"的方法接收,那么主机获取MISO输入就要区别对待每个从机的环路延迟(包括线和器件),比如某几个从机环路延迟偏移1个周期,某几个却是2个或几个周期...,这个问题暂时没有很好的解决方法,除非你有办法在主机启动时做个自动检测机制.
备注[2]:如何把握好每个从机环路延迟?要深刻理解前面的内容,还要注意器件的延迟是个范围值(所以余量很重要),否则做出来的东西不是稳定可靠的!
下面是SPI差分超远距离传输的实际应用,下图的"SPI显示器"使用8米24+1 DVI线(28AWG, Ø=7.3),显示器通过DVI供电,触摸屏、鼠标、键盘也是通过SPI回传给STM32,所以,显示器和主机只有1根接线,SPI时钟频率最高10MHz(作为从机下沿获取下沿输出),这个显示器已经申请专利并获得授权,SPI差分通信本身并非专利:
下面是"SPI显示器"使用16米24+1 DVI线(28AWG, Ø=7.3),使用"延迟偏移"2个周期方法,线长和最高速率是:16米@15MHz(作为从机下沿获取下沿输出):
看到这里,你可能会发现一个问题,对于一个显示器来说,10MHz的SPI速度怎么可能够用?这是因为这个"SPI显示器"并非像一般显示器那样传输RGB像素数据,而是用指令控制显示的。打个比方,要显示器显示一个矩形,那么单片机只需要发送矩形的坐标、颜色、长、宽给显示器,显示器再去执行这个指令,生成矩形RGB数据并写入内部显存中。其实这只是基本原理,这个显示器最大的特点在于可以和界面软件库emWin无缝衔接,作为emWin的图形加速显示屏,利用显示器强大的图形处理能力,还有大容量FLASH储存字库和图片,还有双显存设计防止"拉窗帘"现象,让emWin的界面显示效果发挥的淋漓尽致。
下面是显示器DVI接口的引脚定义,把供电VCC定义在中间4个引脚好处是:(1)线够大(2)可以使用18+1 DVI线也可以使用24+1 DVI线,使用18+1线时显示器由外部电源适配器供电.
如果你的主机和从机都是FPGA,那就更好了!加上中间3组差分引脚,你可以实现2对MOSI加2对MISO,或者4对MOSI加1对MISO,那传输速度就不得了了!而且还可以省掉TTL、LVDS互转芯片:
SPI作为同步、单向、推挽串行高速接口,它的扩展性和可转换性是非常强大的,我在想,以后工控设备主机是不是可以像串口DB9那样配备一个这样的"DVI接口"呢?
|