UART(Universal Asynchronous Receiver/Transmitter)是一种异步、全双工的串行通信接口,常用于微控制器与计算机、其他微控制器或外部设备之间的数据交换,下图是UART通信所需的信号线,其中Tx用于发送数据,Rx用于接受数据。

串行通信和并行通信:
- 串行通信:数据逐位(bit-by-bit)依次通过单一通信线路传输。例如:UART、SPI、$$I^2C$$ 等协议均采用串行方式。
 - 并行通信:多个数据位(如8位)同时通过多条并行的物理线路传输。例如:51单片机通过P0端口连接外部存储器时,使用8根数据线并行传输数据。
 
单工通讯和双工通信:
- **单工通信:**只允许数据在一个方向上传输,即数据只能从发送端传输到接收端,接收端无法向发送端传输数据。简单来说,就是一种“单向”通信模式,可以类比电视广播。
 - 双工通信:允许数据在两个方向上传输,其下又分为两种类型:半双工和全双工。
 - **半双工通信:**允许数据在两个方向上传输,但不能同时进行。在任何时刻,数据只能在一个方向上传输。这意味着通信的两端可以轮流发送和接收数据,但不能同时进行。可以类比对讲机。
 - **全双工通信:**允许数据同时在两个方向上传输。这种通信方式最为高效,因为它允许通信双方同时发送和接收数据,可以类比电话。
 
同步通讯和异步通讯:
- 同步通讯:
- 通信双方使用同一个时钟信号来同步数据的发送和接收。
 - 发送方和接收方必须在时钟信号的驱动下严格同步,确保数据在正确的时刻被采样。
 
 - 异步通讯:
- 通信双方没有共享的时钟信号,而是通过起始位和停止位来同步数据传输。
 - 发送方和接收方使用各自的时钟(波特率)进行通信,但需要预先约定相同的波特率。
 
 
UART通信协议:
数据格式:
在UART通信中,数据是逐帧(Frame)发送的,每个数据帧通常包括起始位、数据位、校验位(可选)和停止位,具体结构如下图所示。

空闲状态
- 协议规定,在空闲状态下,也就是没有数据传输时,应为高电平。
 
起始位
- 起始位表示一个数据帧的开始,起始位为低电平(区别于空闲状态)。
 
数据位
- 传输的主体内容,位于起始位之后,长度可以是5到9位,一般都是8位。低电平表示0,高电平表示1。
 
校验位(可选)
- 用于校验当前帧的正确性,校验算法可以是奇校验或偶校验。
 - 奇校验(odd parity):如果数据位中1的数目是偶数,则校验位为1,如果1的数目是奇数,校验位为0,目的是保证数据位+校验位中的1的总个数是奇数。
 - 偶校验(even parity):如果数据位中1的数目是偶数,则校验位为0,如果1的数目为奇数,校验位为1,目的是保证数据位+校验位中的1的个数是偶数。
 
停止位
- 停止位表示数据帧的结束,通常为1位或2位,停止位为高电平。
 
发送方和接收方的约定:
- 波特率
- 波特率(Baud Rate)用于表示数据的传输速率,发送方和接收方必须约定好传输速率,才能保证数据被正确的发送和接收。
 - 需要注意波特率(Baud Rate)和比特率(Bit Rate)的区别,比特率表示每秒传输的位(bit)数,而波特率表示每秒传输的符号(symbol)数。但是串口通信中,只有0和1这两个符号,因此1个符号用1位就能表示,所以此处的波特率和比特率是等价的。
 - 解释:二进制符号只有0和1,所以符号和位数一样,四进制中符号有0、1、2、3,但是符号0转化为位数是00,符号1转化为位数是01,符号2转化为位数是10,符号3转化为位数是11,所以说比特率=波特率×log2(M)M 是调制方式中每个符号可以表示的比特数,也可以理解成是进制数,如果是四进制,M就等于4
 
 - 数据位
- 发送方和接收方需要明确数据位的位数。
 
 - 校验位
- 发送方和接收方需要明确是否有校验位,如果有,需要明确校验算法是哪个。
 
 - 停止位
- 发送方和接收方需要明确停止位的位数。
 
 
- 波特率
 
配置串口通信:
- 选择串口工作模式
 - 设置波特率
- SMOD 控制位
 - 定时器配置
- 定时器工作模式
 - 定时器初始值
 - 启动定时器
 
 
 - 串口接收相关配置
 - 启动串口中断
 
定时器:
- 工作原理:是使用一个 n 位的脉冲计数器,对时钟信号的脉冲进行计数,每个脉冲加 1 ,当脉冲计数器达到最大值 $$2^n$$ 时,也就是溢出时,触发定时器中断,然后会执行对应的中断服务程序。
 - 影响定时的时间的因素:
