【单片机day03】
UART串口
通用异步收发器,2个串口(1个串口被用于ISP下载程序,1个串口被用于和主机之间的通信)
全双工(两根线TX、RX)、串行、异步
通信方式:
- 单工:
- 发送方和接收方是固定的,数据只能从发送方 发给 接收方
- 数据传输通过一根信号线实现
- 数据传输方向固定
- 半双工:(I2C)
- 发送方和接收方不是固定的,通信双方都可发可收
- 数据传输通过一根信号线,数据的传输方向是双向的
- 但同一时刻数据传输方向是单一的(A给B发的时候,B只能接收)
- 全双工:(UART)
- 通信双方既可作为发送方,也可作为接收方
- 数据传输通过两根信号线
- 数据传输方向在任意时刻都是双向的
数据传输的顺序:
Uart在传输数据时,遵循LSB优先原则(低位先行),先发低位数据
数据传输的形式:
- 串行:通过一根信号线传输数据,按照先后次序逐个bit逐个bit去发送数据
- 并行:通过多根信号线同时去传输数据
串行传输和并行传输的区别:
- 串行:
- 传输速率慢(只能通过一根线逐个bit去传输)
- 硬件成本低,实现简单
- 传输距离远,抗干扰性好(RS485差分)
- 并行:
- 传输速率快,可以通过多跟线同时传输多个Bit
- 硬件成本高,实现复杂
- 传输距离近,抗干扰性差(理论上30米内,)
串口通信时序:
- 串口通信时,空闲状态为高电平
- 当由高电平变为低电平(发送一个低电平信号),代表发送了一个起始位,准备开始通信
- 发送数据(通常是8bit,遵循先发数据低位LSB原则)
- 再发送一个Bit的校验位,(奇偶校验)
- 校验
-
奇偶校验(串口):
- 奇 校验:校验位 为1,若数据位中,“1” 的个数加上校验位 “1” 的个数,保持奇数个,代表校验通过(奇校验,奇数个1)。
- 偶 校验:校验位为0,若数据位中“1”的个数 + 校验位“0”的个数,保持1的个数位偶数个,代表校验通过。(偶校验,偶数个1)
- 缺点:无法检测 偶数个bit出错的问题
- 累加和 校验
- CRC校验(Modbus协议)
-
串口通信参数:
波特率:
bps(bit per second),每秒钟传输bit的数量,常见的波特率:2400, 4800 , 9600,115200
数据位:
8, 串口传输通常8bit 数据位传输
停止位:
1, 1bit停止位
校验位:
None,N,无校验
Even,E,偶校验
Odd,0,奇校验
同步通信、异步通信
I2C:SCL 时钟线
SPI:SCLK 时钟线
UART:无时钟线 异步
- 同步:
- 通信的双方有一根共享的时钟线来约定通信的频率(同步发送数据/接收数据)
- 异步:
- 通信双方没有时钟线进行同步,如Uart:可以通过设置波特率来实现同步(发:2400bps 收:2400bps)
串口寄存器配置:
串口的波特率发生器依赖于定时器1(Timer1)
-
SCON/PCON串口控制寄存器:
- PCON寄存器中的bit6 置0代表通过SCON寄存器中SM0和SM1两位指定串口工作方式:
- 将SCON寄存器中的bit6和bit7清0
- 将SCON寄存器中的SM1 bit6置1,SM0 bit7清0,代表串口工作8位UART模式
- 将SCON寄存器中REN bit4置1,代表允许串口接收数据
- SCON寄存器中bit1 TI位,代表串口8位数据发送完毕硬件自动置1,但需要软件清0(用来检测)
- SCON寄存器bit0 RI位,代表串口8位数据接收完毕硬件自动置1,但需要软件清0 (用来检测)
- PCON寄存器SMOD bit7位置1,代表波特率加倍
-
定时器寄存器相关配置:
- TMOD 定时器模式选择寄存器:
- 将TMOD寄存器中的高四位清0(定时器1)
- 将TMOD寄存器中的bit5置1,bit4清0,代表定时器1工作在8位自动重装载模式
- 将定时器初值写入到TL1和TH1
- 将TCON寄存器中的bit6置1,代表允许定时器1开始计数
-
中断寄存器相关配置:
- IE中断控制寄存器:
- 将IE寄存器中的bit7 EA位置1,代表CPU能够响应所有中断
- 将IE寄存器中的bit4 ES位置1,代表允许串口产生中断
定义数组时:xdata char buf[32] = {0xAA, 0xBB,0xCC};
存储在片外RAM中,不加xdata,会存储在片内RAM中(只有256byte)
主从应答:
主从应答就是通信协议里,主机发起请求,从机必须返回确认(ACK/NACK或数据帧),以保证数据传输的可靠性和交互性。
- 主机:拥有对通信绝对控制权,通信都是由主机发起
- 从机:无法直接发起通信,只能根据主机下发的指令完成对应操作
主机 -> 从机:
功能码 0000 0001
从机 -> 主机:
功能码:1000 0001 也就是81
bit 7最高位:数据流向位
0:主机 -> 从机
1:从机 -> 主机