嵌入式(五)通信协议 | 串行异步同步 UART SPI I2C 全解析

文章目录

  • 0 串口通信协议
  • 1 通用异步收发传输器 UART
    • 1.1 串口配置
    • 1.2 串口初始化
    • 1.3 串口发送和接收方式
      • 1.3.1 轮询方式发送
      • 1.3.2 中断方式发送
      • 1.3.3 查询方式接收
      • 1.3.4 中断方式接收
  • 2 串行外设接口 SPI
    • 2.1 标准的四线SPI接口
    • 2.2 SPI的四种模式
    • 2.3 配置
    • 2.4 发送和接收
      • Master向Slave传输数据
      • Slave向Master传输数据
      • 液晶屏接口
  • 3 I2C总线接口 I2C
    • 3.1 通信时序解析
    • 3.2 寻址及其示例
    • 3 3通信速率
    • 3.4 传送和接收 读写数据

这节我们讲串行通信方式UART,SPI,I2C

先来看一下常见的通信方式分类方法

串行or并行?

​ 串行通信 一次只能发送一位,要发送8次才能发送一个字节。

​ 并行通信 通信时数据的各个位同时传送,可以实现字节为单位通信,但是通信线多占用资源多,成本高。

**同步or异步? **

​ 同步通信:所有设备使用一个共同的时钟信号,发送和接收双方严格按照该时钟信号处理数据的发送和接收。同步通信的优点是数据传输速率高,缺点是要求发送时钟和接收时钟保持严格同步。 SPI和I2C属于同步通信。

​ 异步通信:异步通信中,每个设备都有自己的时钟信号,通信双方的时钟频率保持一致。异步通信以字符为单位进行数据传送,每一个字符均按照固定的格式传送,被称为帧,即串行异步通信一次传送一个帧。UART属于串行异步通信

0 串口通信协议

串口通信

​ 串口通信,顾名思义也就是利用串行接口进行通信。串口通信和串行通信的区别在于:串行通信是一种概念,串口通信是一种是实现串行通信的具体的通信手段。

​ 串口通信连接包括两根线,发送和接受双方交叉连接

​ 一个RXD(Receive Data,RXD),表示接收数据

​ 一个TXD(Transmit Data,RXD),表示发送数据

在这里插入图片描述

1 通用异步收发传输器 UART

串行通信,异步通信,既可以半双工也可以全双工

那么实际传输过程中,串口通信是一帧一帧组成的。每一帧数据由起始位(低电平)、数据位、奇偶校验位(可选)、停止位(高电平)组成

1.1 串口配置

而通信前,需要进行配置协商,需要配置的量有

​ 串口号

​ 波特率:波特率必须一致,是传输速率,每秒传多少码元

​ 数据位:设置数据位有几位

​ 停止位:设置停止位几位

​ 校验位:设置是否有校验位

​ 流控制

这里有一个概念,叫做波特率

波特率 vs 比特率

• 波特率表示每秒钟传送的码元符号的个数,它用单位时间内载波调制状态改变的次数来表示。单位:码元/s,所以它与比特率是不同的概念

• 比特率表示每秒钟通过信道传输的信息量,也就是每秒钟传送的二进制位数。 单位:bit/s、比特/秒

• 不同的调制方法可在一个码元上负载多个比特信息。比特率=波特率*单个调制状态对应的二进制位数

• 对于二进制的信号,码元速率和信息速率在数值上是相等的。 因此,对于串口来说,比特率=波特率

• 但要注意:这里的比特率并不是应用层的有效数据传输率,因为开始位、停止位、校验位占了开销。

1.2 串口初始化

1 时钟速率配置

时钟控制命令寄存器CLKCONCMD

在这里插入图片描述

举例

CLKCONCMD &=0x80; //时钟频率为32MHZ

使用UART之前的引脚配置步骤

2 功能选项位置配置

使用寄存器PERCFG

在这里插入图片描述

举例

PERCFG=0x00;

3 使能引脚的外设功能 -USART功能

P0SEL寄存器

在这里插入图片描述

4 确定多功能的优先级

P2DIR寄存器

在这里插入图片描述

P2DIR&= ~0XC0; //P0优先作为串口0

5 使能USARTx的UART模式

