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)

相关推荐
蓑衣客VS索尼克8 小时前
单片机中的基础外设GPIO的知识和应用—(6)
笔记·stm32·单片机·嵌入式硬件
云山工作室10 小时前
基于单片机的智慧农业大棚系统(论文+源码)
单片机·嵌入式硬件
柒十三.11 小时前
江科大51单片机笔记【10】蜂鸣器(上)
笔记·嵌入式硬件·51单片机
zephyr_zeng12 小时前
VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置
c语言·c++·vscode·stm32·单片机·嵌入式硬件·编辑器
鹿屿二向箔12 小时前
72MHz的MCU能支持多大频率的传感器数据采样率?
服务器·网络·单片机
美好的事情总会发生13 小时前
SDIO(Secure Digital Input Output)详解
linux·嵌入式硬件·硬件工程
柒月玖.13 小时前
基于AT89C51单片机的家用全自动洗衣机设计
单片机·嵌入式硬件
Moonnnn.14 小时前
51单片机——程序执行过程(手工汇编)
汇编·笔记·嵌入式硬件·学习·51单片机
派阿喵搞电子15 小时前
STM32的APB1和APB2的区别
stm32·单片机·嵌入式硬件
Archie_IT17 小时前
江协科技/江科大-51单片机入门教程——P[5-1] 模块化编程 & P[5-2] LCD1602调试工具
单片机·嵌入式硬件·mcu·51单片机