04_CC2530+Uart串口通信

news2024/11/26 20:26:46

04_CC2530+UART串口通信

串口通信基本概念

  • 串行通信: 数据字节一位位地依次传送的通信方式, 串行通信的速度慢, 但用的传输线条数少, 成本低适用于远距离的数据传送
  • 并行通信: 数据字节的各位同事传送的通信方式, 优点是数据传送速度快, 缺点是占用的传输线条数多, 适用于近距离通信, 远距离通信的成本较高
  • 异步通信: 一次通信传送一个字符帧, 发送的字符之间的时间间隔可以是任意的, 优点是通信设备简单、价格低廉, 但因为具有起始位和停止位, 传输效率较低

  • 同步通信: 进行通信前先建立同步, 发送频率和接受方的接受频率要同步。在发送信息时, 将多个字符加上同步字符组成一个信息帧, 有一个统一的时钟控制发送端的发送, 接收端识别到同步字符后, 就认为开始一个信息帧, 此后位数作为实际传输信息处理。优点: 传输速度较快, 可用于点对多点 缺点: 需要使用专用的时钟控制线实现同步, 对于长距离通信成本较高, 通信速率也会降低。一般用于同一PCB上芯片级之间的通信

USART和UART的区别

  • UART(universal asynchronous receiver and transmitter) 通用异步收/发器

  • USART(universal synchronous asynchronous receiver and transmitter) 通用同步/异步收/发器

  • USARTUART增强型

  • CC2530芯片有USART0USART1串行通信接口, 它们能够分别运行于异步UART模式或者同步SPI 模式,两个USART具有同样的功能

UART串口参数及时序(串行异步通讯)

  • 波特率: 串口通信的速率,通讯双方的波特率需要一致
  • 起始位: 标志一个数据帧的开始, 固定为低电平
  • 数据位: 数据帧的有效载荷, 1为高电平, 0为低电平, 低位先行
  • 校验位: 用于数据验证, 根据数据位计算得来
  • 停止位: 用于数据帧间隔, 固定为高电平

硬件电路与CH340 USB转串口芯片

  • 简单双向串口通信有两根通信线(发送端TX和接受端RX)
  • TX与RX需要交叉连接
  • 当只需单向的数据传输时, 可以只接一根通信线
  • 当电平标准不一致时, 需要加电平转换芯片
  • 由于单片机UART外设电脑USB接口采用的电平标准不同,通常需要通过CH340芯片进行电平转换,且电脑上需要安装相应的CH340驱动程序

在这里插入图片描述

  • Note: 若开发板上有电平转换芯片,一般只需用数据线直接将电脑开发板上USB接口连接。若开发板上没有电平转换芯片,则需找到对应串口的引脚, 通过外置的USB转TTL模块与电脑相连接

CC2530 UART通信

CC2530USART0USART1两个串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式。两个USART具有同样的功能,可以设置在单独的 I/O 引脚。

UART模式

UART模式提供异步串行接口。在UART模式中,接口使用2线或者含有引脚RXDTXD可选RTSCTS的4线。UART模式具有以下特点:

  • 8位或者9位负载数据
  • 奇校验、偶校验或者无奇偶校验
  • 配置起始位和停止位电平(默认起始位低电平,停止位高电平)
  • 配置LSB或者MSB首先传送
  • 独立收发中断
  • 独立收发DMA触发
  • 奇偶校验和帧校验出错状态
UART发送
  • 当往UxBUF(USART 收/发数据缓冲器寄存器) 写入数据时,该字节发送到输出引脚 TXDx
  • 当字节传送开始时,UxCSR.ACTIVE位变为高电平,而当字节传送结束时为低。当传送结束时, UxCSR.TX_BYTE位设置为 1
UART接收
  • 当1写入 UxCSR.RE 位时,在UART上数据接收就开始了。(开启接收,需要配置完UART所有参数后)
  • UART会在输入引脚RXDx中寻找有效起始位,当检测出有效起始位时,收到的字节就传入到接收寄存器,并将UxCSR.RX_BYTE位设置为 1,接收完一个字节后会产生一个中断
  • 通过寄存器UxBUF提供收到的数据字节。当UxBUF读出时,UxCSR.RX_BYTE位由硬件清 0
USART中断

​ 每个USART都有两个中断:URXx(接收完成中断)UTXx(发送完成中断)USART0相关中断使能和中断标志如下:

  • USART0 RX:IEN0.URX0IE
  • USART0 TX:IEN2.UTX0IE
  • USART0 RX:TCON.URX0IF
  • USART0 TX:IRCON2.UTX0IF