U0CSR寄存器 //UART模式

在这里插入图片描述

U0GCR寄存器 //baud_e

在这里插入图片描述

U0CSR |= 0x80; //UART模式

U0GCR |= 10; //baud_e

没有用到U0UCR

6 波特率设置

U0BAUD寄存器

在这里插入图片描述

7 初始化中断标志位

UTX0IF寄存器

8 使能总中断

1 确定PIN

2 使能引脚外设功能

3 确定功能选项位置,确定多功能的优先级(可选)

4 使能USARTx的UART模式

寄存器USARTx

寄存器UxCSR

UxGCR

1.3 串口发送和接收方式

1.3.1 轮询方式发送

if(UartState == UART0_TX)              //发送状态 
        {                         
            U0CSR &= ~0x40;                    //禁止接收 
            UartSendString(RxData, count);     //发送已记录的字符串。
            U0CSR |= 0x40;                     //允许接收 
            UartState = UART0_RX;              //恢复到接收状态 
            count = 0;                         //计数清0
            memset(RxData, 0, SIZE);           //清空接收缓冲区
        }    

1.3.2 中断方式发送

每个USART都有两个中断:

– 发送数据完成中断(URXxIF)

– 接收数据完成中断(UTXxIF)。

IEN2 |=0x04;  //开USART0发送中断

#pragma vector = UTX0_VECTOR
__interrupt void UART0TX_ISR(void)
{
	txNext=1 ; 
	UTX0IF = 0; //清中断标志
}

1.3.3 查询方式接收

        if(UartState == UART0_RX)              //接收状态 
        { 
          while(URX0IF==0);
          URX0IF=0;
          RxBuf = U0DBUF;  
          if(RxBuf != 0) 
          {                 
                if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符            
                    RxData[count++] = RxBuf; 
                else
                {
                    if(count >= 50)             //判断数据合法性,防止溢出
                    {
                        count = 0;              //计数清0
                        memset(RxData, 0, SIZE);//清空接收缓冲区
                    }
                    else
                        UartState = UART0_TX;  //进入发送状态 
                }
                RxBuf  = 0;
          }
        }

1.3.4 中断方式接收

IEN0 |=0x84;  //开接收中断

#pragma vector = URX0_VECTOR
__interrupt void UART0RX_ISR(void)
{
 RxBuf = U0DBUF; //取出接收到字节
 URX0IF = 0; //清中断标志
}

2 串行外设接口 SPI

串行通信,全双工,同步通信

2.1 标准的四线SPI接口

UART只有两根线,而SPI要四根线

– SSEL:片选,也写做SSN,从设备片选使能信号。
– SCLK:时钟,也写作SCK,由主机产生,和SCL类似
– MOSI:主机输出从机输入,Master Output/Slave Input,主机给从机发送指令或
者数据的通道。
– MISO:主机输入从机输出,Master Input/Slave Output,主机读取从机的状态或
者数据的通道

Master-Slave

– SPI通信的参与方中只有一端提供时钟,称为Master,其他为Slave

– SPI通信可以一个Master,多个Slave, 通过片选信号选择当前通信的Slave设备

2.2 SPI的四种模式

CPOL:时钟极性,CPOL=1,表示空闲状态为高电平,CPOL=0,表示空闲状态为低电平,就是不处于发送状态的时候是什么电平

CPHA:时钟相位,CPHA=1 表示数据的输出是在第一个时钟周期的第一个沿,CPHA=0,表示数据的采样是在第一个时钟周期的第一个沿

数据的输出和数据的采样的区别

就是这样的

首先数据传输的时候肯定会有一个发送方(主机)和一个接收方(从机)

他们(发送方和接收方)俩在我们这门课里是通过一条线相连的

发送方一个比特一个比特的发送,发送1 的时候将线上的电平置位高电平,发送0 的时候将线上的电平置位低电平(也就是我们的数据输出,数据输出可以理解为将电线上电平进行调整的过程)

