04_CC2530+Uart串口通信

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 TxP2DIR &= 0x3f;  // 选用UART0作为第一优先级指派给端口0P0SEL |= 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 = 8U0BAUD |= 0x2C;  // 44U0GCR |= 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.xdnf.cn/news/3565.html

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

相关文章

Speaker Recognition说话人识别(声纹识别)

说话人识别&#xff0c;又称声纹识别。从上世纪60年代开始到现在&#xff0c;声纹识别一直是生物识别技术研究的主题。从传统的基于模板匹配的方法&#xff0c;到早期基于统计学方法&#xff0c;直到基于深度学习的声纹识别技术成为主流。本项目给出一个从传统&#xff08;基于…

SpringBoot篇(简化操作的原理)

目录 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; 三、提供 starter简化 Maven 配置 四、自动配置 Spring&#xff08;引导类&#xff09; 五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; SpringBoot项目都会继…

华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力3-获取设备位姿

设备位姿描述了物体在真实世界中的位置和朝向。AR Engine提供了世界坐标下6自由度&#xff08;6DoF&#xff09;的位姿计算&#xff0c;包括物体的位置&#xff08;沿x、y、z轴方向位移&#xff09;和朝向&#xff08;绕x、y、z轴旋转&#xff09;。通过AR Engine&#xff0c;您…

【Git】Git常用命令

目录 1 前言2 git命令2.1 branch2.2 checkout2.3 pull and push2.4 config2.4.1 Proxy 2.5 tag2.6 rebase2.7 patch2.8 remote2.9 submodule2.10 rm2.10 gitignore2.11 某个commit更改了哪些文件2.12 clean 3 结束语 1 前言 本章记录总结在使用git过程中常用的一些命令&#x…

cgroup2版本下使用cgroups对内存/cpu进行控制

先查看cgroups的版本支持: cat /proc/filesystems | grep cgroup 运行结果: 如上表示支持cgroup2版本 一、对内存进行控制 cgroup版本对于内存控制是单独使用/sys/fs/cgroup/memory路径控制的,而在cgroup2版本中是统一管理,所以没有该路径,所以只需先进入该路径: cd /sys/…

安卓应用跳转回流的统一和复用

本文字数&#xff1a;6799字 预计阅读时间&#xff1a;35分钟 作为一个功能复杂的应用&#xff0c;无法避免地需要支持众多路径的回流&#xff0c;比如从Launcher、从Push通知、从端外H5、从合作第三方App以及从系统资源分享组件等。 我们知道&#xff0c;不同的回流路径会通过…

C3.【C++ Cont】名字空间、注释和变量

目录 1.回顾 2.名字空间(也称命名空间) 介绍 代码示例 3.注释 4.练习 B2003 输出第二个整数 方法1 方法2 1.回顾 在C1.【C Cont】准备中提到了名字空间(namespace)语句 using namespace std; 2.名字空间(也称命名空间) 介绍 1.处在在同一个空间内的,若有重名则会名…

常见自动化测试框架分层架构

作为一名专业的测试人员&#xff0c;搭建一个高级的自动化测试框架需要考虑多个因素。以下是一些步骤和指导&#xff0c;帮助你构建一个强大且灵活的自动化测试框架&#xff1a; 1. 理解框架的概念&#xff1a; - 首先&#xff0c;我们需要明确什么是“框架”。在自动化测试中…

103 - Lecture 2 Table and Data Part 1

SQL - Tables and Data Part 1 Relational Database Management System(RDBMS) 关系型数据库管理系统&#xff08;RDBMS&#xff09;是基于关系模型的数据库系统&#xff0c;它支持多种关系操作。关系模型是一种数据存储和检索的模型&#xff0c;它使用表格来组织数据&#x…

NestJS vs Fastify:Node.js框架的性能对决

在Node.js的世界中&#xff0c;框架的选择对于应用的性能和可维护性有着至关重要的影响。NestJS和Fastify是两个备受瞩目的框架&#xff0c;它们各自以其独特的优势在开发者社区中赢得了声誉。本文将深入探讨这两个框架的性能特点&#xff0c;并分析它们在不同场景下的适用性。…

