嵌入式系统(五)通信协议
Published in:2023-12-06 | category: 嵌入式系统

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

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

串行or并行?

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

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

**同步or异步? **

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

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

0 串口通信协议

串口通信

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

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

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

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

image-20240106103135169

1 通用异步收发传输器 UART

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

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

1.1 串口配置

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

​ 串口号

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

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

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

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

​ 流控制

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

波特率 vs 比特率

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

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

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

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

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

1.2 串口初始化

1 时钟速率配置

时钟控制命令寄存器CLKCONCMD

image-20231009143452186

举例

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

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

2 功能选项位置配置

使用寄存器PERCFG

image-20231009143715239

举例

1
PERCFG=0x00;

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

P0SEL寄存器

image-20231009144625957

4 确定多功能的优先级

P2DIR寄存器

image-20231009144444119

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

5 使能USARTx的UART模式

U0CSR寄存器 //UART模式

image-20231021221049756

U0GCR寄存器 //baud_e

image-20231021220750715

U0CSR |= 0x80; //UART模式

U0GCR |= 10; //baud_e

没有用到U0UCR

6 波特率设置

U0BAUD寄存器

image-20231009144900868

7 初始化中断标志位

UTX0IF寄存器

8 使能总中断

1 确定PIN

2 使能引脚外设功能

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

4 使能USARTx的UART模式

寄存器USARTx

寄存器UxCSR

UxGCR

1.3 串口发送和接收方式

1.3.1 轮询方式发送

1
2
3
4
5
6
7
8
9
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)。

1
2
3
4
5
6
7
8
IEN2 |=0x04;  //开USART0发送中断

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

1.3.3 查询方式接收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 中断方式接收

1
2
3
4
5
6
7
8
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位代表是读1还是写0

接收方:回应一个ACK

3 3通信速率

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

3.4 传送和接收 读写数据

单字节读,多字节读

Prev:
数据库系统(六)数据库规范
Next:
数据库系统(五)数据库设计