注意:关于设计芯片原理图都有,在这里讲的更多的是硬件的设计的细节,比如为什么会有这么个电阻?设计的时候要注意什么?
前置知识
USART串口
注意:在串口助手的接收模式中有文本模式和HEX模式两种模式,那么它们有什么区别?
文本模式和Hex模式是两种不同的文件编辑或浏览模式,不是完全相同的概念。文本模式通常是指以ASCII编码格式表示文本文件的编辑或浏览模式。在文本模式下,文本文件的内容以可读的字符形式显示,包括字母、数字、符号等,这些字符被转换为计算机能够识别和处理的二进制编码。而Hex模式则是指以十六进制编码格式显示文件内容的编辑或浏览模式。在Hex模式下,文件的内容以16进制数值的形式显示,每个字节(byte)用两个十六进制数表示,从0x00到0xFF,可以查看文件的二进制编码,包括数据、指令、标志位等信息。因此,虽然文本模式和Hex模式都是用于文件编辑或浏览的模式,但它们的显示和处理方式不同,用途也不同。
STM32如何才能获取到陀螺仪、蓝牙器等这些外挂模的数据呢?
这就需要我们在这两个设备之间,连接上一根或多根通信线,通过通信线路发送或者接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。所以在这里,通信的目的是,将一个设备的数据传送到另一个设备,单片机有了通信的功能,就能与众多别的模块互联,极大地扩展了硬件系统。
下面我们分别对串口通讯协议的物理层及协议层进行讲解。
物理层
串口通讯的物理层有很多标准及变种,我们主要讲解RS-232标准 ,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。
使用RS-232标准的串口设备间常见的通讯结构见图 串口通讯结构图 。
在上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。 由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。
电平标准
根据通讯使用的电平标准不同,串口通讯可分为TTL标准及RS-232标准,见表 TTL电平标准与RS232电平标准 。
使用RS232与TTL电平校准表示同一个信号时的对比见图 RS-232与TTL电平标准下表示同一个信号 。
因为控制器一般使用TTL电平标准,所以常常会使用MAX3232芯片对TTL及RS-232电平的信号进行互相转换。
单端信号与差分信号
三种通信方式——单工、半双工和双工通信
一、RS-232信号线
在最初的应用中,RS-232串口标准常用于计算机、路由与调制调解器(MODEN,俗称“猫”)之间的通讯 ,在这种通讯系统中, 设备被分为数据终端设备DTE(计算机、路由)和数据通讯设备DCE(调制调解器)。我们以这种通讯模型讲解它们的信号线连接方式及各个信号线的作用。
基本信息
在旧式的台式计算机中一般会有RS-232标准的COM口(也称DB9接口),见图 电脑主板上的COM口及串口线.
其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的RS-232标准调制的。
在这种应用场合下,DB9接口中的公头及母头的各个引脚的标准信号线接法见图 DB9标准的公头及母头接法 及表 DB9信号线说明 。
上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连, 所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用“直通型”的串口线连接起来即可, 见图 计算机与调制调解器的信号线连接 。
串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。 例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。
在目前的其它工业控制使用的串口通讯中,一般只使用RXD、TXD以及GND三条信号线, 直接传输数据信号,而RTS、CTS、DSR、DTR及DCD信号都被裁剪掉了。
数据发送逻辑
一般只用RX、TX、GND就可以进行数据传递了,但也有用到其他引脚的时候,其定义如下:
- A->B,A使得RTS引脚有效,表明“请求发送”数据给设备的B。
- A检测CTS引脚,CTS有效,说明B自己准备好接受数据了,才会真正开始发送数据。
- 在发送每个字符之前,都会去检测对应的CTS是否有效,如果有效,才会继续传输对应的数据,如果发现CTS无效,那么就不能发生数据了。
- 对于CTS一直有效的情况,A就一直发送数据给B,到了最后数据发送完之后,再把RTS设置为无效,表示数据已经发送完了。
- 这就是整个单个的数据发送流程。
数据帧格式
电气特性
EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了明确规定。
在TXD和RXD引脚上电平定义:逻辑1(MARK) = -3V~-15V
逻辑0(SPACE) = +3~+15V
在RTS、CTS、DSR、DTR 和DCD等控制线上电平定义:
信号有效(接通,ON状态,正电压)=+3V~+15V
信号无效(断开,OFF状态,负电压)=-3V~-15V
以上规定说明了RS-232C 标准对逻辑电平的定义。对于数据(信息码):逻辑“1”的传输的电平为-3V~-15V,逻辑“0”传输的电平为+3V~+15V;对于控制信号;接通状态(ON)即信号有效的电平为+3V~+15V,断开状态(OFF)即信号无效的电平为-3V~-15V,也就是当传输电平的绝对值大于3V 时,电路可以有效地检查出来;而介于-3~+3V之间的电压即处于模糊区电位,此部分电压将使得计算机无法准确判断传输信号的意义,可能会得到0,也可能会得到1,如此得到的结果是不可信的,在通信时候体现的是会出现大量误码,造成通信失败。因此,实际工作时,应保证传输的电平在±(3~15)V 之间。
电路设计
具有 ±15kV ESD 保护功能的 MAX3221 3V 至 5.5V
RS-232 线路驱动器和接收器
以MAX3221
芯片举例:
引脚说明:
(1)C1+(电荷泵倍压电容器正极)、C2+(电荷泵逆变电容器正极)、C1-(电荷泵倍压电容器负极)、C2-电荷泵逆变电容器负极):与RS232内部电路构成电荷泵电路,对RS232的输出电压进行调节,达到要求的电平。
c1正和c1负,它们分别代表了内部稳压电路所需的一个电容的正负极。同样地,c2正和c2负也是内部稳压电路所需的另一个电容的正负极。
这些电容的具体大小已经给出,我们只需按照要求和芯片手册将其正确连接到对应的管脚位置即可。关于内部稳压电路的具体细节,由于并未提供给我们,因此我们无法深入了解。但是,只要按照芯片的要求,将电容放置在靠近管脚的位置,就能确保电路的正常工作。
(2)DIN、DOUT、RIN、ROUT:用于MCU或其他具备TTL/CMOS 电平的芯片与RS232芯片通信的接口
DOUT: RS232线数据输出(到远程RS232系统)
RIN: RS232线路数据输入(来自远程RS232系统)
ROUT: 逻辑数据输出(至UART)
DIN: 逻辑数据输入(来自UART)
(3)
F
O
R
C
E
O
F
F
‾
\overline{FORCEOFF}
FORCEOFF(Automatic power-down control input)、FORCEON(Automatic power-down control input):串行端口处于非活动状态时,可提供灵活的电源管理控制选项。
当 FORCEON 为低电平且 FORCEOFF 为高电平时,自动断电功能启用。在这种运行模式下,如果器件在接收器输入端未感应到有效的RS-232 信号,则会禁用驱动器输出,且电源电流将降低至 1μA。INVALID 输出会通知用户接收器输入端是否存在 RS-232 信号。
(4)V+(+5.5V由充电泵产生)、V-(-5.5V由充电泵产生):
与RS232内部电路构成电荷泵电路,对RS232的输出电压进行调节,达到要求的电平。
无法识别
MAX3221,是一个五点五伏的电源轨芯片。这意味着,无论我们输入的电源是三点三伏还是五伏,当它被转换成RS-232输出时,都会稳定在五点五伏。
这款芯片内部有一个升压电路,它的作用是将RS-232这一端的信号全部提升到五点五伏。因此,即使我们的电源是三点三或五伏,经过这个芯片处理后,TTL端出来的信号都是五点五伏。
当然,电源芯片的种类并不止这一种。有些RS-232芯片的输出电压可能会更高,比如七点几伏、八点几伏,甚至达到十伏左右。但通常,我们默认的标准是五点五伏。在实际测试中,由于各种因素,测得的电压可能会略高于或略低于五点五伏,这都是正常的。
在逻辑上,我们通常会认为正逻辑是五点五伏,而负逻辑是负五点五伏。这是因为,当芯片输出正信号时,它的电压就是五点五伏;而当输出负信号时,电压就是负五点五伏。
通常情况下,如果驱动出来的RS-232信号电压稍微偏高一点,并不会造成问题。因为理论上,只要电压不超过15伏,就不会有问题。然而,如果电压偏低,特别是在某些芯片中,可能会引发问题。例如,当RS-232的电压降低到四点几伏时,某些设备可能就无法正确识别了。
这可能是因为驱动能力不足,导致电压下降。尤其是在传输线较长、驱动能力较差的情况下,更容易出现这种问题。如果电压降低到四点几伏,虽然从RS-232的标准来看,负三三伏以上就应该被判定为有效电压,但实际情况可能会因为电压过低而无法被正确识别。
还有一个可能是PC机它的兼容性非常差。
解决这类问题的方法通常是增强芯片的驱动能力,或者选择更高的电源电压,比如九伏。当然,这并不意味着一定是芯片本身的问题,因为从标准上看,它的表现并没有错。也有可能是设备兼容性问题,比如PC机的兼容性较差。
如果你发现,收不到数据或者通讯完全断了的情况,但是物理连接是对的,你就看输出有从232芯片发出来了没有?如果有,那就可能是你发送端这边的驱动太弱,或者对方兼容性太差。还有注意一下电平要有足够的余量。
这个案例提醒我们,在设计电路时,一定要考虑到各种可能的情况,包括电压的稳定性、驱动能力等因素。如果发现数据无法正确传输或者通讯中断,首先要检查的就是电压和驱动能力是否正常。只有确保这些因素都符合要求,才能确保电路的稳定性和可靠性。
TX端接上拉电阻吗?
针对232电路的TX(接收端)是否需要接上拉电阻的问题,我们进行了深入的分析。在实际应用中,我们可能会遇到这样的问题:发送了一页数据,经过22个小时后,接收端收到的数据包与发送端发送的数据包数量不一致,出现了丢包现象。特别是在无人值守或需要高可靠性的通信环境中,这种情况是我们不希望看到的。为了测试通信的可靠性,我们可能会进行连续发送数据的测试,比如连续发送七天。
如果在测试过程中,接收端能够准确无误地接收到所有发送的数据包,那么我们可以认为通信是可靠的。然而,如果在实际应用中出现了丢包或数据错误的情况,我们就需要寻找原因并解决问题。经过分析,我们发现有些问题可能与控制器的性能有关,比如控制器没有足够的驱动力将信号线拉高。
在CMOS电路中,单片机在复位和初始化过程中,其管脚通常处于高阻态(浮空输入)状态。如果此时没有外部上拉电阻,就可能会导致寄存器中出现脏数据,从而引发收发包错误。为了避免这种情况,我们需要在整个上电和初始化过程中,为信号线加上外部上拉电阻。这样,即使控制器没有足够的驱动力,也能保证信号线处于一个稳定的状态。
关于上拉电阻的位置,通常我们会将其放在T叉端。这是因为,在处理器上电和初始化过程中,所有的管脚都会处于高阻输入状态。如果没有加上拉电阻,就可能会导致数据被错误地发送出去。为了避免这种情况,我们需要为信号线加上上拉电阻。
需要注意的是,上拉电阻的加入并不是绝对的,而是需要根据具体的硬件和通信协议来决定。在大多数情况下,只要条件允许,我们应该尽量加上上拉电阻以提高通信的可靠性。此外,为了保证通信的稳定性,我们还可以选择适当的上拉电阻值,比如4.7kΩ或10kΩ。
二、RS485&422电路设计
RS-232是一种常用的串口通信协议,它在许多设备和系统中都有广泛的应用。然而,它也有一些明显的局限性。
- 传输速率较低:RS-232的传输速率相对较低,常用的波特率如9600、115200等,通常不会超过3Mbps。这对于需要高速通信的应用来说可能是一个限制。
- 抗噪声和抗干扰能力较弱:RS-232采用端信号传输方式,接口使用一根信号线和一根信号返回线构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
- 传输距离有限:在实际应用中,RS-232的传输距离通常限制在10到20米范围内。如果需要更远的传输距离,通常需要添加调制解调器(如MODEM)等设备。
- 点对点传输限制:RS-232主要支持点对点的通信方式,即只能连接两个设备进行通信。这限制了它在需要构建多设备网络或总线系统中的应用。
基本信息
- RS-422是一种全双工通信协议,允许单个驱动器与多个接收器通信,数据信号采用差分传输方式,速率最高可达50Mbps。
- RS-485是半双工通信协议,满足所有RS-422的要求,而且比RS-422稳定性更强。具有更高的接收器输入阻抗和更宽的共模范围(-7V至+12V)。
- RS485的最长传输距离能达到1200米,但在实际应用中传输的距离要比1200米短,具体能传输多远视周围环境而定。
- RS485发送接收引脚是A、B, RS422发送引脚是T+、T-,接收引脚是R+、R-,485兼容422的话,将T+、R+接到A,T-、R-接到B,相当于是将全双工变为半双工。
RS-485协议采用平衡差分信号传输方式,具有更强的抗干扰能力,可以在较长的距离上保持信号的稳定性。同时,RS-485支持多点通信,可以在一条总线上连接多个设备,构建成多设备网络。这使得RS-485在工业自动化、数据采集等领域得到了广泛应用。
RS-422协议与RS-485类似,也采用平衡差分信号传输方式,具有较强的抗干扰能力。不过,RS-422更注重于双向通信和多分支结构的支持,适用于需要多个发送器和接收器的应用场景。
发送端逻辑电平定义:
1.最大驱动输出电平 -7V≤ VAB ≤+12V
2.发送端AB间的电压差VAB :
- +2~+6V 逻辑 “1”
- -2~-6V 逻辑 “0”
接送端逻辑电平定义:
接收端AB间的电压差VAB :
- >+200mv 逻辑“1”
- <-200mv 逻辑“0”
除了驱动器外,接收器也是RS-485的一个重要组成部分。接收器需要具有高灵敏度,以便在接收信号时能够准确判断逻辑值。尽管在长距离传输过程中,线缆的损耗和驱动能力的限制可能导致接收到的信号电压差降低,但接收器仍然能够通过判断A和B之间的电压差来判断逻辑值。通常,接收器的灵敏度阈值约为200mV,但有些接收器甚至可以在更低的电压差下工作。
它的接收端灵敏度相对较高,这意味着即使信号衰减得很厉害,它仍然能够准确识别并进行可靠的信号传输。因此,它能够实现更远的传输距离,并且所需的工作电压比RS-232更低。这是因为传输距离的增加会导致能量损耗和电压差的降低,但对于这种接收端来说,这并不会影响其接收能力。
接下来,让我们谈谈差分传输。差分传输是一种平衡传输方式,具有出色的抗干扰能力。当我们在一条线上发送信号时,经过驱动器处理后,信号被转换为差分信号,即D+和D-。这两个信号在传输过程中,如果受到外部干扰,由于它们靠得非常近(通常作为双绞线使用),干扰会同时作用于这两个信号。因此,当我们将D+和D-相减时,这些干扰信号就会被消除,从而增强了整个系统的抗干扰能力。
在没有干扰的情况下,传输的差分信号(dt)等于D+与D-的差值。在接收器端,这个差分信号会被还原为原始信号,并且与发送端的信号保持一致。这是因为在传输过程中,信号会经历从3.3V CMOS电平到RS-485电平的转换,然后再从RS-485电平转换回3.3V CMOS电平。
如果存在噪音干扰,由于双绞线的特性,这些噪音会同时作用于D+和D-。因此,当我们在接收器端对这两个信号进行相减操作时,这些噪音信号就会被消除,从而保证了信号的纯净度和稳定性。这也是RS-485相较于RS-232的一个显著优势,使得它能够在更远的距离上实现更可靠的传输。
现在,我们来看一下这些芯片的管脚。这是485的芯片,看起来管脚并不复杂。驱动器的输入端(A、B
),我们通常称之为CMOS端,这个端口的工作电压是三点三伏,它连接到处理器上。输出端(RO、DI
),连接到T叉和R叉。此外,还有两个使能端(RE、DE
),一个是驱动器的使能,另一个是接收器的使能。
在实际应用中,除了这些基本的信号外,还需要考虑到电源和其他一些信号。有些设计中,这两个使能端甚至可以省略,因为它们默认就是使能的。这与232电瓶转换芯片有些相似,但也有一些不同之处。大家有没有注意到,这里有两个(120R)电阻,这两个电阻是起什么作用的呢?在设计485或422的电路时,如何添加这两个电阻?应该选择多大的电阻?放在什么位置?这些问题都是需要我们思考的。后面我们会讲到这些内容,现在我们先来了解一下这几个管脚的作用。
RO
是接收器的输出端,当从外部接收到信号后,它会经过接收器再传输到处理器的RX上。
DI
是驱动器的输入端,处理器的输出TX经过驱动器后,会转换成422或485信号输出到外部。
RE
和DE
是使能端,比较有趣的是,RE是低电平势能,而DE是高电平势能。通常我们会将这两个信号短路接在一起。当它们是逻辑一高电平的时候,驱动器就会输出信号;当它们是逻辑零的时候,接收器就会接收信号。由于它是半双工的,所以在发送和接收时不能同时进行,我们需要用一个信号来控制这两个过程。
在实际设计中,我们有两种方法来控制这个过程。一种是手动控制,通过分别控制这两个信号来实现发送和接收的切换。另一种方法是使用纯硬件进行自动控制,具体如何实现呢?这里给大家提个醒,可以利用DI来控制RO和RE的电瓶切换。通过利用默认状态和控制逻辑门或切换开关,我们可以实现发送和接收的自动切换。
终端电阻的选择
定义:
在线型网络两端(相距最远的两个通信端口上),并联在一对通信线上的电阻。
作用:
根据传输线理论,终端电阻可以吸收网络上的反射波,有效地增强信号强度。
那么这个匹配电阻应该放在哪里,其阻值应该是多少呢?对于485芯片,由于它是双向的,不分r叉和t叉,我们通常会在其两端,靠近管脚的位置,分别放置一个120欧姆的电阻。这样,AB之间就形成了一个并联匹配。这个120欧姆的电阻要跨接在AB之间,以匹配传输线的阻抗,通常标准要求是120欧姆。
除了之前提到的内容,422和485并不是点对点的连接,而是多点到点的连接,可以连接多个设备。那么,多个设备是如何连接的呢?其实,422和485的连接方式非常相似。
这是一个设备、设备二、设备三……连接到中间的四倍线路。在做匹配时,我们只需要在两个终端加上匹配电阻就可以了,中间的子节点通常是不需要加的。
如果只有两个设备进行通信,那么这两个设备就相当于是点对点的通信。这是一个422的全双工通信,这边是接收器,这边是发送器。我们在设计的时候,往往只需要在接收器端加上匹配电阻。比如,如果你设计的是这一端,与另一端进行通信,那么另一端也需要在接收器端加上匹配电阻。
这是加匹配电阻的位置,大家一定要注意。对于422芯片,我们只需要在接收器端加上电阻。而485芯片,由于RX和TX叉是连在一起的,所以两边都需要加上电阻。
偏置电阻的选择
偏置电阻的作用:
- 当总线空闲或开路时,利用偏置电阻将总线偏置在一个确定的状态(差分电压≥200mV),这样即使线路中出现了比较小的反射信号或干扰,挂接在总线上的数据接收器也不会由于这些信号的到来而产生误动作
偏置电阻的大小:
- 电阻的典型值是4.7kΩ,具体数值随电缆的电容变化而变化
除了端接之外,大家还能见到上拉电阻和下拉电阻。在很多情况下,我们现在也会加上这两个电阻。在设计电路的时候,我们通常会把上拉电阻和下拉电阻都加上去。只要有空间,大部分有需求的都会加上这两个电阻。加上这两个电阻的目的是为了让总线在空闲的时候有一个稳定的状态。当总线空闲时,a和b之间的压差大于200毫伏就会产生误触发。为了避免这种情况,我们会在总线空闲的时候默认让a拉高、b拉低。这样,a就拉到了vcc三点三、b拉到了d,得到了一个三点三伏的电压。这样,接收器也有一个拉高的默认状态。这是我们想要的总线空闲状态。所以,我们需要加上偏置电阻来防止由于干扰、噪声或信号反射对其产生的影响。
通常,这个偏置电阻,也就是上下拉电阻,我们会选择10k以内的值,比如1k或4.7k等。这个值的选择也是根据芯片的拉电流和灌电流参数来决定的。通常情况下,1k到10k以内的值都是可以的。
这是关于RS-485电路设计的一个案例,使用的是MAX3076芯片,这款芯片既可以作为RS-485使用,也可以作为RS-422使用。通过将AB端单独接出,它就可以作为RS-422使用;而将AB和YZ短接在一起,它就变成了RS-485。
在设计中,我们通常不会考虑让这两个信号切换。通常,我们会将RTX接到TTL端或者3.3V的电源端,因为它输出的电平基本上都是高电平为3.3V,低电平为0V。IO接口,也就是处理器的一些接口,通常都是SIMS接口,也就是通过SIMS做的一个IO接口。但为了通俗易懂,大家通常称其为TTL。实际上,它应该被称为3.3V RV CMOS更为恰当。
这两个接口我们直接接到处理器的RX和TX上,用两个GPIO来控制它的驱动器和接收器的使能与断开。默认情况下,我们让其断开,只有在需要操作时才将其打开。同样地,将AB和YZ接到一起,就构成了一个半双工的RS-485接口。
为了抑制过冲,我们在电路中放置了两个220pF的电容。这些电容可以有效地吸收开关的上升沿和下降沿的能量。此外,我们还在AB之间跨接了一个120Ω的匹配电阻。同时,上下拉电阻(上拉4.7kΩ,下拉4.7kΩ)用于稳定电平,上拉电阻连接到3.3V电源,下拉电阻连接到地线。
设计关键点:
在设计时,需要注意几个关键点。首先是RTX的方向,不能接错;其次是匹配电阻和上下拉电阻必须正确接入;最后,电源到D的电容也需要放置,通常我们会放置一个大电容和一个小电容,大电容用于储能和滤波,小电容用于退耦和旁路高频噪声。
此外,这个芯片也可以用于设计RS-422电路。与RS-485设计的唯一区别在于,AB和YZ是分开的。在RS-422设计中,我们只需要在RX端进行匹配和偏置,而不需要在两端都做。使能控制的方式与RS-485相同,可以通过软件控制GPIO来实现。
电路设计——单线串口设计
首先,我们来明确一下单线串口的工作原理。单线串口的设计主要基于一个模拟开关,这个开关能够在发送(TX)和接收(RX)之间切换。在不需要流控制的情况下,常规的串口通信需要两根线:一根用于发送(TX),另一根用于接收(RX)。但在单线串口设计中,我们将这两根线通过模拟开关合并成了一根线。
这个模拟开关在需要发送数据时,会切换到发送(TX)模式,将数据发送出去。而当需要接收数据时,它会切换到接收(RX)模式,接收来自对方设备的数据。这样,通过控制模拟开关的切换,我们实现了单线串口的通信。
这种单线串口的设计在某些特定场合下非常有用,比如设备加密等场景。在这些场合下,设备可能需要通过串口接收密钥等敏感信息。由于单线串口只需要一根线,因此在物理连接上更加简单和隐蔽,增加了安全性。
那么,如何实现这个单线串口的设计呢?我们首先需要选择一个合适的模拟开关。这个模拟开关需要具有快速切换的能力,以保证在高速串口通信时不会出现数据丢失或错误。然后,我们将这个模拟开关连接到处理器的串口引脚上,通过控制处理器的GPIO引脚来控制模拟开关的切换。
在软件实现上,我们需要编写一段程序来控制模拟开关的切换。当需要发送数据时,我们将GPIO引脚设置为发送模式,然后发送数据。当需要接收数据时,我们将GPIO引脚设置为接收模式,然后接收数据。为了保证数据的正确传输,我们还需要精确控制每一位的发送和接收时间。
设计概述
利用TTL电平特性和模拟开关(如ADG839)实现数据的双向传输。
通过控制模拟开关的使能端(EN)来切换数据线的方向。
利用TTL电路的高电平特性和信号线上的上拉电阻来实现数据的发送和接收。
设计细节
初始化状态:
TTL电路在空闲状态下保持高电平。
将TTL电路的上拉电阻连接到正电源,确保空闲状态下为高电平。
模拟开关控制:
将模拟开关的使能端(EN)连接到TTL电路的输出端(如TX)。
当TX为高电平时,模拟开关连接到S2,实现数据的接收。
当TX为低电平时,模拟开关连接到S1,实现数据的发送。
数据发送:
当单片机需要发送数据时,将TX设置为低电平。
此时,模拟开关切换到S1,允许单片机将数据发送到外部设备。
由于TTL电路的高电平特性和信号线上的上拉电阻,单片机可以通过拉低TX来发送零电平信号。
当需要发送一电平信号时,单片机保持TX为高电平,此时模拟开关仍然连接到S1,但TTL电路通过上拉电阻保持高电平状态,实现数据的发送。
数据接收:
当单片机需要接收数据时,将TX设置为高电平。
此时,模拟开关切换到S2,允许外部设备将数据发送到TTL电路。
TTL电路处于高阻态,不驱动信号线,允许外部设备通过上拉电阻将数据发送到TTL电路。
单片机通过读取TTL电路的输出端(如RX)来接收数据。
三、I2C
一、总线结构
1.总线结构
I2C两根总线SDA与SCL均为OD门,需要接上拉电阻,实现“线与”逻辑,其中上拉电阻Rp的取值有一定要求: 1.太小会导致灌入的电流太大,使数据不稳定,甚至损坏端口 2.太大会导致SCL/SDA信号上升过缓,不满足时序要求,数据传输出错
2.仲裁
OD门,当MOS管开启时,线路被拉到地,输出逻辑0;当MOS管关闭时,线路悬浮被上拉电阻接到VDD,输出逻辑1 因此,当I2C总线上挂多个设备时,当各个设备SDA输出逻辑相同时,总线上的逻辑固定;当输出逻辑不相同时,输出逻辑为0的设备会抢到总线控制权,其实设备释放总线,
二、时序
1.start信号和stop信号
(1)开始信号:SCL为高时,SDA由高变低(SDA拉低)
(2)结束信号:SCL为高时,SDA由低变高(SDA拉高)
(3)在传输数据时,SDA在SCL为低电平时改变数据,在高电平时保持不变
(4)SCL一般为master产生,当从机未准备好像主机发送数据,可通过将SCL拉低,使主机等待(位握手机制)
2.应答引号
当主机发送完8bit数据时,从机需要“告诉”主机此时自己接收情况
ACK信号:表示从机成功接收(该设计中取ACK信号为低电平)
NACK信号:表示从机未接收/接收失败(该设计中取NACK信号为高电平)
3.读写时序
(1)写时序:向指定寄存器地址写入指定数据操作时序:
(2)读时序:指定寄存器地址读取数据操作时序:
三、电路设计思考
我们都知道I2C是open drain的,不是普通的push-pull,我们也知道open drain的接口信号需要加上拉电阻,那么为什么要用open drain呢?上拉电阻的阻值是否需要计算考量呢?
为什么要用open drain?
细节分析
开漏输出与上拉电阻:
- 开漏输出(Open Drain)指的是一个MOS管输出,其输出低电平时MOS管导通,输出低电平(接地);输出高电平时MOS管截止,输出高阻态(不直接连接到电源或地,相当于断开状态)。
- 由于开漏输出在高电平时处于高阻态,所以需要外部上拉电阻将输出拉高到电源电平,确保输出高电平的有效性。
- 上拉电阻的作用是在开漏输出截止时,通过电阻将输出端拉高到正电源电平,形成高电平输出。
开漏输出与推挽输出的比较:
- 推挽输出(Push-Pull)由两个MOS管(一个NMOS和一个PMOS)组成,可以直接输出高电平和低电平,不需要外部上拉或下拉电阻。
- 尽管推挽输出在单一输出设备上工作良好,但在I2C总线中,由于可能挂接多个设备,推挽输出可能导致总线短路问题。
总线短路问题:
- 在I2C总线中,如果多个设备同时连接到总线,并且一个设备试图输出高电平而另一个设备试图输出低电平,就可能形成电源到地的短路,导致设备损坏。
- 开漏输出由于在高电平时处于高阻态,避免了这种情况,因为不会有设备直接试图将总线拉低到地。
开漏输出的优势:
- 使用开漏输出配合上拉电阻,可以避免多个设备同时操作总线时产生的短路问题。
- 开漏输出简化了电路设计,因为不需要为每个设备提供独立的推挽输出电路。
总结
总的来说,I2C协议选择使用开漏输出而不是推挽输出,主要是为了避免在总线中挂接多个设备时可能出现的短路问题。开漏输出通过在高电平时断开输出,配合外部上拉电阻,确保了总线在多个设备同时操作时仍然能够安全稳定地工作。在设计和检查I2C接口时,必须确保正确添加上拉电阻,以实现可靠的高电平输出和避免潜在的总线短路问题。
上面图已经解释了,I2C是有很多设备线与连接而成,如果采用push-pull的话,难免会出现下面的情况,一个设备输出高,另外设备输出低,也就是左边设备的PMOS打开而右边设备的NMOS打开,这样就在VCC和GND之间形成短路,此时大的电流会把设备烧毁,后果是灾难性的。这种现象叫Bus Contention。
怎么解决Bus Contention?
高阻态(三态)是一种电路状态。既不是高电平,也不是低电平,以高阻态对下级电路输出,下级电路什么影响也没有。高阻态的IO电平高低,随下级电路变化而变,下级为高,它就是高,下级是低它就是低。可以看成是悬空状态。
- 三态门是一种特殊的逻辑门,它有三种状态:高电平、低电平和高阻态(三态)。
- 在高阻态下,三态门不会对总线产生任何影响,相当于总线被断开,这样可以避免多个设备同时驱动总线时产生冲突。
- 当多个设备连接到同一条总线上时,通过使用三态门,可以确保只有一个设备在任意时刻驱动总线,避免了冲突和短路问题。
上拉电阻选择
I2C是一个电平触发的通信协议,而不是边沿触发。这意味着它依赖于电平的稳定状态而不是电平的边沿变化来传递信息。
然而,尽管在很多情况下我们不特别关注I2C的上升沿和下降沿,但这些问题往往在实际应用中出现。通过查阅I2C芯片手册和协议总线规范,我们可以发现它对边沿以及建立时间和保持时间都有明确的要求。
这些要求并非无关紧要,而是为了确保通信的稳定性和可靠性。例如,在400kHz的频率下,I2C协议对高电平和低电平的持续时间、上升沿和下降沿的时间,以及建立时间和保持时间都有具体的规定。
那么,如何判断I2C通信是否符合这些要求呢?我们可以通过观察具体的电路示意图来分析。在示意图中,我们可以看到I2C接口的设备连接情况,以及上拉电阻、负载电容和杂散电容等因素对信号的影响。
值得注意的是,当信号线从低电平变为高电平时,需要通过RC充电过程。这个过程的时间取决于电阻和电容的值。如果I2C的通信速率过快,而上升沿的充电时间相对较长,就可能导致在采集数据时出现问题。因为当数据的高电平判断标准较高时,如果上升沿的时间过短,就可能无法被正确识别为高电平。
随着I2C通信速率的提升,上升沿和下降沿的变化时间变得越来越关键。尤其是上升沿,它由RC充电过程控制,即从低电平到高电平的转变。假设我们的上拉电阻R为15kΩ,而负载电容C为20pF,RC充电时间约为300纳秒。通常啊,这个就是已经没有任何余量了,就出现问题的概率就比较大了。特别是在我们高低温的环境下,它的问题就会更容易凸显出来。
另外还要考虑到实际电路中,除了这个20pF的负载电容,还可能存在其他杂散电容和负载电容,这些电容的总和可能会远大于20pF。
这种情况下,如果我们的数据采集门限设置得较为严格,那么在上升沿只有很短的时间内,数据可能还未达到这个门限,导致数据采集失败。这就是为什么在高速I2C通信中,我们经常会看到数据不稳定或丢失的问题。
要解决这个问题,我们需要关注上升时间是否满足协议标准。以400kHz的I2C通信为例,其最大上升时间限制为300纳秒。如果我们选择的上拉电阻和负载电容组合导致的上升时间恰好为300纳秒,那么在实际应用中可能会遇到问题,因为没有为温度和环境变化留下足够的余量。
影响上升时间的两个主要因素是电阻和电容。电容值受多种因素影响,如板子面积、总线设备数量、布局、走线以及芯片输入电容等。在实际设计中,我们往往无法准确控制这些因素以优化电容值。相比之下,调整电阻值要容易得多。
因此,在计算上升时间时,我们需要留有一定的余量以确保在各种环境条件下都能稳定地采集数据。通过调整上拉电阻的值,我们可以获得一个更合理的上升时间,从而提高I2C通信的稳定性和可靠性。
1.先确定最大值:取值太大的话,会导致两个后果,一是芯片接收端驱动能力不足二是上升时间不够。
2.再确定最小值:电阻取值太小的话,会导致Vol太大,芯片低电平下不来。举个极端的例子,就是上拉电阻为0时,不能产生低电平。
总的来说,电源电压限制了上拉电阻的最小值;负载电容(总线电容)限制了上拉电阻的最大值。
电阻怎么放置
电阻的放置位置
首先,让我们深入探讨一个问题。假设你正在设计一个主板,该主板上集成了三个I2C接口。现在的情况是,你只用到了其中一个,而另外两个并未使用。在此,我要强调的是,许多处理器或CPU的设计有一个重要的特点:即使某些I2C接口未被使用,也不应将其完全悬空。除非该芯片或处理器的设计文档明确说明未使用的I2C接口可以悬空,否则,为了确保系统的稳定性和可靠性,我们应当为这些未使用的接口添加上拉电阻。
想象一下,如果你将未使用的I2C接口完全悬空,可能会在某些情况下遇到潜在的问题。特别是当使用FPGA封装的芯片时,一旦芯片内部的某些管脚没有正确连接或上拉,后期可能无法进行有效的修改。
更为重要的是,许多处理器在启动时会进行自检。如果它检测到某个I2C接口没有正确连接(例如,没有上拉电阻),它可能会错误地认为该接口存在问题(因为它默认是拉高,它认为你的状态不对,就卡死了),从而导致系统初始化失败或进入错误状态。更糟糕的是,从系统的日志或错误输出中,你可能很难找到关于这个问题的明确提示,因为它可能仅仅是在初始化某个未使用的I2C接口时失败了。
比如:一块主板在进入图形界面之前,尝试挂载硬盘,但始终挂载失败。经过长时间的排查,最后发现的原因是主板上的一个未使用的I2C接口没有加上拉电阻,导致处理器在自检时失败。由于这个问题是在硬件层面发生的,而且外部并没有连接任何设备,因此非常难以诊断。
为了确保系统的稳定性和可维护性,建议在设计主板或电路时,为所有未使用的I2C接口添加上拉电阻。这样,即使某些接口未来可能会被使用,也无需更改硬件设计,只需在软件中进行相应的配置即可。此外,通过在软件中进行初始化设置,我们可以确保系统能够正确地识别并处理这些接口,从而实现软件的统一性和灵活性。
关于I2C通信中串联电阻的放置问题,我们可以从理论和实际应用两个角度来分析。
在理论上,串联电阻在I2C通信中确实可以起到一定的作用,如实现阻抗匹配,减少信号反射和干扰等。然而,在实际应用中,这些电阻的效用并不总是显著的,有时甚至会浪费资源。因此,在决定是否添加这些电阻时,我们需要综合考虑系统的具体需求。
如果决定添加电阻,一个常见的做法是在主机和从机两侧各放置两个串联电阻。这样做有助于减少信号在传输过程中的反射和干扰,提高通信的稳定性。对于上拉电阻的放置,一般建议将其放在传输线的中间位置,靠近主机端,以确保信号能够稳定传输。
但请注意,电阻的放置并不是一成不变的。根据具体的硬件设计和系统需求,我们可能需要对电阻的放置位置和数量进行调整。
例如:在对于数据线,因为它是双向传输的,既可能从主机(master)向从机(slave)发送数据,也可能从从机(slave)接收数据。在这种情况下,如果将电阻放置在靠近主机(master)或从机(slave)的位置,可能会导致在数据传输过程中出现反射或干扰。因此,对于数据线上的电阻放置,一般建议是在数据传输的源端和接收端各放置一个电阻,这样可以有效地减少反射和干扰,提高数据传输的稳定性。
而对于数据线,因为它是双向传输的,既可能从主机(master)向从机(slave)发送数据,也可能从从机(slave)接收数据。在这种情况下,如果将电阻放置在靠近主机(master)或从机(slave)的位置,可能会导致在数据传输过程中出现反射或干扰。
因此,对于数据线上的电阻放置,一般建议是在数据传输的源端和接收端各放置一个电阻,这样可以有效地减少反射和干扰,提高数据传输的稳定性。
四、案例——I2C死锁恢复
其实这就是经典的"I2C死锁"。
这是一个I2C的读操作过程:
Master设备发出起始条件(Start condition)。
Master设备发送Slave的地址和读命令。
Slave设备回应ACK(应答信号)并开始发送数据data7-0。这8位数据由Slave设备控制SDA线来传输,而SCL线则始终由Master设备控制。传输8位数据需要80微秒(假设I2C速率为100kHz,每位数据周期为10微秒)。
现在,假设在这80微秒的数据传输过程中,有人按下了复位按钮,那么会发生什么呢?
首先,如果复位发生在Slave设备正在发送数据的过程中,Master设备会因为复位而突然停止产生SCL时钟信号。这意味着Slave设备将无法继续传输剩余的数据。
其次,当Master设备复位完成后,它会忘记之前的I2C操作,包括正在进行的读操作。这意味着即使Slave设备已经成功发送了部分或全部数据,Master设备也无法正确接收这些数据。
另外,如果Slave设备在发送完8位数据后等待Master设备的ACK或NAK响应时发生复位,那么可能会出现状态不一致的情况。因为Slave设备已经完成了数据传输,而Master设备却可能因为复位而未能正确响应。
为了避免这种情况,我们可以考虑在软件层面进行一些改进:
当Master设备检测到SDA线被拉低时(表示Slave设备开始发送数据),它应该开始计数并持续发送9个SCL时钟信号。
在发送这9个时钟信号的过程中,Master设备应该时刻监视SDA线的状态。如果SDA线在某个时刻释放并变高(表示Slave设备已经发送完数据并等待响应),那么Master设备应该立即停止发送时钟信号。
如果在发送完9个时钟信号后,Master设备仍然没有接收到Slave设备的响应(即SDA线保持低电平),那么Master设备可以认为发生了通信错误,并采取相应的错误处理措施。
最后,无论数据传输是否成功,Master设备都应该发送一个停止条件(Stop condition)来结束整个I2C操作。
总结:
1.I2C传输特点
(1)I2C总线空闲时,SCL和SDA均为高电平
(2)start信号:当SCL为高时,SDA由高到低
(3)stop信号:当SCL为高时,SDA由低到高
(4)SCL为低时,SDA才能变化;SCL为高时,SDA保持稳定
(5)I2C从设备ack响应过程:从设备将SDA拉低,等待I2C主设备将SCL拉低之后“取走”ack信号,从机再释放SDA(由低变高)
2.挂死的表现形式
表现:SCL一直为高电平,SDA一直为低电平
详细:
主设备复位导致的I2C死锁过程:
在I2C主设备进行读写操作的过程中,主设备在开始信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从设备输出应答信号,将SDA信号拉为低电平。如果这个时候主设备异常复位,SCL就会被释放为高电平。此时,如果从设备没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。而对于I2C主设备来说.复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。这样,I2C主设备等待从设备释放SDA信号,而同时I2C从设备又在等待主设备将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。同样,当I2C进行读操作,I2C从设备应答后输出数据,如果在这个时刻I2C主设备异常复位而此时I2C从设备输出的数据位正好为0,也会导致I2C总线进入死锁状态。
从设备复位导致的I2C死锁过程:
正常时序下:SDA信号是在SCL为低的状态下改变,即从应答SDA为低电平时,此时SCL应为为低电平(即从设备是先拉低SDA信号,等待主设备SCL由高变低,“取走”ACK信号后,从再释放SDA为高)。但如果此时时序被打乱,例如单片机I2C通信时突然复位,SCL突然变高,则从设备SDA一直为低,等待SCL变低。
主设备表现:SDA被从拉低,故主认为I2C总线占用,一直等待SDA变高。
3.挂死原因
(1)当主设备向从设备发起I2C访问,连续发起8个脉冲后SCL拉低,从设备将SDA拉低以响应主设备,如果此时主设备异常复位,SCL变为高电平;而从设备正常工作,I2C继续响应主设备,SDA一直为低电平,那么此时对于主设备而言,检测SDA为低电平,I2C被占用,等到I2C释放,对从设备而言,SDA为低电平,等待主设备将SCL拉低后结束应答,释放SDA。于是导致:主设备等到从设备释放SDA信号,从设备等待主设备拉低SCL信号以释放应答信号造成死锁。
(2)当主设备进行读操作时,I2C从设备应答后输出数据。如果此时主设备异常复位,而从设备正好输出数据0,也会导致I2C进入死锁状态
4.解决方法
- 尽量选用带复位输人的I2C从器件。
- 将所有的从I2C设备的电源连接在一起,通过MOS管连接到主电源,而MOS管的导通关断由I2C主设备来实现。
- 在I2C从设备设计看门狗的功能。
- 在I2C主设备中增加I2C总线恢复程序。每次I2C主设备复位后,如果检测到SDA数据线被拉低,则控制I2C中的SCL时钟线产生9个时钟脉冲(针对8位数据的情况),这样I2C从设备就可以完成被挂起的读操作,从死锁状态中恢复过来。这种方法有很大的局限性,因为大部分主设备的I2C模块由内置的硬件电路来实现,软件并不能够直接控制SCL信号模拟产生需要时钟脉冲。
- 在I2C总线上增加一个额外的总线恢复设备。这个设备监视I2C总线。当设备检测到SDA信号被拉低超过指定时间时,就在SCL总线上产生9个时钟脉冲,使I2C从设备完成读操作,从死锁状态上恢复出来。总线恢复设备需要有具有编程功能,一般可以用单片机或CPLD实现这一功能。
- 在I2C上串入一个具有死锁恢复的I2C缓冲器,当缓冲器检测到输出侧SDA或SCL信号被拉低30ms时,就自动断开I2C总线输人侧与输出 侧 的连接。并且在输出侧SCL信号上产生16个时钟脉冲来释放总线。
另外,对于有些不标准的I2C设备,只要总线上发送从机地址就会有响应。这样由于从机的错误响应,使得各个I2C总线异常,甚至钳住总线,导致 I2C 总线进人一种死锁状态。对于这样的不标准I2C设备,单独使用一个总线,避免干扰,或者单独一个独立引脚,控制电源。
对于I2C要求不高的设备最好用模拟I2C实现,控制灵活,则不会死锁!软件I2C驱动一般都有超时处理,即使遇到死锁也会释放总线的。硬件就不一样了,有些芯片死锁了不断电就不会恢复。
如果有读者遇到相似问题可以看这篇《STM32硬件I2C死锁原因及解决办法》
四、SPI
SPl(Serial Peripheral Interface–串行外设接口)总线系统是一种同步串行外设接口,它可以使处理器与各种外围设备以串行方式进行通信以交换信息。
- MOSI-主设备数据输出,从设备数据输入
- MISO -主设备数据输入,从设备数据输出
- SCLK -时钟信号,由主设备产生
- SS -从设备使能信号,由主设备控制,SS是控制芯片是否被选中,只有片选信号使能操作才有效。
注意:主设备MOSI连接到从设备的MOSI,主设备MISO连接到从设备的MISO,不要交叉接错了。
从图上可以知道,SPI 数据的传输过程其实是通过一个移位寄存器来完成的主机将自己的移位寄存器的数据移出,同时从机的移位寄存器数据移入,同时将自己的数据移出。
❤️ 入门看这篇SPI协议详解(图文并茂+超详细)
关于SPI(Serial Peripheral Interface)的设计,我们详细了解了它的信号线和功能。首先,SPI总线通常包括MOSI(Master Out Slave In)、MISO(Master In Slave Out)、SCK(Serial Clock)和CS(Chip Select)等信号线。其中,MOSI和MISO分别用于主设备(Master)和从设备(Slave)之间的数据传输,SCK是时钟信号线,而CS是用于选择从设备的片选信号线。
在SPI通信中,CS信号线起着关键的作用。通常,CS信号线会连接一个上拉电阻,以保持其默认状态为高电平,表示没有选中任何从设备。当主设备需要对某个从设备进行读写操作时,它会通过软件操作将对应的CS信号线拉低,以选中该从设备。这种通过软件控制CS信号线的方式非常灵活,允许主设备在多个从设备之间进行选择。
此外,SPI总线还可以分为单线、双线和四线等不同的设计方式。单线SPI是全双工的,即可以同时进行数据的发送和接收。而双线和四线SPI则是半双工的,需要通过软件配置将MISO和MOSI信号线分别用作数据的接收和发送。
在SPI总线的设计中,还需要注意时钟信号线SCK的设计。为了保证通信的稳定性和可靠性,通常会在SCK信号线上串联一个33欧姆的匹配电阻,以减小信号的反射和失真。
最后,关于写保护和设备暂停的功能,写保护(低电平有限)通常是将WP信号线上拉(因为大多数用不到写保护)。【写保护是以防止对Flash等存储设备进行未经授权的写入操作。】
而设备暂停功能则是通过HOLD信号线来实现的,当主设备需要暂停与从设备的通信以处理其他任务时,它可以将HOLD信号线拉低,使从设备进入暂停状态。当主设备完成其他任务并准备继续通信时,它可以将HOLD信号线拉高,使从设备恢复工作状态。
五、USB
基本信息
USB的英文全称为Universal Serial Bus, 通用串行总线,它是一种快速的,双向的,同步传输的,可以进行热拔插的串行接口。
速度快是USB技术的突出特点之一。
USB在PC机的多种外设上得到应用,包括扫描仪,数码相机,数码摄像机、音频系统、显示器、输入设备等。
USB接口
市面上常见接线种类:
USB接口的调试和线缆制作
2.0和3.0版本有明显差异。2.0版本线缆包括电源、D+和D-,D+和D-是双绞线,还有屏蔽网减少干扰。特殊应用时,使用小间距排针连接器(如1.25间距的排针连接器。尽管这种接口的间距很小,但由于其传输速率相对较低(480 Mbps),因此使用高温线直接连接也不会有问题)。
USB 3.0 需高速连接器,这是因为我们在实践中发现,许多通用连接器并不支持USB 3.0。以电脑主板为例,台式机电脑主板上通常有一个19针(实际上是20针,中间有两排,一排十个,但中间有一个孔没有针脚)的连接器用于连接USB 3.0接口。这种连接器是专用的,经过特殊处理,如镀金等,以确保低信号损耗和高速传输。
因此,当使用USB 3.0版本时,我们必须注意选择适当的连接器,确保其支持高速传输。同时,我们也可以考虑使用特殊定制的高速线缆和连接器来满足机内连接的需求。
在USB 3.0版本的线缆中,除了差分线外,还有一个额外的屏蔽接地线。这是为了提供更好的屏蔽效果,减少信号干扰。此外,USB 3.0版本的线缆通常采用多股线而非单股线,以提高传输性能和稳定性。
区分USB接口的高速和低速连接
了解如何从主机和从机设备之间区分USB接口的高速和低速连接,关键在于识别连接时的电平变化。在主机端,通常有一个下拉电阻,标准值为15kΩ,用于USB接口。当从机设备接入时,通过检测D-线上的电平变化来判断连接速度。
如果从机设备在D-线上有一个上拉电阻,将其拉到3.3V,当从机接入主机时,D-线上的电平会变为3.3V。由于存在下拉电阻和上拉电阻的分压作用,这个电平变化会被检测到。在连接初期,USB的电源并未给从机供电,此时D-线上的电平默认是低电平。当从机接入后,由于上拉电阻的作用,D-线上的电平开始上升,这段时间是连接协商的时间。
如果检测到D-线上为高电平,那么主机就会认为这是一个低速连接。相反,如果检测到D+线上为高电平,那么就是高速连接。这种检测方式通过上下拉电阻实现。
高速和全速的区分则是通过软件实现的。在硬件设计上,我们只区分低速、高速和全速。为了实现高速和全速的连接,我们需要在D+或D-线上上拉一个1.5kΩ的电阻。此外,差分线的阻抗需要设置为90Ω,这是协议的要求,在进行PCB设计时需要注意。
接口电路设计
从USB控制器出来的信号,首先经过了一个共模电感。共模电感在电路中起到了滤波的作用,它能够有效地滤除信号线上的高频噪声和电磁干扰,确保信号的纯净度和稳定性。在某些设计中,共模电感可以与零欧姆电阻二选一使用,这取决于具体的电路需求和性能要求。
接下来,信号通过两个下拉电阻(每个电阻的阻值为15kΩ)连接到USB连接器上。在信号连接到连接器的过程中,还加入了一些ESD(静电放电)防护器件。由于USB接口是支持热插拔的,这意味着在插拔过程中可能会产生静电放电现象。静电放电可能会对电路中的敏感器件造成损坏,因此我们需要加入ESD防护器件来吸收和泄放静电,从而保护电路的安全。
这些ESD防护器件通常被放置在靠近连接器的位置,这样在静电放电发生时,它们能够迅速地将静电泄放到地线上,避免对电路中的其他器件造成损害。
此外,在PCB布局时,我们也需要特别注意ESD防护器件的位置。为了确保静电能够有效地被泄放,我们通常会将ESD防护器件放置在靠近连接器的位置,这样可以最小化静电对电路的影响。
USB host 如何如识别低速和全速设备
在USB接口电路中,上拉电阻扮演着非常重要的角色。当我们连接一个USB设备到主机时,主机通过检测D+和D-线上的电平来判断该设备是高速、全速还是低速。具体来说,如果在上电或接入检测的过程中
如果D-
线为高电平而D+
线为低电平,那么设备被识别为低速设备;
如果D+
线为高电平而D-
线为低电平,那么设备则可能被识别为高速或全速设备。(高速和全速的区分是通过软件判断的)
为了确保准确的识别,通常在D+或D-线上会连接一个1.5kΩ的上拉电阻到3.3V电源。这个上拉电阻的作用是将对应的信号线拉高到一个确定的电平,从而确保在设备未连接或未上电时,主机能够正确地检测到设备的类型。
需要注意的是,并非所有USB设备都需要这个上拉电阻。有些USB控制器内部已经集成了上拉电阻,或者设计时就默认了上拉电阻的存在。在这种情况下,外部就不需要再添加额外的上拉电阻了。
共模电感
共模电感可以减小对其他信号的辐射以及减小共模噪声对USB高速信号的影响。选择应注意几点:
- 共模电感会影响到高速信号的质量,因此可以采取和0欧姆共lay的形式,如果采用0欧姆时EMI测试通过的话则可以不用。
- 应选择共模阻抗为80到90欧姆的共模扼流圈
在选择供膜电感时,我们通常考虑其阻抗值。USB 2.0协议的典型差分阻抗为90欧姆,因此,为了确保与协议的兼容性,我们通常选择阻抗为80至90欧姆的供膜电感,其中90欧姆是常见的选择。这样的选择有助于保持高速信号的质量完整性。
ESD保护
因为USB设备为热插拔设备,所以极易产生ESD对主板的电子元件造成损害。USB 2.0具有480Mbps的传输速率,所以USB信号对于线路上的寄生电容非常的敏感,就算是pF级可能也会造成USB信号失真导致USB设备不能工作。所以要选择电容最小的ESD保护器件。
下面是理想的ESD保护器件(TVS)的要求:
- 至少能够承受8KV的ESD
- 低电容。<2pf能够很好的减少对USB信号的干扰(一般可以2.0 1~0.1pF ; 3.0 - 0.05)
- 低漏电流,减小电源的损耗
- 反向关断电压为5V (一般选择5.5V、6V)
对于ESD器件,反向电压是一个关键参数。反向电压的选择直接关系到设备在工作过程中能够承受的最大电压。对于USB接口而言,其标准电源电压为5V。因此,在选择ESD器件的反向电压时,我们需要确保它能够覆盖这一标准电压,并有一定的裕量以应对可能的电压波动。
通常,我们会选择反向电压略高于实际工作电压的值。例如,对于5V的USB电源,常见的选择是5.5V或6V的反向电压。这样的选择能够确保在正常工作电压下,ESD器件能够正常工作,并在电压瞬间升高时提供一定的保护。然而,过高的反向电压选择可能没有太大的实际意义,因为过高的电压可能会导致设备损坏,而ESD器件的保护能力也有限。
USB走线
- D+、D-以差分方式布线,并通过连续的参考平面层,保证阻抗的一致性,信号线的差分阻抗Z=90Ω±15%;
- 常规USB接口规定电流为500mA,但是VBUS走线需能承受1A的电流(采用1盎司铜箔的情况下线宽为20mil),以防止过流事件发生;
- D+、D-的走线必须等长,长度误差不超过5mil;并且不能走直角,需要用钝角或者圆弧走线,同时尽量不换层布线,保证阻抗的连续性;应该尽可能的减少VIA,via会造成阻抗的不连续
- USB信号同其他CLK或者差分信号走线间隔应>20mil;
- ESD保护器件和共模电感应该尽可能地靠近接口;
- 避免在晶振、晶体、时钟信号发生器、功率电感、安装孔、磁性器件或IC的下方或附近进行USB数据信号线布线;
保险丝&电容
对于USB接口,标准的电源供应是500毫安,当两个接口同时工作时,总电流达到1安。为了确保系统的稳定性和安全性,我们在设计时常会预留一些额外的电流容量。同时,为了防止电流过大对电路造成损害,我们会使用自恢复保险丝来限制电流,这里选择的保险丝额定电流为1.5安,以满足两个USB接口的总电流需求。
考虑到USB设备是热插拔的,这意味着在设备插入或拔出的瞬间,负载电流可能会发生变化。为了确保电源能够稳定地响应这种变化,我们需要在电路中放置一个储能电容。这个电容的作用是在负载突然变大时,通过放电来减小电压的波动,从而保证电路的稳定运行。通常,我们会选择容量大于100微法的电容,以满足这一需求。
此外,在选择电容时,我们还需要考虑其电压降额。一般来说,对于普通电解电容或聚合物电容,我们会选择80%左右的降额。而对于坦电容,由于其耐压性能较差,通常不建议在USB电路中使用。相反,聚合物电容因其良好的电压特性而成为首选,其电压降额通常可以控制在较小的范围内,如打九折。
在USB电路设计中,还需要特别关注电容的容量和电压选择。由于USB电路需要的容量较大,而坦电容和铝电解电容的封装较大,可能不满足空间要求。因此,聚合物电容成为了一个理想的选择,其封装小、容量大且电压特性良好。在满足电路需求的同时,也确保了设计的可行性和稳定性。
超低结电容TVS二极管,0.5pF以下型号有哪些?
USB接口电路,TVS管该如何选型?
六、网口
网络的发送协议:
硬件电路的设计主要在数据链路层和物理层如下:
MAC芯片将数据帧发给PHY,PHY与变压器将数据帧转化为网络线上可以传输的电平形式将数据发到网络线上。
MAC属于数据链路层,PHY、变压器、RJ45属于物理层。
以太网MAC和PHY之间接口,常用的有MII、RMII、GMII、RGMII 等。
- MII(Medium Independent Interface,媒体独立接口):MII 支持 10Mbps和100Mbps的操作,数据位宽为4位,在100Mbps传输速率下,时钟频率为25Mhz。
“媒体独立”表明在不对MAC硬件重新设计或替换的情况下,任何类型的PHY设备都可以正常工作。MII接口一共有16根线。
- RMII(Reduced MII):RMII是MII的简化版,数据位宽为2位,在100Mbps传输速率下,时钟频率为 50Mhz。
- GMII(Gigabit MII):GMII接口向下兼容 MII接口,支持10Mbps、100Mbps和1000Mbps的操作,数据位宽为8位,在1000Mbps传输速率下,时钟频率为125Mhz。
- RGMII(Reduced GMII):RGMII是GMII的简化版,数据位宽为4位,在1000Mbps传输速率下,时钟频率为125Mhz,在时钟的上下沿同时采样数据。在100Mbps和10Mbps通信速率下,为单个时钟沿采样。在千兆以太网中,常用的接口为RGMII和GMII接口。RGMII接口的优势是同时适用于10M/100M/1000Mbps通信速率,同时占用的引脚数较少。
PHY的作用:
- 物理层接口收发器ADC/DAC电路
- 互相协商并确定连接速度、双工模式、是否采用流控等。
PHY,即物理层接收器,实际上是一个ADC(模数转换器)和DAC(数模转换器)的电路组合。从CPU传来的信号,经过PHY的处理,将数字信号转换为模拟信号,再通过网络发送出去。这个过程中,PHY负责将CPU发出的TX(发送)信号转换为适合网络传输的形式,并接收来自网络的RX(接收)信号,将其转换为CPU能够处理的数字信号。
PHY通过10B编码技术,将信号编码为适合网络传输的格式,然后通过滤波器进行处理,最后通过DAC转换为模拟信号。这个模拟信号再通过MDI(介质无关接口)发送到网络上,经过变压器后连接到网线。
反过来,当PHY接收来自网络的信号时,它会通过ADC将模拟信号转换回数字信号,然后进行解码处理,最终将信号传递给CPU。
PHY不仅是一个高速的ADC和DAC电路,还具备自协商功能。它通过与对端的PHY进行协商,确定双方的工作模式,如10M、百兆、千兆速率,以及单工、双工等连接方式,还包括是否采用流控等参数。这种协商过程确保了双方能够正确地建立连接并进行数据传输。
PHY的上级是FI(前端接口),它负责处理与对端设备之间的通信协议。FI通过MDIO(管理数据输入输出)和MDC(管理数据时钟)与PHY进行通信,控制其工作状态,并确保数据传输的正确性和稳定性。
总之,PHY作为网络接口的重要组成部分,负责实现数字信号与模拟信号之间的转换,以及与网络对端的通信协商,确保数据能够正确地传输和接收。
网络变压器的作用:
- 滤除共模干扰,增强信号,传输更远;
- 隔离PHY端和RJ45端直流;外部干扰;
- 设备间为不同电平时,耦合交流信号,电平与PHY端一致,可保护
PHY芯片
RJ45水晶头又称为RJ45插头,是网络连接中重要的接口设备,是一种能沿固定方向插入并自动防止脱落的塑料接头,用于数据电缆的端接,实现设备、配线架模块间的连接。
网口定义:
差分对组别是12、36、45、78,定义功能时要按照组别来定义
电路设计 66.18.13
以太网接口指示灯状态分析和电路设计
PCB布局要点:
- RJ45和变压器之间的距离尽可能的短;
- 芯片每个电源管脚放置一个0.1uf小电容,每个电压应该最少有一个4.7uf的大电容
- 电源信号的走线应该短而宽。退耦电容上的过孔直径最好稍大一点。
- 变压器的两边最好是割地:如果不能,需要在变压器肚子的正下方所有层挖空,不能有任何走线。分割处理,就是为了达到初、次级的隔离;
- 接口接地隔离,我们用磁珠或者电容后,再接地。
- 差分对(Rx±、Tx±) 一般对内做5mil等长。四对差分线,组间为20mil。阻抗为100Ω
- RGMII接口线的TXD和RXD同组同层。TX要与RX之间的距离最好在4W以上,最好是不在同一个层走线。
参考文章:
江科大STM32学习笔记(下)
关于RS232通信电路设计讲解
超详细的RS232/RS485电路设计