当前位置: 首页 > article >正文

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)


http://www.kler.cn/a/519435.html

相关文章:

  • PyCharm接入DeepSeek实现AI编程
  • Synology 群辉NAS安装(4)docker-compose
  • HTML从入门到精通:链接与图像标签全解析
  • Unity|小游戏复刻|见缝插针1(C#)
  • 【Uniapp-Vue3】动态设置页面导航条的样式
  • Sourcetree:一款高效便捷的Git版本控制客户端
  • 【贪心算法】在有盾牌的情况下能通过每轮伤害的最小值(亚马逊笔试题)
  • Java设计模式 二十六 工厂模式 + 单例模式
  • [ Spring ] Spring Cloud Alibaba Message Stream Binder for RocketMQ 2025
  • 我谈区域偏心率
  • 【Android】乱七八糟的小结
  • 健身房项目 Uniapp+若依Vue3版搭建!!
  • gtest with ros
  • Qwen2-VL:在任何分辨率下增强视觉语言模型对世界的感知 (大型视觉模型 核心技术 分享)
  • AutoMapper的使用
  • stm8s单片机(三)时钟系统与时钟切换
  • 【工具】CountUp.js
  • 国产编辑器EverEdit - 目录树
  • SSH代理實用指南
  • 【Matlab高端绘图SCI绘图模板】第003期 绘制面积填充图
  • 【AI非常道】二零二五年一月,AI非常道
  • 数据结构——概念与时间空间复杂度
  • 【Java】面试中遇到的两个排序
  • 策略模式 - 策略模式的使用
  • 【Leetcode刷题记录】18.四数之和
  • HTML5和CSS3拔高