IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> UART嵌入式通信协议(以AVR单片机为例) -> 正文阅读

[嵌入式]UART嵌入式通信协议(以AVR单片机为例)

概念

UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。

通信基础

并行通信

在这里插入图片描述

串行通信

在这里插入图片描述

单工通信

数据传输方向是单向。

双工通信

半双工

通信不可同时进行
在这里插入图片描述

全双工

在这里插入图片描述

波特率

波特率是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。

UART帧格式

在这里插入图片描述

硬件连接

在这里插入图片描述

控制器

一般情况下处理器都会集成UART控制器,我们使用YART进行通信时只需要对其内部相关控制器进行设置即可。
在这里插入图片描述

AVR单片机USART相关寄存器

I/O数据寄存器 UDR

在这里插入图片描述

控制和状态寄存器 UCSRA

在这里插入图片描述

  • 位7—RXC:USART接收结束(中断标志位)
  • 位6—TXC:USART发送结束
  • 位5—UDRE:数据寄存器空
  • 位4—FE:帧错误
  • 位3—DOR:数据溢出
  • 位2—PE:奇偶校验错误
  • 位1—U2X:倍速发送
  • 位0—MPCM:多处理器通信模式

控制和状态寄存器UCSRB

在这里插入图片描述

  • 位7—RXCIE:接受结束中断使能,为1产生中断
  • 位6—TXCIE:发送结束中断使能
  • 位5—UDRIE:USART数据寄存器空 中断使能
  • 位4—RXEN:接受使能,置为后将启动USART接收器
  • 位3—TXEN:发送使能,置为后将启动USART发送器
  • 位2—UCSZ2:字符长度
  • 位1—RXB8:对于9位串行帧进行操作时,RXB8是第9个数据位。
  • 位0—TXB8:对于9位串行帧进行操作时,TXB8是第9个数据位。

控制和状态寄存器UCSRC

在这里插入图片描述

  • 位7—URSEL:寄存器选择,通过该位访问UCSRC寄存器或UBRRH寄存器。当读UCSRC时,该位为1;当写UCSRC时,该位必须写1
  • 位6—UMSEL:USART模式选择,通过这一位来选择同步或异步工作模式,0为异步,1为同步
  • 位5—位4 UPM:奇偶校验模式设置,00禁止,01保留,10偶校验,11奇校验
  • 位3—USBS:停止位选择。0-停止位位数1;1-停止位位数2
  • 位2—位1 UCSZ:字符长度设置
    在这里插入图片描述
  • 位0—UCPOL:时钟极性,仅用于同步工作模式
    在这里插入图片描述

波特率寄存器UBRRL和UBRRH

在这里插入图片描述

  • 位15—URSEL:寄存器选择,当读时为0,当写时为1
  • 位11—0 UBRR比特率寄存器:UBRRH包含了比特率的高四位,UBRRL包含了低8位

在操作时设置最高位URSEL来区分。

  • 写操作:当写入数据时,最高位为0,数据写入UBRRH;数据的最高位为1时,数据写入UCSRC 读操作
  • 读操作:第一次读取的值为寄存器UBBRH的数值,如果在连续的两个时钟周期里都执行读操作,那么第二次读到的就是UCSEC的值

波特率计算公式
在这里插入图片描述
例子
在这里插入图片描述
在这里插入图片描述
误差计算公式
在这里插入图片描述

USART的使用方法

  1. 初始化。工作模式,帧结构等(UCSRC)
  2. 波特率设置(UBBRL,UBBRH)
  3. 中断的相关设置(UCSRB)
  4. 选择中断号,编写中断服务函数

初始化

//以atmega32为例

#define uchar unsigned char
#define uint unsigned int
#define fosc 7372800 //时钟频率

uchar rdata;
uchar flag;