【NOIP普及组】明明的随机数

【NOIP普及组】明明的随机数 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随…

python中t是什么意思

python中t是什么意思&#xff1f; python中t指的是“\r”&#xff1a;回车符&#xff0c;返回到这一行的开头&#xff0c;return的意思。 其他相关&#xff1a; \n&#xff1a;换行符&#xff0c;到下一行的同一位置&#xff0c;纵坐标相同&#xff0c;new line的意思。 \t…

OracleJDK与OpenJDK的区别(附带win11下多版本jdk安装)

OracleJDK与OpenJDK的区别&#xff08;附带win11下多版本jdk安装&#xff09; 在Java开发领域&#xff0c;OracleJDK与OpenJDK是两个常被提及的名词&#xff0c;它们都是Java开发工具包&#xff08;JDK&#xff09;的实现&#xff0c;但各自具有不同的特点和优势。在早期的jav…

代码随想录算法训练营第三十一天 | 56.合并区间 738.单调递增的数字 968.监控二叉树

LeetCode 56.合并区间&#xff1a; 文章链接 题目链接&#xff1a;56.合并区间 思路&#xff1a; ① 合并所有重叠的区间&#xff0c;合并后的区间数组不重叠&#xff0c;因此下面两种多区间重叠&#xff0c;其中的区间都要进行合并 ② 合并区间&#xff1a;因为情况2也算作…

[ComfyUI]FaceAging:太好玩啦!FaceAging终于装好了!负50到正100岁随心调整!超强又难装的节点安装教程来了! Comfyui教程

大家好&#xff01;今天我要向大家介绍一个超级有趣的话题——[ComfyUI]FaceAging&#xff01;这个工具能够让你轻松实现人脸年龄的调整&#xff0c;从负50岁到正100岁&#xff0c;让你的创作更加有趣和独特。 想象一下&#xff0c;你有一个强大的AI助手&#xff0c;它能够根据…

蓝桥杯真题——乐乐的序列和(C语言)

问题描述 乐乐在玩一个游戏&#xff0c;她有一排宝石&#xff0c;每个宝石上都刻有一个整数值。她的目标是从中挑选出一些宝石&#xff0c;使得选出的宝石数量为偶数&#xff0c;且这些宝石上的数字总和最大。如果不选任何宝石&#xff08;即选出宝石数量为 00&#xff0c;也是…

猫用宠物空气净化器哪个牌子好?求噪音小的宠物空气净化器推荐!

最近真是烦躁到了顶峰&#xff01;猫咪换毛季太折磨人了&#xff0c;白天上班累的要死&#xff0c;晚上回家还要和猫毛斗争。每天回家都是一场豪赌&#xff0c;需要花费的清理时间取决于家里的猫毛散落程度。有时候忙起来完全不想管&#xff0c;回到家只想躺着。 但最近身体出…

redis7学习笔记

文章目录 1. 简介1.1 功能介绍1.1.1 分布式缓存1.1.2 内存存储和持久化(RDBAOF)1.1.3 高可用架构搭配1.1.4 缓存穿透、击穿、雪崩1.1.5 分布式锁1.1.6 队列 1.2 数据类型StringListHashSetZSetGEOHyperLogLogBitmapBitfieldStream 2. 命令2.1 通用命令copydeldumpexistsexpire …

32位汇编——通用寄存器

通用寄存器 什么是寄存器呢&#xff1f; 计算机在三个地方可以存储数据&#xff0c;第一个是把数据存到CPU中&#xff0c;第二个把数据存到内存中&#xff0c;第三个把数据存到硬盘上。 那这个所谓的寄存器&#xff0c;就是CPU中用来存储数据的地方。那这个寄存器有多大呢&a…

1.1 OpenCV准备工作

介绍了如何在Windows系统中配置Python和Anaconda环境&#xff0c;并安装OpenCV库。首先从Python官网下载并安装Python&#xff0c;然后配置环境变量。接着安装Anaconda&#xff0c;并通过Anaconda Navigator或Prompt管理包。最后&#xff0c;在Anaconda Prompt中使用pip命令安装…