波特率的产生

​ 由寄存器 **UxBAUD.BAUD_M[7:0]**和 UxGCR.BAUD_E[4:0]定义波特率。公式如下:
波特率 = ( 256 + B A U D _ M ) ∗ 2 B A U D _ E 2 28 ∗ F \begin{aligned} 波特率=\frac{(256+BAUD\_M)*2^{BAUD\_E}}{2^{28}}*F\\ \end{aligned} 波特率=228(256+BAUD_M)2BAUD_EF
​ 其中: F
系统时钟频率

UART通信相关寄存器
端口配置相关寄存器

​ 由于CC2530USART0有两个可选位置(如下图所示),因此需要配置相关寄存器,来选择USART0所用的引脚。

在这里插入图片描述

​ 需要配置的寄存器有:

  • PERCFG:外设I/O控制寄存器
  • P2DIR:端口2方向和端口0外设优先级控制
  • P0SEL:端口0功能选择
UART串口参数配置相关寄存器

​ 在使用UART通讯前,要将USART配置成UART模式,并设置通讯时的串口参数(见UART串口参数及时序小节)。需要配置的寄存器有:

  • U0CSRUSART0控制和状态寄存器
  • U0UCRUSART0 UART控制寄存器
  • U0BAUDUSART0波特率控制
  • U0GCRUSART0通用控制
USART中断配置相关寄存器

​ 一般只用到接收中断,用于接收信息。无特殊情况,不需要用到发送中断。与USART0接收中断相关寄存器有:

  • URX0IFUSART0接收中断标志

  • URX0IEUSART0接收中断使能

  • IEN0.EA: 全局中断使能

    配置完上述寄存器后,还需重写putchar函数,即可用printf函数将信息从串口中发送出去。在接收中断服务函数中,完成信息的接受,并做出相应的回答。

具体代码讲解

项目结构

Serial.c用于实现UART通信SystemTimer中的源文件,主要用于实现Delay_ms函数,下面将重点讲解serial.c中的代码。Delay_ms函数相关代码在基础篇03中有详细介绍,不在赘述。
在这里插入图片描述

Serial.c
#include <ioCC2530.h>
#include "serial.h"
#include <stdio.h>

unsigned char RxBuf;   // 接收缓存
unsigned char RxData[RXLEN];  // 数据保存
unsigned char RxState = 0;  // 接收状态  0 等待包头'@'   1 接收数据
/**
* @brief 初始化串口 UART0
*/
void Serial_Init(void)
{
  	// 端口配置
	PERCFG = 0x00;  // 选用UART0默认位置 P0_2 Rx  P0_3 Tx
	P2DIR &= 0x3f;  // 选用UART0作为第一优先级指派给端口0
	P0SEL |= 0x0C;  // P0端口 2、3引脚设置为外设功能
	// UART 配置
	U0CSR |= 0x80;  // 选择UART模式
	U0UCR |= 0x02;  // 8bit 无校验 1bit停止位
	// 波特率设置 Baud = (256 + BAUD_M)*2^(BAUD_E) / 2^28 * F    F为系统时钟频率 32MHz
	// 若波特率要设置成9600 则BAUD_M = 44   BAUD_E = 8
	U0BAUD |= 0x2C;  // 44
	U0GCR |= 0x08;  // 8
	
	// 配置接收中断
	URX0IF = 0;   // 清除接收中断标志
	URX0IE = 1;   // 使能接受中断
	EA = 1;   // 开启全局中断
	U0CSR |= 0x40;  // 接收器使能 需要先配置完USART所有参数
}

/**
* @brief 重写 putchar函数 UART0 printf函数底层调用的就是该函数 重写过后,调用printf会通过串口发送信息
*/
__ATTRIBUTES int putchar(int c)
{
    UTX0IF = 0;   // 清除发送标志位
    U0DBUF = (char)c;
    while(UTX0IF == 0);  // 等待发送成功  发送成功时 发送标志位复位
    return(c);
}

