51单片机 - UART和IIC协议

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

串口通信

串行通信和并行通信:

  • 串行通信:数据逐位(bit-by-bit)依次通过单一通信线路传输。例如:UART、SPI、$$I^2C$$ 等协议均采用串行方式。
  • 并行通信:多个数据位(如8位)同时通过多条并行的物理线路传输。例如:51单片机通过P0端口连接外部存储器时,使用8根数据线并行传输数据。

单工通讯和双工通信:

  • **单工通信:**只允许数据在一个方向上传输,即数据只能从发送端传输到接收端,接收端无法向发送端传输数据。简单来说,就是一种“单向”通信模式,可以类比电视广播。
  • 双工通信:允许数据在两个方向上传输,其下又分为两种类型:半双工全双工
  • **半双工通信:**允许数据在两个方向上传输,但不能同时进行。在任何时刻,数据只能在一个方向上传输。这意味着通信的两端可以轮流发送和接收数据,但不能同时进行。可以类比对讲机。
  • **全双工通信:**允许数据同时在两个方向上传输。这种通信方式最为高效,因为它允许通信双方同时发送和接收数据,可以类比电话。

同步通讯和异步通讯:

  1. 同步通讯:
    1. 通信双方使用同一个时钟信号来同步数据的发送和接收。
    2. 发送方和接收方必须在时钟信号的驱动下严格同步,确保数据在正确的时刻被采样。
  2. 异步通讯:
    1. 通信双方没有共享的时钟信号,而是通过起始位停止位来同步数据传输。
    2. 发送方和接收方使用各自的时钟(波特率)进行通信,但需要预先约定相同的波特率。

