根据基本类型,通信可分为平行通信和串行通信。如果将信号比作驾驶车辆,平行通信是多车道,可以同时通过多辆车,串行通信信号相当于单车道,一次只能通过一辆车,如果你想发送字节(byte)信号,需要按顺序逐一发送,共发送8次才能完成信息传输。
UART、I2C和SPI是单片机系统中最常用的三种串行通信协议。
UART(Universal Asynchronous Receiver/Tran ** itter,也就是通用异步收发器)串行通信是单片机最常用的通信技术,通常用于单片机和计算机之间以及单片机和单片机之间的通信。
在下图中,GND是单片机系统电源的参考地,TXD是串行发送引脚,RXD是串行接收引脚。两台单片机之间应进行通信。首先,电源基准相同,因此应将两台单片机的GND连接起来,然后将单片机1的TXD引脚连接到单片机2的RXD引脚上,即单片机1发送的通道和单片机2接收的通道,单片机1的RXD引脚连接到单片机2的TXD引脚上,即单片机2发送的通道和单片机1接收的通道。
当单片机1想向单片机2发送数据时,例如发送0xa3数据,以二进制的形式表示0b。在UART通信过程中,是低先发和高后发的原则。让TXD先提高电平,持续一段时间,发送一个1,然后继续提高,再持续一段时间,再发送一个1,然后降低电平,持续一段时间,发送一个0。。。。。。一直发送8位二进制数字0b。
这里有一个概念,就是持续多久。事实上,所谓的持续时间是我们通常所说的波特率(也称为比特率)。波特率是发送二进制数据位的速率,通常用baud表示,即发送二进制数据的持续时间=1/baud。通信前,单片机之间必须约定通信波特率,必须保持一致,收发双方才能实现正常通信。
此外,通信的开始和结束也存在一个问题。UART通信时,一个字节为8位,规定当没有通信信号时,通信线路保持高电平。在发送数据之前,发送一个0来表示开始位置,然后发送8个数据位置。数据位是先低后高的顺序,然后发送一个1来表示停止位置。本来要发一个字节的8位数据,其实一共发了10位,多出来的两位其中一位表示起始位,一位表示停止位。至于接收方,一旦检测到低电平,就知道要开始准备接收数据。接收到8位数据位后,检测到停止位,然后准备接收下一个数据,如下图所示。
I2C(Inter-Integrated circuit)PHILIPS公司开发的两线串行总线主要用于连接微处理器及其外围设备(特别是外部存储设备)。I2C总线的主要特点是接口方式简单。两条线可以悬挂多个参与通信的设备,即多机模式,任何设备都可以用作主机。当然,同时只能有一个主机。UART通信主要用于板间通信,如单片机和计算机,该设备与另一个设备之间的通信。而I2C主要用于板内通信,如单片机和E2PROM。
在硬件方面,I2C总线由时钟总线SCL和数据总线SDA组成。连接到总线的所有设备的SCL都连接在一起,所有SDA都连接在一起。
起始信号:I2C通信的起始信号定义为SCL为高电平时,SDA从高电平向低电平变化产生下降边缘,表示起始信号。数据传输:I2C通信高位在前,低位在后。I2C通信没有固定的波特率,但要求当SCL处于低电平时,SDA允许更改,即发送者必须保持SCL处于低电平,才能更改数据线SDA,输出当前数据;当SCL处于高电平时,SDA不能更改,因为接收器必须读取当前SDA的电平信号是0还是1,以确保SDA的稳定性。停止信号:I2C通信停止信号是SCL为高电平时,SDA由低电平向高电平变化产生的上升边缘,表示结束信号。I2C通信搜索模式:
I2C通信启动信号后,首先要发送一个从机地址,共有7个地址,其次是数据方向位(R/W),“0”表示下一步要发送数据(写),“1”表示下一步要求数据(读)。
通信的三种基本类型:
单工通信:只允许一方向另一方传输信息,而另一方不能返回信息。例如电视遥控器、收音机广播等都是单一的通信技术。半双工通信:数据可以在双方之间传播,但只有一方可以在同一时间发送给另一方。例如,对讲机是典型的半双工。全双工通讯:在发送数据的同时也可以接收数据,两者同步进行,就像电话一样,说话的同时也能听到对方的声音。SPI(Serial Peripheral Inte ** ce外围设备接口串行):是一条高速、全双工、同步通信总线。(如MCU和EEPROM、FLASH、实时时钟与数字信号处理器之间的通信)
4根线:
SSEL(SCS):选片,从设备片中选择使能信号(一主机多从机情况);
SCLK(SCK):时钟由主机生成,类似I2C的SCL;
MOSI(Master Output/Slave Input):主机输出从机输入,主机向从机发送指令或数据的通道;
MISO(Master Input/Slave Output):主机输入从机输出,主机读取从机状态或数据通道。
四种SPI模式:
CPOL(Clock Polarity):时钟的极性。
CPOL = 1: SCK空闲状态为高电平;CPOL = 0: SCK空闲状态为低电平;CPHA(Clock Phase):时钟相位。
CPHA = 1: 数据输出是一个时钟周期的第一个边缘;(采样自然在第二个边缘)CPHA = 0: 数据采样是一个时钟周期的第一个边缘;(输出自然在第二个边缘)