/**
* @brief UART0 接收中断服务函数
*/
#pragma vector = URX0_VECTOR
__interrupt void USAT0_ISR(void)
{
  	static unsigned int idx = 0;  // 接收数组下标 static关键字只初始化一次
  	if(U0CSR&0x04 != 0)   // 接收到数据
	{
		RxBuf = U0DBUF;   // 从UART寄存器中读取数据
		if(RxState == 0)   // 等待包头
		{
		  if(RxBuf == '@')
		  {
		  	RxState = 1;  // 切换状态为接收信息
			idx = 0;  // 重置下标
		  }
		}
		else if(RxState == 1) // 读取数据
		{
		  if(idx < RXLEN && (RxBuf != '\n'))  // 接收数据
		  {
		  	RxData[idx++] = RxBuf;  //从接收缓存区中读取信息,放到接收数组中
		  }
		  else    // 数据超过限制 或者 收到包尾
		  {
		  	idx = 0;  // 重置下标
			RxState = 0;  // 切换状态为等待包头
			printf("Get Info:%s\n", RxData);  // 回复消息
		  }  
		}
	}
	URX0IF = 0;  // 清除中断标志
}
  • UART0接收中断服务函数:实现接收包头为'@'的消息,并在接收到包尾\n时,发送接收数组RxData中的数据作为回复。
  • 具体实现看代码,非常详细
Serial.h
#ifndef __SERIAL_H
#define __SERIAL_H
#define RXLEN 256   // 接收数据最大长度
void Serial_Init(void);
#endif
main.c
#include <ioCC2530.h>
#include "delay.h"
#include <stdio.h>
#include "serial.h"

void main(void)
{
 	Delay_Init();  // 初始化延时函数, 基于定时器3实现
	Serial_Init(); // 初始化串口
	while(1)
	{
		printf("%s\n", "hello zigbee!\n");  // 每过五秒向上位机发送消息
		Delay_ms(5000);
	}
}
  • NoteDelay_ms()相关代码见基础篇03

实验现象

发送消息

​ 大约每隔5s上位机收到从单片机串口发来的消息
在这里插入图片描述

接收消息

​ 根据回复内容,可以判断单片机正确接受到上位机的消息

在这里插入图片描述

参考资料

STM32入门笔记10_USART串口通信+案例:上位机控制LED亮灭(USART串口通信、TIM定时器、EXTI综合案例)-CSDN博客

CC2530中文数据手册完全版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2233835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络安全】湖北大学–DNS欺骗实验

目录 0x00 ettercap-原理 0x01 ettercap-arp欺骗 0x02 ettercap-dns劫持 0x00 ettercap-原理 攻击者冒充域名服务器&#xff0c;然后把查询的IP地址设为攻击者的IP地址。这样的话&#xff0c;用户上网就只能看到攻击者的主页&#xff0c;而不是用户想要取得的网站。 首先&…

雷池社区版新版本功能防绕过人机验证解析

前两天&#xff0c;2024.10.31&#xff0c;雷池社区版更新7.1版本&#xff0c;其中有一个功能&#xff0c;新增请求防重放 更新记录&#xff1a;hhttps://docs.waf-ce.chaitin.cn/zh/%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0%E8%AE%B0%E5%BD%95 仔细研究了这个需求&#xff0c;…

【深度学习基础】深入理解 卷积与卷积核

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 卷积 1.1 …

SpringBoot集成Shiro+Jwt+Redis

1. 概述 首先需要知道为什么使用 ShiroJwtRedis 进行登录认证和权限控制。 1. 为什么用Shiro&#xff1f; 主要用的是 shiro 的登录认证和权限控制功能。 Shiro 参见本栏目文章 &#x1f343;《Shiro实战》 2. 为什么用Jwt&#xff1f; Shiro 默认的 Session 机制来帮助实现…

基于Python的乡村居民信息管理系统【附源码】

基于Python的乡村居民信息管理系统 效果如下&#xff1a; 系统主页面 系统登录页面 管理员主页面 居民管理页面 政务学习页面 土地信息管理页面 个人信息管理页面 居民登陆页面 村委人员主页面 研究背景 随着信息技术的飞速发展和乡村振兴战略的深入实施&#xff0c;传统的乡…

HTML 基础标签——表单标签<form>

文章目录 1. `<form>` 标签:定义表单容器2. `<input>` 标签:多用途输入控件3. `<textarea>` 标签:多行文本输入框4. `<select>` 标签:下拉选择框5. `<option>` 标签:下拉菜单选项6. `<button>` 标签:按钮元素7. `<label>` 标签…

Debian的基本使用

前言 本人撰写的相关文档中&#xff0c;部分技术已经不再提供支持了&#xff08;不得不感慨&#xff0c;菜鸡的个人进步追不上技术更新啊&#xff09;&#xff0c;比如Centos、EasyExcel&#xff0c;虽然说目前仅使用还没有什么问题&#xff0c;但是还是要了解一下备用方案。 …

