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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式经典通信协议 -> 正文阅读

[嵌入式]嵌入式经典通信协议

嵌入式经典通信协议

USART/UART、IIC、SPI是嵌入式开发常用的几种通信协议,下面将对这几种协议做详细的介绍。

1.USART/UART

USART/UART均为常见的串口通信协议,前者(Universal synchronous asynchronous receiver transmitter 简称)是同步和异步收发器 ,后者(Universal asynchronous receiver transmitter 简称)是异步收发器。所以这里需要简单介绍一下同步通信与异步通信的区别,下图是一个8位字长,1个停止位的一个帧数据,其实每个数据帧之间存在“空闲位”。何为“空闲位”呢?即连续的高电平,而同步和异步是根据高电平持续的时长进行区分,若每个数据帧之间的空闲位时长相同则为同步,反之则为异步。根据上面的介绍,主机设备与从设备的收发同步方式也有区别,异步通信通过传送字符内的起始位来进行同步,而同步通信采用共用外部时钟来进行同步。

在这里插入图片描述

根据上图可知道串口通信的数据帧,包含起始位、数据位、校验位、以及停止位,在进行串口通信驱动程序编写时,需要了解这几个参数:波特率、停止位、数据位和校验位。

波特率:在串口通信中表示每秒钟传送的二进制码元的个数,单位是波特(Baud,symbol/s),例如波特率为115200时,表示串口每秒传送115200个bit的数据量。所以传送1个bit的时间等于1/115200秒,大约8.68us

起始位:起始位一般为1位,即维持一个比特的低电平。

数据位:可以设置为5至9位,根据传输数据决定,如果传输的内容为ASCII码,无校验位时,数据位设为8位。。

校验位:有无校验、偶检验和奇校验。主要统计数位比特为1的个数,这个只能进行一定范围内的检错,不能纠错。

停止位:支持多种停止位的配置:0.5、1、1.5和2个停止位。1个停止位:停止位位数的默认值;2个停止位:可用于常规USART模式、单线模式以及调制解调器模式;0.5个停止位:在智能卡模式下接收数据时使用;1.5个停止位:在智能卡模式下发送和接收数据时使用。

/***********************************************************************************
STM32F1 USART初始化程序
8位字长、一位停止位、无奇偶校验
bound:波特率
************************************************************************************/
void uart_init(u32 bound){
  //GPIO端口设置
  	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
  
	//USART1_TX   GPIOA.9
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  	//USART1_RX	  GPIOA.10初始化
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  	//Usart1 NVIC 配置
  	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

 	USART_Init(USART1, &USART_InitStructure); //初始化串口1
 	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  	USART_Cmd(USART1, ENABLE);                    //使能串口1 
}

/***********************************************************************************
STM32F1 USART1中断服务函数
************************************************************************************/
void USART1_IRQHandler(void)                	//串口1中断服务程序
{
    unsigned char USART1_Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		USART1_Res =USART_ReceiveData(USART1);	//读取接收到的数据		
}

2.IIC

IIC总线(Inter-Integrated Circuit)即集成电路总线,包含SDA(数据线)和SCL(时钟线),是一种简单、双向、二线制、同步串行总线。IIC总线是一个多向控制总线,多个器件(从机)可以同时挂载到一个主机控制的一条总线上。每个连接在总线上的设备都是通过唯一的地址和其他器件通信,主机和从机的角色可互换,可以根据谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备 。主机就是负责整个系统的任务协调与分配,从机一般是通过接收主机的指令从而完成某些特定的任务,主机和从机之间通过总线连接,进行数据通讯。IIC的时序简化图如下,主要包含空闲段、启动信号(START)、数据位传输(DATA)、应答信号(ACK)、非应答信号(NACK)和停止信号(STOP),接下将进一步说明这几种信号。

在这里插入图片描述

启动信号(START):在SCL保持高电平期间,SDA由高电平被拉低。由主机发出。

在这里插入图片描述

//产生IIC起始信号
void MPU_IIC_Start(void)
{
	MPU_SDA_OUT();     	//配置SDA为输出模式
	MPU_IIC_SDA=1;	  	  
	MPU_IIC_SCL=1;
	MPU_IIC_Delay();
 	MPU_IIC_SDA=0;		//SDA拉低
	MPU_IIC_Delay();
	MPU_IIC_SCL=0;		//钳住I2C总线,准备发送或接收数据 
}	

数据位传输(DATA):在SCL保持高电平期间,SDA上的电平保持稳定,低电平为数据0、高电平为数据1。数据信号可由主机或从机发出。

在这里插入图片描述

