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)

相关推荐
欢乐熊嵌入式编程1 小时前
智能手表项目的《项目背景与目标说明书》样本文档
嵌入式硬件·目标跟踪·规格说明书·智能手表
海尔辛2 小时前
学习黑客BitLocker与TPM详解
stm32·单片机·学习
上海合宙LuatOS3 小时前
全栈工程师实战手册:LuatOS日志系统开发指南!
java·开发语言·单片机·嵌入式硬件·物联网·php·硬件工程
公子无缘3 小时前
【嵌入式】记一次解决VScode+PlatformIO安装卡死的经历
vscode·stm32·单片机·mcu·platformio
昊昊昊昊昊明3 小时前
十天学会嵌入式技术之51单片机—day-9
单片机·嵌入式硬件·51单片机
欢乐熊嵌入式编程4 小时前
智能手表蓝牙 GATT 通讯协议文档
嵌入式硬件·目标跟踪·规格说明书·智能手表
whaosoft-1434 小时前
51c嵌入式~电路~合集27
嵌入式硬件
Camellia03114 小时前
嵌入式学习--江协51单片机day5
嵌入式硬件·学习·51单片机
7yewh5 小时前
FPGA前瞻篇-计数器设计与实现实例
arm开发·驱动开发·嵌入式硬件·fpga开发·硬件架构·硬件工程·精益工程
小石(努力版)8 小时前
嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐
stm32·单片机·学习