比亚迪能不能打败特斯拉?

文/孔文清 比亚迪在第三季度的财报发布后&#xff0c;首次在营收上超越了特斯拉&#xff0c;这是电动汽车行业的重要时刻&#xff0c;也反映了中国产业在全球市场中的崛起。 比亚迪在其2024年第三季度财报中首次实现了2011.2亿元的营业收入&#xff0c;相比特斯拉的1793亿元&a…

什么情况下,不推荐建立索引?

一般有以下几种情况不推荐建立索引&#xff1a; 1&#xff09;对于数据量很小的表 当表的数据量很小&#xff08;如几百条记录&#xff09;时&#xff0c;建立索引并不会显著提高查询性能&#xff0c;反而可能增加管理的复杂性&#xff1b; 2&#xff09;频繁更新的表 对于…

深度学习基础知识-残差网络ResNet

目录 一、ResNet 的核心思想&#xff1a;残差学习&#xff08;Residual Learning&#xff09; 二、ResNet 的基本原理 三、ResNet 网络结构 1. 残差块&#xff08;Residual Block&#xff09; ResNet 的跳跃连接类型 2. 网络结构图示 四、ResNet 的特点和优势 五、ResNe…

做反向代购没货源,也能靠“东方玄学”风生水起?

在全球化日益加深的今天&#xff0c;文化的交流与碰撞愈发频繁。近年来&#xff0c;一股神秘的东方力量——风水玄学&#xff0c;在海外社交媒体上悄然走红&#xff0c;成为众多外国友人追捧的新风尚。从TikTok到Instagram&#xff0c;无数华人博主通过分享风水知识、解读玄学饰…

新闻稿件管理:SpringBoot框架实战指南

3系统分析 3.1可行性分析 通过对本新闻稿件管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻稿件管理系统采用SSM框架&#xff0c;JAVA作为开发语…

web实操2——idea创建普通web项目

创建项目 就是普通的java项目&#xff0c;项目右键add framework support&#xff08;添加框架支持&#xff09;,然后点击Web Application&#xff08;web应用程序&#xff09;&#xff0c;然后点击OK。即可。 文件下就会多一个web文件夹&#xff0c;里面是WEB-INF文件夹&…

冰雪奇缘!中科院一区算法+双向深度学习+注意力机制!SAO-BiTCN-BiGRU-Attention雪消融算法优化回归预测

冰雪奇缘&#xff01;中科院一区算法双向深度学习注意力机制&#xff01;SAO-BiTCN-BiGRU-Attention雪消融算法优化回归预测&#xff08;Matlab&#xff09; 目录 冰雪奇缘&#xff01;中科院一区算法双向深度学习注意力机制&#xff01;SAO-BiTCN-BiGRU-Attention雪消融算法优…

LabVIEW适合开发的软件

LabVIEW作为一种图形化编程环境&#xff0c;主要用于测试、测量和控制系统的开发。以下是LabVIEW在不同应用场景中的适用性和优势。 一、测试与测量系统 LabVIEW在测试与测量系统中的应用广泛&#xff0c;是工程测试领域的主流工具之一。利用其强大的数据采集与处理功能&…

ssm校园线上订餐系统的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 摘 要 I 目 录 III 第1章 绪论 1 1.1 研究背景 1 1.2目的和意义 1 1.3 论文研究内容 1 …

stm32使用串口的轮询模式,实现数据的收发

------内容以b站博主keysking为原型&#xff0c;整理而来&#xff0c;用作个人学习记录。 首先在STM32CubeMX中配置 前期工作省略&#xff0c;只讲重点设置。 这里我配置的是USART2的模式。 会发现&#xff0c;PA2和PA3分别是TX与RX&#xff0c;在连接串口时需要TX对RX&…

Webserver(2.8)守护进程

目录 守护进程案例 守护进程案例 每隔2s获取系统时间&#xff0c;将这个时间写入到磁盘文件中 #include<stdio.h> #include<sys/stat.h> #include<sys/types.h> #include<unistd.h> #include<fcntl.h> #include<sys/time.h> #include<…

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…

IO 多路复用技术:原理、类型及 Go 实现

文章目录 1. 引言IO 多路复用的应用场景与重要性高并发下的 IO 处理挑战 2. IO 多路复用概述什么是 IO 多路复用IO 多路复用的优点与适用场景 3. IO 多路复用的三种主要实现3.1 select3.2 poll3.3 epoll三者对比 4. 深入理解 epoll4.1 epoll 的三大操作4.2 epoll 的核心数据结构…