//IIC发送一个字节		  
void MPU_IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	MPU_SDA_OUT(); 	    
	MPU_IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
		MPU_IIC_SDA=(txd&0x80)>>7;//SDA根据txd发送拉高/拉低
        txd<<=1; 	  
		MPU_IIC_SCL=1;						//SCL拉高
		MPU_IIC_Delay(); 					//保持2us
		MPU_IIC_SCL=0;						//SCL拉低
		MPU_IIC_Delay();
    }	 
} 

应答信号(ACK):在SCL保持高电平期间,SDA保持低电平。IIC总线上所有数据都是以8位字节传送的,发送器每发送一个字节,就在第9个时钟脉冲期间释放SDA(高电平),由接收机机反馈一个应答信号(ACK)。

在这里插入图片描述

//产生ACK应答	
void MPU_IIC_Ack(void)
{
	MPU_IIC_SCL=0;
	MPU_SDA_OUT();
	MPU_IIC_SDA=0;
	MPU_IIC_Delay();
	MPU_IIC_SCL=1;
	MPU_IIC_Delay();
	MPU_IIC_SCL=0;
}

非应答信号(NACK):在SCL保持高电平期间,SDA保持高电平。如果接收器是主机,则它在收到最后一个字节后,发送一个NACK,通知被控器结束数据发送,并释放SDA(高电平),以便主控器发送一个STOP。

在这里插入图片描述

//产生NACK非应答		    
void MPU_IIC_NAck(void)
{
	MPU_IIC_SCL=0;
	MPU_SDA_OUT();
	MPU_IIC_SDA=1;
	MPU_IIC_Delay();
	MPU_IIC_SCL=1;
	MPU_IIC_Delay();
	MPU_IIC_SCL=0;
}	

停止信号(STOP):在SCL保持高电平时间,SDA由低电平被释放(拉高)。由主机发出。

在这里插入图片描述

//产生IIC停止信号
void MPU_IIC_Stop(void)
{
	MPU_SDA_OUT();//sda线输出
	MPU_IIC_SCL=0;
	MPU_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	MPU_IIC_Delay();
	MPU_IIC_SCL=1;  
	MPU_IIC_SDA=1;//发送I2C总线结束信号
	MPU_IIC_Delay();							   	
}

IIC是半双工的通信,在介绍完时序之后,接下就是向从机读数据和写数据的步骤了。

主机向从机写数据步骤

  1. 主机发起一个启动信号(START)。
  2. 主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。
  3. 从机产生应答信号(ACK)。
  4. 主机发送8bit从机寄存器地址。
  5. 从机产生应答信号(ACK)。
  6. 主机发送一个字节数据。
  7. 从机产生应答信号(ACK)。
  8. 主机发送一个停止信号(STOP)。

主机从从机读数据步骤

  1. 主机发送一个启动信号(START)。
  2. 主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。
  3. 从机产生一个应答信号(ACK)。
  4. 主机发送8bit从机寄存器地址。
  5. 从机产生一个应答信号。
  6. 主机再次发送一个启动信号(START)。
  7. 主机再次发送7bit从机地址+1bit读写选择位,1表示读、0表示写。
  8. 从机产生一个应答信号(START)。
  9. 主机读取一个字节数据。
  10. 主机产生一个非应答信号(NACK)。
  11. 主机产生一个停止信号(STOP)。

3.SPI

SPI是一种高速的,全双工,同步的通信总线,占用芯片的四个管脚:

  • SCK:时钟信号线,由主机产生发送给从机。

  • CS:片选信号线,由主机发送,用于选择与哪个从机通信。

  • MISO:主机输入,从机输出信号线。

  • MOSI:主机输出,从机输入信号线。

与IIC总线协议比较,SPI总线没有应答机制确认是否接收到数据,可靠性存在一定的缺陷,通信过程相较简单,如下图所示,首先主机将片选信号线拉低,在模式3工作条件下,如果主机需要向从机发送数据,主机会从SCK第一下降沿开始在每个下降沿将数据在MOSI信号线上一位一位的发送给从机;如果主机需要从从机接收数据,主机会生成预定数量的时钟信号,从SCK第一个上升沿开始在每一个上升沿将数据从MISO信号线上一位一位的读取。

在这里插入图片描述

SPI有四种工作模式,可以由CPOL(时钟极性)和CPHA(时钟相位)配置

①CPOL = 0,CPHA = 0:空闲时SCLK为低电平,在第一个边沿开始采样。

②CPOL = 0,CPHA = 1:空闲时SCLK为低电平,在第二个边沿开始采样。

③CPOL = 1,CPHA = 0:空闲时SCLK为高电平,在第一个边沿开始采样。

④CPOL = 1,CPHA = 1:空闲时SCLK为高电平,在第二个边沿开始采样。

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:39:38  更:2022-07-17 16:43:10 
 
开发: 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/25 22:43:41-

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