UART通信协议:

  1. 数据格式:

    1. 在UART通信中,数据是逐帧(Frame)发送的,每个数据帧通常包括起始位、数据位、校验位(可选)和停止位,具体结构如下图所示。

      串口通信协议

    2. 空闲状态

      • 协议规定,在空闲状态下,也就是没有数据传输时,应为高电平。
    3. 起始位

      • 起始位表示一个数据帧的开始,起始位为低电平(区别于空闲状态)。
    4. 数据位

      • 传输的主体内容,位于起始位之后,长度可以是5到9位,一般都是8位。低电平表示0,高电平表示1。
    5. 校验位(可选)

      • 用于校验当前帧的正确性,校验算法可以是奇校验或偶校验。
      • 奇校验(odd parity:如果数据位中1的数目是偶数,则校验位为1,如果1的数目是奇数,校验位为0,目的是保证数据位+校验位中的1的总个数是奇数。
      • 偶校验(even parity:如果数据位中1的数目是偶数,则校验位为0,如果1的数目为奇数,校验位为1,目的是保证数据位+校验位中的1的个数是偶数。
    6. 停止位

      • 停止位表示数据帧的结束,通常为1位或2位,停止位为高电平。
  2. 发送方和接收方的约定:

    1. 波特率
      1. 波特率(Baud Rate)用于表示数据的传输速率,发送方和接收方必须约定好传输速率,才能保证数据被正确的发送和接收。
      2. 需要注意波特率(Baud Rate)和比特率(Bit Rate)的区别,比特率表示每秒传输的位(bit)数,而波特率表示每秒传输的符号(symbol)数。但是串口通信中,只有0和1这两个符号,因此1个符号用1位就能表示,所以此处的波特率和比特率是等价的。
      3. 解释:二进制符号只有0和1,所以符号和位数一样,四进制中符号有0、1、2、3,但是符号0转化为位数是00,符号1转化为位数是01,符号2转化为位数是10,符号3转化为位数是11,所以说比特率=波特率×log2(M)M 是调制方式中每个符号可以表示的比特数,也可以理解成是进制数,如果是四进制,M就等于4
    2. 数据位
      1. 发送方和接收方需要明确数据位的位数。
    3. 校验位
      1. 发送方和接收方需要明确是否有校验位,如果有,需要明确校验算法是哪个。
    4. 停止位
      1. 发送方和接收方需要明确停止位的位数。

配置串口通信:

  1. 选择串口工作模式
  2. 设置波特率
    1. SMOD 控制位
    2. 定时器配置
      1. 定时器工作模式
      2. 定时器初始值
      3. 启动定时器
  3. 串口接收相关配置
  4. 启动串口中断

定时器:

  1. 工作原理:是使用一个 n 位的脉冲计数器,对时钟信号的脉冲进行计数,每个脉冲加 1 ,当脉冲计数器达到最大值 $$2^n$$ 时,也就是溢出时,触发定时器中断,然后会执行对应的中断服务程序。
  2. 影响定时的时间的因素:
    1. 脉冲计数器的位数
    2. 脉冲计数的初始值
    3. 时钟信号的频率
  3. 定时器使用说明:
    1. 启用定时器中断
    2. 选择定时器工作模式
    3. 设置脉冲计数器初始值
    4. 启动定时器
    5. 定义中断服务程序

IIC协议介绍:

  • IIC(Inter-Integrated Circuit),通常简称为IIC,是一种用在集成电路(IC)之间的串行通信总线。

  • IIC同步串行通信,使用两根线路进行通信,分别是数据线(SDA)和时钟线(SCL),SDA线用于数据传输,SCL线用于数据传输的同步。SCL的每个时钟周期,SDA传输一位数据。

  • IIC规定:数据的接收方会在每个时钟周期的高电平期间读取数据,具体来讲就是在SCL处于高电平时,读取SDA上的数据。

    IIC

    • 因此,SDA必须在SCL低电平期准备好要发送的下一位数据,然后在SCL高电平期间保持稳定。

IIC主从架构:

  • IIC采用主从架构,一个主设备可连接多个从设备。主设备负责发起通信和控制总线,而从设备负责响应主设备的请求。如下图所示。

    IIC主从架构

  • IIC总线中的每个从设备都有一个唯一的地址(用7位二进制数字表示),用于在总线上标识自己。主设备可以根据地址选择性的与特定的从设备进行通信。

  • 需要注意的是,SCL信号线上的时钟信号始终由主设备产生,而SDA信号线上的数据信号既可由主设备产生,也可由从设备产生。当主设备向从设备发送数据时,SDA信号由主设备产生,从设备接收信号;当主设备从从设备读取数据时,SDA信号由从设备产生,主设备接收信号

IIC通讯协议:

  1. 空闲状态:

    1. IIC协议规定,当SDA和SCL均为高电平时,总线为空闲状态。
  2. 起始和结束信号:

    • 主设备和从设备间的每次通信,都需要以一个起始信号开始,以一个结束信号终止。起始信号和结束信号的定义如下:

    • 起始信号:当SCL处于高电平时,SDA由高变低。

    • 停止信号:当SCL处于高电平时,SDA由低变高。

      IIC起始-结束信号

    • 注意:起始信号和结束信号,都只能由主设备产生。

  3. 确认信号:

    1. IIC协议规定:发送方每发送一个字节(8位)的数据,接收方都要向发送方回复一个1位的确认信号。

      IIC确认信号

      • 如果该确认信号为 0 表示接收方已成功接收到该字节,发送方可继续发送下一字节,这个信号在IIC协议中称为ACK(Acknowledge);如果该信号为 1 ,则表示接收方未能成功接收到该字节,或者不希望接收更多数据,该信号在$$I^2C$$协议中称为NACK(Not Acknowledge)。
  4. 从机地址和读写标识:

    1. 由于一个$$I^2C$$总线上可能有多个从设备,所以开始通信前,主设备需要先与目标设备取得联系,然后再进行数据传输,除此之外,主机还需要向目标设备明确本次通信的操作是写数据还是读数据。(是以主机为角度)

    2. 上述操作的实现思路如下:

    3. 当主设备发送起始信号之后,会向所有设备发送一个字节的数据,这一个字节中,前7位为目标设备地址,第8位为读/写标识(1表示读,0表示写),如下图所示:

      IIC从机地址

    4. 当各从设备收到这个字节的数据后,会将7位地址与自身进行对比,相同则会向主设备回复确认信号,不相同则不做任何回应。

    5. 当主设备收到目标设备的确认信号后,便会开始与该设备进行通信。

  5. 完整通信流程:

    1. 发送起始信号
    2. 发送目标从设备地址+读写标识位
    3. 接收从设备回复的确认信号
    4. 与从设备进行数据传输(发送/接收)
    5. 发送终止信号

    IIC通信流程

IIC协议–EEPROM:

  1. 概述:EEPROM(Electrically Erasable Programmable Read-Only Memory,可擦写可编程只读存储器)是一种非易失性存储器(断电后仍能保留数据),可以多次写入和擦除数据。

IIC协议–OLED模块:

  1. OLED(Organic Light-Emitting Diode,有机发光二极管)显示屏由许多微小的发光二极管构成,每个发光二极管就对应着屏幕上的一个像素,通过控制二极管的亮灭就能在屏幕上显示图像或文字。
  2. 按照驱动方式划分,OLED显示屏分可分为两类,分别是PMOLED(Passive Matrix,被动矩阵)和AMOLED(Active Matrix,主动矩阵)。
  3. PMOLED的驱动方式和前文的LED点阵类似,每次只能点亮一行或者一列,需要快速的逐行或者逐列扫描来显示内容。(动态扫描)
  4. AMOLED屏幕上的每个像素点都有一个单独的控制电路,可以独立进行控制。

参考链接: