当DIR=0时,接收电路使能,发送电路禁止DE=0,对总线而言相当于高阻;当 DIR=1 时,接收电路使能 ,发送电路禁止DE=1,对总线A/B信号取决于DI的信号。这里有两个问题:1.为什么芯片要把和设计成相反的有效逻辑呢?这样其实也是方便用一个GPIO同时控制收发电路的考虑。2.那收发器芯片收发使能为什么不做成一个脚呢?比如就叫DIR?做成两个脚收/发也可以用两个脚单独控制,比如:甚至可以在DE=1的时候,将设置为0,这样是不是就可以自环了?产品中也可以就这样设计,可以实现收发器以及布线的自诊断,通过接收到的报文与发送出去的报文比较,可以诊断出芯片焊接,收发器是否损坏或者断路,以及布线是否存在短路故障。或许你会说,瞎扯!你前面才说RS-485不能同时收发,这里又说能同时收发,岂不是自相矛盾吗?不矛盾,前面所说的不能同时收发,是指发的同时不能收来自其他设备的发送报文,这里收的是自身发出的报文。所以半双工的本质,是通讯介质不存在双向通道,在向总线发送数据的时候,介质被占用,即便想发送也是无法正确的将信号发送到介质上的,如果强行发送,数据将会错乱,甚至收发器芯片有可能损坏。: Receiver Output Enable,接收器使能,DE:Driver Output Enable,驱动输出使能图中的DIR脚就是控制当前RS-485是处于“收”还是处于“发”模式。
前面说到共模电压指标以及差模传输方式,这里来实际抓抓波形看看:示波器的CH2接485输出A端,CH3接485输出A端,红色的为示波器的MATH功能:CH2-CH3。大部分示波器都具有数学运算功能。
如果想看差分信号,就可以利用双通道示波器加MATH减功能观测。或许有的示波器没有MATH功能,那么这里还可以使用一个技巧:将B通道,或者说差分信号的负端反相,然后将B通道上移至空闲电平重合,这样是不是也就比较直观的可以看出A-B了?通过这个图,能发现哪些有价值的信号特征呢?
那么数据怎么去解读呢?
这里抓的数据是一个MODBUS-RTU主端发送给从设备的报文,其内容前面两个字节是0x01 0x03,UART模式为1个起始位,8个数据位,1个停止位,无校验位,低位在前,此例中UART的通讯格式为先根据UART通讯模式,来计算一下几个参数,每bit占用时间,每字节占用时间:
这个图就是起始位,宽度正好是104us。
对于解析这种异步串行时序波形而言,最重要就是根据通信格式计算位时间,字节时间,进而可以直接解析波形数据。从这一点思考,假设要利用FPGA来实现一个UART协议逻辑分析仪,这就是最为核心的指标,通过检测到起始位边沿,进而通过时间轴将数据解析出来。这里我来充当一个肉眼UART逻辑分析仪吧:8bit数据的时间宽度刚好是832us,由于格式是低位在前,所以要反过来看,与实际发送的数据0x01 0x03是吻合的。这里在调试底层的时候遇到问题,就可以通过这种方式可以检查软件是否正确的驱动了硬件,譬如在调试I2C/SPI等等其他底层接口的时候,都可以类似的去检查硬件波形,唯一不一样的是,I2C/SPI属于同步通信,所谓同步通信,是指其通信底层有同步时钟信号,I2C的SCL,SPI的SCK都属于同步时钟。