嵌入式经典通信协议_嵌入式通信协议,2024年最新15个经典面试问题及回答思路

47 阅读5分钟
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),接下将进一步说明这几种信号。


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f2f566e88fca47138ce5fc85ed3637ee~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251813&x-signature=6V%2F1TKrsVIqA871qZBmizh5%2FX3k%3D)


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


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/94d42a3ce9414d8fa977c8797b95a221~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251813&x-signature=NDVYbuaT9ZApkDdg6GOpYzoUaxA%3D)



//产生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。数据信号可由主机或从机发出。


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/cc2b788de55d415592631df1c93ed498~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251813&x-signature=m9JglPhIHTYCwHb9HhcdkgndoCk%3D)



//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)。


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/08f56a132cae4b98b7512df43eec17f9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251813&x-signature=0r7ipHpmHdMRaVcclMW%2Bb%2FMyGFI%3D)



//产生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。


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a62d7fa0a0ba4a0eb7dc7bc0557819e6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251813&x-signature=YIA5JQXH4izFO1KYzYnTtj%2FG5bc%3D)



//产生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由低电平被释放(拉高)。由主机发出。


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/ad7d56edaff24eef9e8859b31c358639~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251813&x-signature=fST1LQCLI7IOVlILeFLE8eItVlU%3D)



//产生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




![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/07498ae65c274b559c3f933c695c5de5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251813&x-signature=B%2B21Zt7YtUmXQir1Ml4wql6akj8%3D)
![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/12db27460fa441a79f8a61fc0c1f0fd6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251813&x-signature=md1saimyYRjvO0zq1XUgJZXldHA%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**