同步通信—时钟线 例如:spi iic
异步通信—波特率 例如:uart(rs485,rs232) can
usb----USB中用NRZI来编码数据
CAN总线使用异步串行通讯,相比同步串行通讯,CAN总线省去了一根用于同步的时钟线(CLK)。有优点,多半会带来一些缺点,缺点就是同步问题。
根据波特率做采样,波特率的误差会产生通信错误。为什么?CAN总线上的各个CAN节点的波特率来源于各个节点上的晶振(例如,STM32上的CAN控制器上的时钟频率就是从PCB上的晶振进行倍频后再分频得到)。晶振会有误差,外加上其他误差。说白了,各个节点的波特率都设置500K。但是,由于误差问题肯定不会完全等于500K。
首先,USB 的数据是串行发送的,就像 UART、I2C、SPI 等等,连续的01 信号只通过一根数据线发送给接受者。
但是因为发送者和接收者运行的频率不一样,信号的同步就是个问题,比如,接受者接收到了一个持续一段时间的低电平,无法得知这究竟是代表了5个0 还是1000个0。
一个解决办法,就是在传输数据信号的同时,附加一个时钟信号,用来同步两端的传输,接受者在时钟信号的辅助下对数据信号采样,就可以正确解析出发送的数据了,比如 I2C 就是这样做的,SDA 来传输数据,SCL 来传输同步时钟:
虽然这样解决了问题,但是却需要附加一根时钟信号线来传输时钟。有没有不需要附加的时钟信号,也能保持两端的同步呢?
有的,这就是 RZ 编码(Return-to-zero Code),也叫做归零编码。
在 RZ 编码中,正电平代表逻辑 1,负电平代表逻辑 0,并且,每传输完一位数据,信号返回到零电平,也就是说,信号线上会出现 3 种电平:正电平、负电平、零电平: