首先先了解通信的三种基本类型:
单工通信:只允许一方向另一方传送信息,而另一方不能回传信息。
半双工通信:数据可以在双方之间相互传播,但是同一时刻只能其中一方发给另外一方。
全双工通信:发送数据的同时也能接收数据,两者同步进行,互不干扰。
UART、I2C和SPI是单片机系统中最常用的三种串行通信协议,实际应用中一般采用中断方式发送和接收,避免程序堵塞
一、UART
UART(Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常用的一种通信技术,通常用于单片机和计算机之间以及单片机和单片机之间的通信。
UART有发送和接收 2条 数据线,互不干扰,属于全双工通信方式,不同的MCU驱动方式也不相同,实际应用中一般会自定义收发数据格式,增加校验方法,避免数据出错,比如校验和和CRC校验。双方通信时需要设置相同波特率 ,调试碰到问题时首先检查两边实际波特率是否相同。
常见连接方式如下:
通信数据格式如下图
起始位:发送一位逻辑电平0开始传输数据
空闲位:当为高电平时,无数据传输
数据位:先发低位再发高位,传输8位数据
校验位:奇偶校验,1的位数为偶数(偶校验),1的位数为奇数(奇校验)
停止位:发送逻辑电平1停止数据传输
二、SPI
SPI(Serial Peripheral Interface串行外围设备接口):是一种高速的、全双工、同步通信总线。(如MCU与EEPROM、FLASH、实时时钟、数字信号处理器之间的通信)
SPI主从模式有一点需要注意,SPI从机是没有时钟的,从机发送数据时,需要主机发送数据提供时钟信号。
SPI有4根线:
SSEL(SCS):片选,从设备片选使能信号(一主机多从机情况);
SCLK(SCK):时钟,由主机产生,类似I2C的SCL;
MOSI(Master Output/Slave Input):主机输出从机输入,主机给从机发送指令或者数据的通道;
MISO(Master Input/Slave Output):主机输入从机输出,主机读取从机的状态或者数据的通道。
4种SPI模式:
CPOL(Clock Polarity):时钟的极性。
CPOL = 1: SCK空闲状态为高电平;
CPOL = 0: SCK空闲状态为低电平;
CPHA(Clock Phase):时钟的相位。
CPHA = 1: 数据的输出是在一个时钟周期的第一个沿;(采样自然在第二个沿)
CPHA = 0: 数据的采样是在一个时钟周期的第一个沿;(输出自然在第二个沿)
当MCU作为SPI主机时通信格式如下图:
作为SPI从机时:
三、I2C
I2C(Inter-Integrated circuit)总线是由PHILIPS公司开发的两线式串行总线,多用于连接微处理器及其外围设备(特别是外部存储器件)。I2C总线的主要特点是接口方式简单,两条线可以挂多个参与通信的器件,即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能有一个主机。UART通信多用于板间通信,比如单片机和计算机,这个设备和另外一个设备之间的通信。而I2C多用于板内通信,比如单片机和E2PROM。
在硬件上,I2C总线是由时钟总线SCL和数据总线SDA两条线构成,连接到总线上的所有器件的SCL都连到一起,所有SDA都连到一起。
I2C通信的起始信号后,首先要发送一个从机的地址,这个地址一共有7位,紧跟着的第8位是数据方向位(R/W),“0”表示接下来要发送数据(写),“1”表示接下来是请求数据(读)。需要注意的是,起始信号与停止信号都是由主机产生的。
1.起始信号:I2C通信的起始信号的定义是SCL为高电平期间,SDA由高电平向低电平变化产生一个下降沿,表示起始信号。
2.数据传输:I2C通信是高位在前,低位在后。I2C通信没有固定波特率,但要求当SCL在低电平的时候,SDA允许变化,也就是说,发送方必须先保持SCL是低电平,才可以改变数据线SDA,输出要发送的当前数据的一位;而当SCL在高电平的时候,SDA绝对不可以变化,因为这个时候,接收方要来读取当前SDA的电平信号是0还是1,因此要保证SDA稳定。
3.停止信号:I2C通信停止信号是SCL为高电平期间,SDA由低电平向高电平变化产生一个上升沿,表示结束信号。
通信数据格式如下图:
1.主机发送:
2.主机接收:
3.从机发送:
4.从机接收:
如有问题,感谢指正!
————————————————
版权声明:本文为CSDN博主「又来学习了呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yiyiyuanyuanyiyi/article/details/132337238
|