硬件通信——UART串行口

硬件中可用于通信的有:UART、I2C、SPI、USB、CAN。

一、通信基本概念

1. 通信模式

单工:数据接收方和数据发送方是固定的,数据传输是通过一根信号线实现,数据传输的方向是单一的。

半双工:通信双方既可以作为数据发送方也可以作为数据接收方(接收方和发送方不固定),数据传输是通过一根信号线实现,数据传输的方向可以是双向的(但同一时刻数据传输呈现单一性)。 例如:I2C(SCL 时钟线、SDA 数据线)。

全双工:通信双方既可以作为数据发送方也可以作为数据接收方,数据传输是通过两根信号线实现,任意时刻数据传输方向是双向的。

2. 数据发送顺序

低位先行:先发送低位数据。

高位先行:先发送高位数据。

3. 数据传输方式

串行:通过一根信号线逐个bit逐个bit发送数据

  • 传输速度慢
  • 硬件成本低,实现简单
  • 传输距离远,抗干扰性好(RS485 差分)

并行:通过多根信号线多个bit同时发送

  • 传输速度快
  • 硬件成本高,实现复杂
  • 传输距离近,抗干扰性差(30米内)

4. 电平标准

TTL: 高电平:5V,低电平:0V,传输距离近。

RS232:负逻辑(MAX232) ,高电平: -3V~15V ,低电平:3V~15V。

RS485:差分信号,高电平:A - B > 2V,低电平: A - B < -2V 。

CH340:电平转换芯片(TTL -> USB电平)

5. 同步/异步通信

同步通信:通信双方通过一根共享的时钟信号线规定数据传输的频率。

异步通信:通信双方没有共享时钟信号线规定数据传输频率,通过波特率实现类似同步。

二、UART(串行口)

UART:universal async receiver transmitter,通用异步收发器,全双工、串行、异步。

UART有两个数据线,一个数据线用于传输,一个用于接收,没有时钟线。

  • RXD:数据接收信号线
  • TXD:数据发送信号线

UART接收发送数据共用一个数据缓冲区------SBUF。(接收,中断;发出,轮询)

串口通信时,串口通信参数:例如 9600 8 N 1

  • 波特率(bps):bits per second,每秒传输的bit数量。有2400、4800、9600、115200。
  • 8:数据位,8位数据位。
  • N:None 无校验,O: Odd 奇校验,E:Even 偶校验。
  • 1: 停止位。

奇偶校验: 无法检测偶数个bit出错的问题。

  • 奇校验:校验位为'1',若数据位中'1'的个数加上校验位的'1'保持'1'的总个数为 奇数个,则代表奇校验通过。
  • 偶校验:校验位'0',若数据位中'1'的个数加上校验位的'0'保持'1'的总个数为 偶数个,则代表偶校验通过。

1.串行口相关函数

1.1 串行口控制寄存器SCON和PCON

当PCON寄存器中的SMOD0(B6)为0时,SCON的SM0、SM1指定串行通信的工作方式。

  • SM0(B7)=0,SM1(B6)=1
  • 工作方式:方式1。功能:8位UART,波特率可变

REN(B4):允许/禁止串行接收控制位。

  • REN=0,允许串行接收;REN=1,禁止接收。

TI(B1):发送中断请求标志位。

  • 数据发送结束后,硬件自动置TI=1,向主机请求中断;
  • 响应中断后必须软件复位TI=0。

RI(B0):接收中断请求标志位。

  • 当串行接收一个8位数据后,硬件自动置RI=1,向主机请求中断;
  • 响应中断后必须软件复位RI=0。

PCON寄存器的SMOD(B7):波特率选择位。

  • SMOD=1,波特率加倍;SMOD=0,不变。

1.2 定时器/计数器工作模式寄存器TMOD

定时器1作为UART的波特率发生器,通过定时器1工作在模式2的溢出频率决定波特率。

TMOD高4位全部置0选择定时器1。

  • M1(B5)=1,M0(B4)=0。
  • 模式:8位自动重装载,当溢出时将TH1的值自动装入给TL1。

1.3 定时器/计数器控制寄存器TCON

TR1(B6):定时器T1的运行控制位。

  • TR1=1,允许T1开始计数;TR1=0,禁止T1计数。

1.4 中断允许寄存器IE

EA(B7):CPU的总中断允许控制位。

ES(B4):串行口中断允许位。

2. 串口初始化

  • 配置串口工作模式(8位UART,波特率可变)
  • 允许串口接收数据
  • PCON寄存器SMOD0清0,通过SCON寄存中的bit6和bit7指定串口工作方式
  • 串口波特率加倍,提升串口数据传输速率
  • 配置定时器1工作模式为8位自动重装载
  • 向TL1和TH1中装入定时器初值
  • 开启定时器1计数
  • 允许CPU响应所有中断及允许串口产生中断

定时器1初值计算公式

2^8 - 2^SMOD * focs / 32 / bps / 12

  • SMOD:根据PCON的SMOD置位,只会是0或1。
  • focs:硬件上的晶振频率(12M / 11.0592M)
  • bps:目标波特率(2400)

3. 串口通信

串口发送------轮询,串口接收------中断(串口中断向量表interrupt 4)。

软件在定义数组存放字符串时,默认存储在芯片上的ROM,但是在串口通信时会产生问题。可以在定义前加xdata,将会存储到芯片外的ROM。

三、主从应答

主机:可以发起通信,对通信具有绝对控制权。

从机:无法发起通信,只能根据主机下发指令完成对应的功能。

UART通信协议:Modbus协议。

主机下发Modbus协议格式指令,从机接收指令并解析,完成对应功能,并给主机回复应答。

Modbus协议格式:

起始位 | 设备地址 | 功能码 | 数据位1 | 数据位2 | 校验位 | 结束位

功能码最高位为数据流向位。0:主机->从机;1:从机->主机。

  • 主机->从机:功能码假设传输0x01。
  • 从机->主机:其余不变,功能码返回0x81。
相关推荐
guygg883 小时前
基于STM32的贪吃蛇游戏实现(OLED屏)
stm32·嵌入式硬件·游戏
BackCatK Chen3 小时前
STM32保姆级入门教程|第4章:GPIO输入+外部中断 实现按键控制LED(手把手全流程)
stm32·单片机·外部中断·按键控制 led·stm32cubeid·gpio 输入
悠哉悠哉愿意4 小时前
【单片机学习笔记】第十二届国赛经验复盘
笔记·单片机·嵌入式硬件·学习
rit84324995 小时前
STC8单片机模拟AD转换程序(NTC测温)
单片机·嵌入式硬件
szxinmai主板定制专家5 小时前
基于 STM32 + FPGA 船舶电站控制器设计与实现
arm开发·人工智能·stm32·嵌入式硬件·fpga开发·架构
我不是程序猿儿5 小时前
【嵌入式】编码器计数倍频,机械一格与电气计数
stm32·单片机·嵌入式硬件·学习
Hello World . .5 小时前
51单片机基础外设:GPIO(以LED、按键、数码管为例)
单片机·嵌入式硬件
Flamingˢ5 小时前
基于ARM的裸机程序设计和开发(三):C编程基础与Zynq裸机开发常用方法
c语言·arm开发·单片机
Crazyong7 小时前
FreeRTOS-CPU使用率统计
单片机·嵌入式硬件