void uart_init(uint baud)//baud为设置的比特率
{
uint a;
UCSRC=0x86;
a=fosc/16-baud-1;
UBRRL=a%256;
UBRRH=a/256;
UCSRB=0x98;
SREG|=BIT(7);
}

发送函数

void uart_send(uchar data)
{
while(!(UCSRA&BIT(UDRE))); //第五位是否为1,从而满足条件退出循环发送数据
UDR=data;
while(!(UCSRA&BIT(TXC));
UCSRA|=BIT(TXC); //写1进行清除操作
}

接受函数

#pragma interrupt_handler uartrece_isr:12 //中断号
void uartrece_isr(void)
{
UCSRB&=~BIT(7); //第七位清零
rdata=UDR;
flag=1;
UCSRB|=BIT(7); //打开中断
}

主函数

void main(void)
{
uchar i ='h';
uart_init(9600);
//uart_send(i);
while(1)
	{
	if(flag)
		{
		flag=0;
		uart_send(rdata);	
		}
	}
}

实例

// ATMEGA32
#define F_CPU 8000000UL
#define myUBRR 8 // 115200 b/s
#define myU2X 1
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

void USART_Init( unsigned int speed)//使用 UBRR 寄存器的给定值初始化 USART,该值应根据波特率 BoudRate 计算
/*  当 U2X=0 
		UBRR=Fosc/(16*BaudRate)-1  
		BaudRate=Fosc/16(UBRR+1) 
	当 U2X=1
		UBRR=Fosc/(8*BaudRate)-1 
		BaudRate=Fosc/8(UBRR+1)
*/
{
	UBRRH = (unsigned char)(speed>>8);
	UBRRL = (unsigned char)speed;

	UCSRB=(1<<RXEN)|( 1<<TXEN); //允许接收和发送USART
	#if (myU2X==1) //只有当myU2X=1时才会编译以下行
		UCSRA |= (1<<U2X); //传输速率加倍
	#endif
	UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);// 8位传输,1个停止位

}

void USART_Transmit( unsigned char data ) //向USART通道传输一个字节
{
	while ( !(UCSRA & (1<<UDRE)) ); //检查数据寄存器的释放(准备加载下一个字节)
	UDR = data; //将数据加载到寄存器中进行传输
	UCSRA |= (1<<TXC); // 重置传输完成位
}

int main (void)
{
	char ch='O';
	int i;
	DDRC=0xFF;
	USART_Init(myUBRR);
	while (true) {
		i=0;
		do {
			PORTC=i;// 将循环数输出到端口 C,准备在日志文件中固定新接收到的符号
			if (UCSRA & (1<<RXC)){ // 控制从 USART 通道接收信息
				ch=UDR;// 读取接收缓冲区以准备接收下一个字节
				if (UCSRA & ((1<<FE)|(1<<DOR))){ //检查是否有接收错误
					ch='.';//接收到的有错误的字节被替换为'.'
					PORTC=0xFF;//便于识别日志文件中的情况
				}
				// 没有接收错误
				PORTC=ch;//将接收到的字节输出到端口C,以便在日志文件中修复
				USART_Transmit(ch);
				i++;
			}
		}
		while (i<10);
		
		while ( !(UCSRA & (1<<TXC)) ); //检查空闲移位寄存器(传输完成)
//关闭并打开UART,
//导致需要新的接收同步(搜索起始位)
		UCSRB &= ~((1<<RXEN)|( 1<<TXEN));//禁用UART发送/接收,这会重置缓冲区中累积的接收位。
		PORTC=0; // 在日志文件中记录 UART 被禁用的那一刻
		for (i=0;i<(3*myUBRR);i++);//持续时间等于几位传输时间的时间延迟
		UCSRB|=((1<<RXEN)|( 1<<TXEN));// 启用 UART 发送/接收,开始搜索起始位
		PORTC=1;// 在启用 UART 的那一刻记录在日志文件中
	}
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:53:52  更:2022-05-09 12:55:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:31:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码