接收方一个比特一个比特的接收(也就是我们的数据采样,数据采样就可以理解为接收方获得线上此时的电平高低,高电平则收到1,低电平则收到0

2.3 配置

1 引脚配置

• Slave模式中,四条线都配置为外设功能

• Master模式中,MOSI, MISO, and SCK配置为外设功能,SSN配置为GPIO功能(output)

寄存器PERCFG

PxSEL

PxDIR

2 配置SPI时钟的波特率

在UxBAUD中配置BAUD_M

在U型GCR中配置BAUD_E

3 配置SPI的 Master或SPI Slave模式

用UxCSR寄存器

4 配置时钟极性、时钟相位、Bit顺序

UxGCR.CPHA和UxGCR.CPOL

2.4 发送和接收

Master向Slave传输数据

比如 CC2530向液晶屏传输信息

Slave向Master传输数据

比如外界向CC2530传输信息

液晶屏接口

SPI液晶屏是典型应用

3 I2C总线接口 I2C

需要两线式 串行总线,可以发送和接收数据

从应用上来讲,UART通信多用于板间通信,I2C多用于板内通行

I2C总线组成线与的关系,任何一个器件都可以拉低电平

I2C总线可以并联多个器件

I2C总线有起始信号,数据传输和停止信号

3.1 通信时序解析

起始信号 SCL为高电平期间,SDA由高电平向低电平变化时产生一个下降沿

数据传输 MSB first,SCL是低电平,才可以改变数据线SDA,输出要发送的数据的一位,SCL在高电平的时候,SDA绝对不可以变化,每个字节跟了一个应答位(拉低SDA即输出“0”)

停止信号 SCL为高电平期间,SDA由低电平向高电平变化产生一个上升沿

3.2 寻址及其示例

发送方:7位地址+1位读写位,其中高四位是厂商固定设备ID,低三位取决于具体电路设计,最后1位代表是读0还是写1

接收方:回应一个ACK

3 3通信速率

I2C通信分为低速模式100kbit/s、快速模式400kbit/s和高速模式3.4Mbit/s。

3.4 传送和接收 读写数据

单字节读,多字节读

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[python]gym安装报错ERROR: Failed building wheel for box2d-py

报错截图&#xff1a; box2d是一个游戏领域的2D图形C引擎&#xff0c;用来模拟2D刚体物体运动和碰撞。 swig是一个将c/c代码封装为Python库的工具&#xff08;是Python调用c/c库的一种常见手段&#xff09;&#xff0c;所以在运行时box2d会依赖到swig。而swig并不是一个python库…

C#,简单选择排序算法(Simple Select Sort)的源代码与数据可视化

排序算法是编程的基础。 常见的四种排序算法是&#xff1a;简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显&#xff0c;一般使用递归方式实现&#xff0c;但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。本文搜集发布四种算法…

港口车路协同系统方案

目前&#xff0c;国内自动驾驶应用的两种主流路线是单车智能、单车智能V2X。国内多数港口仍采用4G通信技术&#xff0c;单车智能在港口应用的稳定性较差&#xff0c;比如可能受到金属集装箱干扰及移动通信速率不稳定的影响。单车智能V2X将降低对通信速率的要求&#xff0c;可以…

【BCC动态跟踪PostgreSQL】

BPF Compiler Collection (BCC)是基于eBPF的Linux内核分析、跟踪、网络监控工具。其源码存放于GitCode - 开发者的代码家园 想要监控PostgreSQL数据库的相关SQL需要在编译PostgreSQL的时候开启dtrace。下文主要介绍几个和PostgreSQL相关的工具,其他工具可根据需求自行了解。 …

移动通信原理与关键技术学习(第四代蜂窝移动通信系统)

前言&#xff1a;LTE 标准于2008 年底完成了第一个版本3GPP Release 8的制定工作。另一方面&#xff0c;ITU 于2007 年召开了世界无线电会议WRC07&#xff0c;开始了B3G 频谱的分配&#xff0c;并于2008 年完成了IMT-2000&#xff08;即3G&#xff09;系统的演进——IMT-Advanc…

Leetcode 剑指 Offer II 060. 前 K 个高频元素

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数组 nums 和一个整数 k &#xff0c;请返回其中出现…

缘分的计算

题目描述&#xff1a; 缘分是一个外国人难以理解的中文名词。大致说来&#xff0c;缘分是一种冥冥中将两人&#xff08;通常是情人&#xff09;结合的力量。仅管这是种迷信&#xff0c;很多人——特别是女生——喜欢去计算它。 不幸的是&#xff0c;644 也是这样。有天&#x…

【linux笔记】top、ps

【linux笔记】top命令 top&#xff08;Table of process&#xff09;是动态变化的。而ps是静态的。 PID — 进程id USER — 进程所有者 PR — 进程优先级 NI — nice值。负值表示高优先级&#xff0c;正值表示低优先级 VIRT — 进程使用的虚拟内存总量&#xff0c;单位kb。VI…

二叉树的最大深度,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 快速理解题解小建议&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 解题方法分析&#xff1a; 方法1后序遍历&#xff08;DFS&#xff09; 解题分析&#xff1a; 解题思路&#xff1…

启动 Mac 时显示闪烁的问号

启动 Mac 时显示闪烁的问号 如果启动时在 Mac 屏幕上看到闪烁的问号&#xff0c;这意味着你的 Mac 无法找到自身的系统软件。 如果 Mac 启动时出现闪烁的问号且无法继续启动&#xff0c;请尝试以下步骤。 1.通过按住其电源按钮几秒钟来关闭 Mac。 2.按一下电源按钮&#xf…

强化学习5——动态规划初探

动态规划具体指的是在某些复杂问题中&#xff0c;将问题转化为若干个子问题&#xff0c;并在求解每个子问题的过程中保存已经求解的结果&#xff0c;以便后续使用。实际上动态规划更像是一种通用的思路&#xff0c;而不是具体某个算法。 在强化学习中&#xff0c;被用于求解值函…

华为MDC610接口说明

1、MDC610对外功能接口 2、1、MDC610硬件技术规格

前端插件库-VUE3 使用 vue-codemirror 插件

VUE3 插件 vue-codemirror 使用步骤和实例、基于 CodeMirror &#xff0c;适用于 Vue 的 Web 代码编辑器。 第一步&#xff1a;安装 vue-codemirror & codemirror 包 &#xff0c; 以及语言包 npm install codemirror --save npm install vue-codemirror --savenpm insta…

Linux第13步_安装“vim编辑器”及应用介绍

学习“磁盘重新分区”后&#xff0c;嵌入式Linux系统环境搭建进入安装“vim编辑器”这个环节。vim编辑器可以用来修改文件&#xff0c;在后期使用中&#xff0c;会经常用到。 1、安装“vim编辑器” 输入“sudo apt-get install vim回车”&#xff0c;就可以执行安装“vim编辑…

SpringIOC之support模块ContextTypeMatchClassLoader

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

【Bootstrap学习 day11】

Bootstrap5字体图标 字体图标是在Web项目中使用的图标字体。 使用字体图标的好处是&#xff0c;可以通过应用CSS color属性来创建任何颜色的图标。此外&#xff0c;要更改图标的大小&#xff0c;只需使用CSS font-size属性即可。 获取字体图标 在网页中包含Bootstrap5图标的最…

opencv图像金字塔

下采样&#xff1a; #include <opencv2/opencv.hpp> #include <iostream>int main() {// 读取图像cv::Mat src cv::imread("C:/Users/10623/Pictures/adf4d0d56444414cbeb809f0933b9214.png");if (src.empty()) {std::cout << "无法加载图像…

【非关系型数据库】Redis概述及安装、命令使用

目录 前瞻 关系型数据库 非关系型数据库 关系型数据库和非关系型数据库区别 数据存储方式不同 扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 总结 Redis简介 什么是Redis Redis具有的优点 Redis使用场景 哪些数据适合放入缓存中&#xff1f; Redis为什…

nodejs01

nodejs作用 Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境&#xff0c;允许开发人员在浏览器之外编写命令行工具和服务器端脚本. 是javascript的一个运行环境&#xff0c;&#xff0c;&#xff0c; nodejs stream 是前端工程化的基础 nodejs可以作为中间层&…

南金研小巧的CAN总线记录仪在冬测中的使用

南金研小巧的CAN总线记录仪在冬测中的使用&#xff1a; 在这里插入图片描述 1.确定需求&#xff1a;在开始使用前&#xff0c;需要明确冬测的具体需求&#xff0c;例如需要记录的CAN总线数据类型、采样率、存储容量等。 2.连接硬件&#xff1a;将小巧的CAN总线记录仪与需要进行…