- 脉冲计数器的位数
 - 脉冲计数的初始值
 - 时钟信号的频率
 
 - 定时器使用说明:
- 启用定时器中断
 - 选择定时器工作模式
 - 设置脉冲计数器初始值
 - 启动定时器
 - 定义中断服务程序
 
 
IIC协议介绍:
IIC(Inter-Integrated Circuit),通常简称为IIC,是一种用在集成电路(IC)之间的串行通信总线。
IIC为同步串行通信,使用两根线路进行通信,分别是数据线(SDA)和时钟线(SCL),SDA线用于数据传输,SCL线用于数据传输的同步。SCL的每个时钟周期,SDA传输一位数据。
IIC规定:数据的接收方会在每个时钟周期的高电平期间读取数据,具体来讲就是在SCL处于高电平时,读取SDA上的数据。

- 因此,SDA必须在SCL低电平期准备好要发送的下一位数据,然后在SCL高电平期间保持稳定。
 
IIC主从架构:
IIC采用主从架构,一个主设备可连接多个从设备。主设备负责发起通信和控制总线,而从设备负责响应主设备的请求。如下图所示。

IIC总线中的每个从设备都有一个唯一的地址(用7位二进制数字表示),用于在总线上标识自己。主设备可以根据地址选择性的与特定的从设备进行通信。
需要注意的是,SCL信号线上的时钟信号始终由主设备产生,而SDA信号线上的数据信号既可由主设备产生,也可由从设备产生。当主设备向从设备发送数据时,SDA信号由主设备产生,从设备接收信号;当主设备从从设备读取数据时,SDA信号由从设备产生,主设备接收信号
IIC通讯协议:
空闲状态:
- IIC协议规定,当SDA和SCL均为高电平时,总线为空闲状态。
 
起始和结束信号:
主设备和从设备间的每次通信,都需要以一个起始信号开始,以一个结束信号终止。起始信号和结束信号的定义如下:
起始信号:当SCL处于高电平时,SDA由高变低。
停止信号:当SCL处于高电平时,SDA由低变高。

注意:起始信号和结束信号,都只能由主设备产生。
确认信号:
IIC协议规定:发送方每发送一个字节(8位)的数据,接收方都要向发送方回复一个1位的确认信号。

- 如果该确认信号为 0 表示接收方已成功接收到该字节,发送方可继续发送下一字节,这个信号在IIC协议中称为
ACK(Acknowledge);如果该信号为 1 ,则表示接收方未能成功接收到该字节,或者不希望接收更多数据,该信号在$$I^2C$$协议中称为NACK(Not Acknowledge)。 
- 如果该确认信号为 0 表示接收方已成功接收到该字节,发送方可继续发送下一字节,这个信号在IIC协议中称为
 
从机地址和读写标识:
由于一个$$I^2C$$总线上可能有多个从设备,所以开始通信前,主设备需要先与目标设备取得联系,然后再进行数据传输,除此之外,主机还需要向目标设备明确本次通信的操作是写数据还是读数据。(是以主机为角度)
上述操作的实现思路如下:
当主设备发送起始信号之后,会向所有设备发送一个字节的数据,这一个字节中,前7位为目标设备地址,第8位为读/写标识(1表示读,0表示写),如下图所示:

当各从设备收到这个字节的数据后,会将7位地址与自身进行对比,相同则会向主设备回复确认信号,不相同则不做任何回应。
当主设备收到目标设备的确认信号后,便会开始与该设备进行通信。
完整通信流程:
- 发送起始信号
 - 发送目标从设备地址+读写标识位
 - 接收从设备回复的确认信号
 - 与从设备进行数据传输(发送/接收)
 - 发送终止信号
 

IIC协议–EEPROM:
- 概述:EEPROM(Electrically Erasable Programmable Read-Only Memory,可擦写可编程只读存储器)是一种非易失性存储器(断电后仍能保留数据),可以多次写入和擦除数据。
 
IIC协议–OLED模块:
- OLED(Organic Light-Emitting Diode,有机发光二极管)显示屏由许多微小的发光二极管构成,每个发光二极管就对应着屏幕上的一个像素,通过控制二极管的亮灭就能在屏幕上显示图像或文字。
 - 按照驱动方式划分,OLED显示屏分可分为两类,分别是PMOLED(Passive Matrix,被动矩阵)和AMOLED(Active Matrix,主动矩阵)。
 - PMOLED的驱动方式和前文的LED点阵类似,每次只能点亮一行或者一列,需要快速的逐行或者逐列扫描来显示内容。(动态扫描)
 - AMOLED屏幕上的每个像素点都有一个单独的控制电路,可以独立进行控制。