通信方式分为串行通信和并行通信。串行通信用一根数据线就可以完成信息的传输,而并行通信需要8根数据线(一个字节8位数据,同时发送8位数据),由于并行数据线无法携带时钟信息,为了保证信号时序一致,需要额外的时钟信号线。并行通信速度快,但线成本也更高,抗干扰能力差,通信距离有限。串行通信外设简单,成本低并且传输距离更远。
一,串行通信
串行通信有Sbus,PPM,JTAG,UART,I2C,CAN,SPI,MIDI,USB,RS232,Morse Code
根据使用时钟不同可以把串行通信方式分为同步通信和异步通信
1,同步通信
典型代表:I2C,SPI。同步通信需要使用频率一致的时钟,接收方需要时刻准备好接收数据,此通信方式只需要辅助bit串作为启停标识。传输效率高,也可以一对多进行通信
同步通信也是总线通讯,是为了解决多个设备间通讯使用串口通信而线路复杂的问题。
I2C通信
I2C通信一般采用一主多从模式,如下图。
I2C采用时钟线(SCL)和数据线(SDA),一帧数据是由两根线共同作用的,也就是在同一时间它要么就是在发送信息,要么就是在读取信息,所以说I2C属于半双工通信,即通信双方可以互相传输数据,但必须分时复用一根数据线
以下图所示写帧来看I2C工作原理
当处于空闲状态时,时钟线SCL和数据线SDA都为高电平,如下图
起始位,也就是起始信号。此时必须时钟信号为高电平期间,数据信号位下降沿。
起始信号结束,接下来的7为数据位设备地址码,确定要与哪一位设备进行通讯
下图所示时钟线为高电平数据线为低电平为数据0,时钟线和数据线均为高电平则为数据1
比如一下数据所示
接下来的一位位读/写数据位。想要写数据则置为0,想要读数据则置为1.再下一位为应答信号,这个信号是从机发送给主机的,如果从机收到了之前的信息他会回复0,如果没收到或者(主机)读取接收完成会回复1
再下面8位为设备寄存器的地址 ,比如这八位为0x01,则会在设备地址0x01的寄存器中写数据,然后单片机需要设备返回一个应答信号,接下来8位是要给这个寄存器写入的数据,发送完数据后,需要再给主机发送应答信号0,告诉主机写入成功,最后再写入停止位
停止位和起始位相反
这样一个写数据帧就完成了,那怎么读数据那?读数据和写数据其实差不多 ,以下是一个标准的读数据帧
首先写入设备地址,然后写数据,接下来是寄存器地址,在收到从机应答后,主机需要再发送一个起始信号,然后需要再发送一遍设备的地址,然后才能发送读数据,接下来存储器就会把寄存器的数据发送给单片机。
2,异步通信
典型代表:UART。异步通信的双方使用各自的时钟,接收方是通过识别数据包中的起始位和结束位来实现信息同步,数据效率低,只能一对一进行通信。异步通信也是串口通信
UART
UART只需要三根线,发送数据线TX,接收数据线RX,参考线GND。在通信之前双方要知道通信的波特率,数据长度,开始位和停止位。UART是全双工的通信模式,也就是可以同时发送和接收数据。与I2C不同的是UART不需要时钟线
比如说要发送198这个数据,转换为二进制为11000110。将此数据(要发送的数据)加载到数据位中,如下图
进行通信时我们还需要一个 起始位和结束位。我们通常用高信号表示通信截至,当接收器检测到信号从高到低就表示开始通信,如下图。然后就开始读取数据,我们还需要配置一个波特率参数,常用波特率位9600波特/s,也就是每秒发送9600个码元,1/9600=104us,也就是每104us读取一位数据。但开始读取数据时,通常延后52us再开始读取数据,这是因为刚开始的数据可能不稳定,之后接收器要做的就是每104微秒采集一次数据