iic、spi以及uart

何为总线?

连接多个部件的信息传输线,是部件共享的传输介质

总线的作用?

实现数据传输,即模块之间的通信

总线如何分类?

根据总线连接的外设属于内部外设还是外部外设将总线可以分为片内总线和片外总线

可分为数据按位顺序传输占用引脚较少但是速度相对较慢的串行通信 和 数据各个位同时传输,速度较快但是占用引脚资源多的并行传输

又根据收发数据根据对时钟信号的依赖关系区分为同步通信 和 异步通信

根据数据的传输方向性,又将通信可区分为 单工,半双工 和双 工,

其中UART是串行全双工异步通信、IIC是串行半双工同步通信、spi是串行全双工同步通信。


UART(Universal asynchronous receiver/transmitter\通用异步接收发送器)

串口用于两个模块之间进行异步全双工串行通信

将TXD和RXD交叉连接,然后将接地线接地(TXD数据发送线,RXD数据接收线)

TTL电平3.3\5逻辑1,接地逻辑0

特点:易被干扰源干扰,抗干扰能力弱,一般只适用于同一块板子上面的两个芯片之间尽心数据收发

关于串口的配置:

1.设置8bit数据位

2.设置无校验位

3.设置1bit停止位

4.设置波特率为115200

5.设置16倍过采样

6.使能发送器 TE

7.使能接收器 RE

8.使能串口 UE

9.发送数据:

判断发送数据寄存器是否为空 TXE==1

为空则向发送数据寄存器写入,不为空则等待

等待发送完成TC==1,此时发送结束

10.接收数据 :

判断接收数据寄存器不为空 RXNE==1

不为空可以读取

使用流程:

1.使能UART外设时钟和对应的GPIO口的时钟

2.功能复用,将对应的GPIO口复用为串口功能

3.禁用串口

4.设置数据帧格式(8N1)

5.设置分频、采样、波特率(注:采样常用的是16倍过采样)

6.使能发送器

7.使能接收器

8.使能串口(与第三步交相呼应)

UART相关的 HAL库函数

HAL_StatusTypeDef **HAL_UART_Receive(**UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

注:

两个函数均会阻塞

串口进行数据打印需要将printf函数重映射(重写fputc)


IIC(i2c)

最大支持多主机多从机通信

SDA&SCL,多从机并联入双线,双线空闲保持高电平,需要接上拉电阻

信号分类:起始信号、终止信号、应答信号、非应答信号、数据接收和发送信号

注:起始信号终止信号均由主机发起

IIC数据格式

具体格式都是由各个传感器各自的协议去制定格式,但是大致流程基本相同

起始信号 -7位从机地址为加写标志位-(应答/非应答)-8位从机寄存器地址-8位数据-(应答\非应答)- 结束信号

起始信号 -7位从机地址为加写标志位-(应答/非应答)-8位从机寄存器地址-起始信号-7位从机地址加读标志位-(应答/非应答)-数据-(应答\非应答)- 结束信号

通信速率为100k、400k、1M和3.4M

使用流程:

1.使能对应的端口时钟

2.设置管脚(输出模式,输出速度,上拉下拉电阻)

3.SDA&SCL双线拉高空闲

4.信号函数的封装(一般直接down,会封装就更nice了)

5.信号函数的调用

注:重难点在对对应传感器手册的查询

IIC相关的HAL库函数

HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)


SPI(Serial Peripheral interface)串行外围设备接口

最大支持一主机多从机

是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

不再采用具体的数据格式,而是采用具体的通信规则

通过约定好的通信时钟极性和时钟相性去使数据线进行对应的数据的采集和数据的输出

使用流程

更加依赖被控制的芯片的手册,比如控制数码灯的各类三八译码器或者是控制OLED屏时相关OLED屏的数据手册

SPI相关的HAL库函数

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

相关推荐
charlie11451419111 分钟前
嵌入式MCU面试笔记2
笔记·单片机·嵌入式硬件·面试·串口通信·uart
云山工作室37 分钟前
基于单片机的智能小区门禁系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
漫无目的行走的月亮2 小时前
51单片机开发:矩阵按键实验
单片机·嵌入式硬件·51单片机
gyeolhada4 小时前
计算机组成原理(计算机系统3)--实验五:处理器结构实验二
stm32·单片机
简知圈5 小时前
03-画P封装(制作2D+添加3D)
笔记·stm32·单片机·学习·pcb工艺
LS_learner5 小时前
MAX98357A一款数字脉冲编码调制(PCM)输入D类音频功率放大器
嵌入式硬件
Uitwaaien5411 小时前
51单片机——串口向电脑发送数据
单片机·嵌入式硬件·51单片机
BreezeJuvenile14 小时前
STM32调试手段:重定向printf串口
stm32·单片机·串口·printf重定向
2401_8437852315 小时前
STM32 流水灯与跑马灯的实现
stm32·单片机·嵌入式硬件
风行男孩19 小时前
使用MQTT.fx向阿里云物理网平台上报物理模型数据
单片机·物联网·阿里云