UART、I2C、SPI接口常见面试问题总结

2023-05-16

UART

定义:Universal Asynchronous Receiver/Transmitter - 通用异步收发传输器。

特点:速率不快、可全双工、结构上一般由波特率产生器、UART发送器、UART接收器组成,硬件2-3线。

线:RXD,TXD,GND,半双工的话就两根(地线必须有)。

空闲位

UART协议规定,当总线处于空闲状态时信号线的状态为高电平。

起始位

开始进行数据传输时发送方要先发出一个低电平来表示传输字符的开始(与空闲位相反)。

数据位

数据可以是5、6、7、8、9位,一般为8位,先发送最低位。

奇偶校验位

串口校验分为几种方式:

1.无校验(no parity)。

2.奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,反之为“0”。

3.偶校验(even parity):如果数据位中“1”的数目是偶数,则校验位为“0”,反之为“1”。

4.mark parity:校验位始终为1。

5.space parity:校验位始终为0。

停止位

数据结束标志,可以是1、1.5、2位的高电平。

即可设置的有数据位校验位停止位

波特率

数据传输速率使用波特率来表示,单位bps,如果串口波特率为9600bps,那么传输一个比特需要的时间是1/9600≈104.2us。


I2C

定义:Inter-Integrated Circuit - 集成电路总线。

特点:双向、双线、串行、多主控接口标准、速率不快、半双工、同步接口、具有总线仲裁机制。非常适用于器件之间近距离经常性数据通信,可实现设备组网。

线:SCL、SDA。

起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 

结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

写操作

主机发送起始信号后发送I2C从机地址(7位)和写操作0(1位),主机等待从机发送ACK,收到ACK后主机发送从机寄存器地址(8位),接着继续等待ACK,等到ACK后主机发送要写入寄存器的数据。主机发送data,从机发送ACK,重复多次可顺序写入多个寄存器直至主机产生结束信号。

读操作(随机读)

主机发送起始信号后,继续发送从机地址和写操作0,主机等待从机发送ACK,收到ACK后主机发送从机寄存器地址,接着继续等待ACK,等到ACK后主机再次发起起始信号,然后发送从机地址和读操作1,并等待ACK,从机发送ACK之后接着发送指定寄存器里的数据,主机发送ACK表示收到,从机继续发送数据即顺序读取下一个寄存器。当主机希望停止接收数据时就返回一个非应答信号NACK,数据传输将结束。

总线仲裁机制

SDA线的仲裁是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致,是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失(因为仲裁结束之前各节点发送数据一致),总线系统通过仲裁只允许一个主节点可以继续占据总线。

最大从机数

由I2C地址决定,7位地址,2^7=128,但是0x00不用,所以理论上可以挂127个从机。但是,虽然I2C协议没有规定总线上设备的最大数目,但是规定了总线的电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制,实际设计中经验值大概是不超过8个器件。

上拉电阻作用

I2C的接口一般都是OD或者OC门,芯片内部无上拉电阻时,外部需要加上拉电阻才能输出高电平。


SPI

定义:Serial Peripheral Interface - 串行外设接口。

特点:同步、串行、高速、可全双工、可实现多个SPI设备互联、硬件2-4线。

线:MISO、MOSI、SCLK、CS。最少可以只用2根,单向通信的时候可以只使用一条数据线,只有一个从机的时候可以取消片选线。

传输模式

通过设置控制寄存器SPICR1中的CPOL和CPHA位,将SPI可以分成四种传输模式。

CPOL=0,表示当SCLK=0时处于空闲态,SCLK=1有效。

CPOL=1,表示当SCLK=1时处于空闲态,SCLK=0有效。

CPHA=0,表示数据采样是在第一个跳变沿,数据发送在第二个跳变沿。

CPHA=1,表示数据采样是在第二个跳变沿,数据发送在第一个跳变沿。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UART、I2C、SPI接口常见面试问题总结 的相关文章

  • SPI技术-JDK实现

    SPI是什么 SPI全称Service Provider Interface 是Java提供的一套用来被第三方实现或者扩展的API 它可以用来启用框架扩展和替换组件 Java SPI 实际上是 基于接口的编程 策略模式 配置文件 组合实现的
  • 【总线】I2C 通信协议

    目录 I2C 总线协议概述 参数总结 I2C 的工作原理 寻址 读 写位 数据帧 I2C数据传输的步骤 具有多个从机的单个主机 具有多个从机的多个主机 I2C的优缺点 优点 缺点 文章参考 I2C 总线协议概述 I2C 总线广泛应用在 OL
  • BH1750 传感器实战教学 —— 驱动移植篇

    前言 上一篇 BH1750 的实战教学我们说明的实际应用中传感器的硬件设计 BH1750 传感器实战教学 硬件设计篇 我们提到过在本次使用的芯片为 51 内核 I2C 通讯驱动实现与 STM32 上还是有很大区别的 对于我们来说 已经掌握了
  • 各种通信接口的简单对比

    对比表 同步方式与异步方式的主要区别在于 是否传输时钟信号 只要是通訊前雙方需要設定相同波特率的 都是異步傳輸方式 异步传输 Asynchronous Transmission 每次异步传输的信息都以一个起始位开头 它通知接收方数据已经到达
  • SPI菊花链原理和配置

    一 概述 在一个主机和多个从器件的典型 SPI 系统中 通常采用专门的片选信号来寻址从器件 随着从器件数量不断增加 片选线也随之增多 这种情况将给电路板布板带来很大的挑战 一个布板方法就是采用菊链结构 本文详细讲述了 SPI 系统的菊链配置
  • 搭建STM32F407的SPI-Flash(基于STM32CubeMX)

    网上有不少例子 都对 但对我来说碰到几个坑 避免以后再犯错 mark下 目标 通过SPI接口 对Nor Flash进行读写 开发板上Nor Flash 是W25Q128 128Mbit 也就是16MB样子 CubeMx端配置 配置要分两个
  • I2C接口

    I2C的结构和特点 他是一具有两条总线线路 即一条串行数据线SDA和一条串行时钟线SCL 每个连接到总线上的器件都可以通过唯一的地址联系主机 它是一个真正的多主机总线 数据传输通过冲突检测和仲裁防止数据被破坏 串行的8位双向数据传输位速率更
  • 尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误

    我遇到了问题 在启动通过 I2C 从 Arduino 请求数据的脚本时 python 有时会在我的 raspberry pi 3 上抛出这个 IOError 电气连接是完美的 所以这不是问题 此外 我在使用 i2cget y 1 0x04
  • 谁在驱动程序代码中调用“probe”函数?

    我试图理解thisomap2 panda 板的 mcspi 驱动程序代码 我不明白谁打电话probe函数以及调用链是什么this驱动代码 设备连接时如何通知驱动程序 探针函数由spi omap2 mcspi c保存在static struc
  • 如何在 QEMU x86 上模拟 i2c 设备?

    我正在研究 QEMU 1 5 1 6 但还没有看到任何在 i2c 总线上添加设备的文档 有人可以帮忙吗 Thanks 好吧 没人对这个问题感兴趣 我发布我自己的解决方案 由于 QEMU 不支持 I2C 总线级数据传输 因此在将多点触摸数据从
  • 为什么我只收到第一个地址字节? (I2C协议)

    期望从机确认并返回数据 但它没有 这是我的协议 这是我的数据表 数据表提到 从机将通过首先发送 MSB 字节来应答 Byte0 和 byte1 包含 预测值 所有字节均由主机确认 Edit 源库 另外仅供参考 我使用的是 Arduino F
  • 启用并测试 UART 的本地环回

    我正在尝试进行 UART 内部环回测试并提出以下更改 include
  • Gem5 中与 ARM 裸机的 UART 通信

    我目前正在使用 Gem5 我必须通过 UART 从我的主机访问 ARMv8 裸机选项 所以我尝试了很多方法 但我还没有准备好 您能否让我知道 如何在裸机类型编程中将主机的串行端口映射到 ARMv8 的串行端口 任何帮助 将不胜感激 工作设置
  • 在 U-Boot 中使用 I2C 读取多个字节

    我的 Freescale p1022tw 板的 I2C 驱动程序有问题 U Boot 的控制台上有一个从 I2C 设备读取的命令 i2c md chip address 0 1 2 of objects 当我从 id 为 0x60 地址为
  • ADXL345 与 ESP32 I2C 垃圾值问题

    我已根据以下教程使用 I2C 接口将 ESP32 与 ADXL345 连接起来Tutorial http www esp32learning com code esp32 and adxl345 sensor example php 但是
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 如何将 I2C 地址传递给 Adafruit CircuitPython 代码? (运行 ADS1115)

    我正在尝试使用两个 I2C 地址 0x48 0x49 在一个 Raspberry Pi 上运行两个 Adafruit ADS1115 每个设备的地址可以通过将 ADDR 引脚连接为高电平 0x49 或使其悬空 默认为 0x48 来设置 我已
  • 嵌入式Linux中UART上的9位协议

    我正在尝试在嵌入式 Linux 中的 UART 上强制使用 9 位协议 目前我正在 am335x evm 板上对此进行测试 我计划使用坚持平价来做到这一点 理想情况下 我希望不需要实际修改 omap serial c 驱动程序的任何代码 9
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 如何用 C 语言从串行(SPI)连接读取数据?

    我正在尝试编写一个程序 该程序将安装在 Linux MCU Raspberry Pi 上 该程序将读取从另一个 MCU 我将自己构建的自制程序 发送到它的串行数据 我研究了如何做到这一点 并认为我有 大局 但仍然缺少一些东西 其一 我需要启

随机推荐

  • Linux:启动sshd服务的时候提示错误Unsupported option UsePAM

    问题 分析 默认的configure 没有启用 with pam选项 xff0c 如果在sshd config配置文件里加入UsePAM no 就会导致上面的错误提示 UsePAM与ssh密码认证相关 xff0c 但公司服务器禁止通过密码认
  • Ubuntu: ssh升级后服务不稳定不断重启,查看sshd服务状态为activating(start)的解决办法

    现象 xff1a Ubuntu20 04 升级ssh7 4到8 1版本后 xff0c ssh连接不稳定 xff0c 时断时续 xff0c systemctl status sshd查看服务状态为activating start xff0c
  • Linux:grep命令检索文件内容详解

    前言 Linux系统中搜索 查找文件中的内容 xff0c 一般最常用的是grep命令 xff0c 另外还有egrep命令 xff0c 同时vi命令也支持文件内容检索 下面来一起看看Linux利用grep命令检索文件内容的详细介绍 方法如下
  • stm32零基础应该怎么入门?

    单片机 xff08 microcontrollers xff09 是一种集成电路芯片 xff0c 是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU 多种I O口和中断系统 定时器 计数器等功能集成到一块硅片上构成的一个小而完善
  • Linux:CPU频率调节模式以及降频方法简介

    概述 cpufreq的核心功能 xff0c 是通过调整CPU的电压和频率 xff0c 来兼顾系统的性能和功耗 在不需要高性能时 xff0c 降低电压和频率 xff0c 以降低功耗 xff1b 在需要高性能时 xff0c 提高电压和频率 xf
  • Linux:rsyslog 日志丢失 messages lost due to rate-limiting

    系统日志显示 cat var log messages Apr 7 16 20 01 ngnodeb rsyslogd imjournal 154664 messages lost due to rate limiting 解决方法 修改配
  • Linux:shell 中的单行注释和多行注释

    关于 shell 中的单行注释和多行注释 单行注释 众所周知 xff0c 使用 比如想要注释 echo 34 Hello World 34 root 64 test vim test sh echo 34 Hello World 34 多行
  • Shell三剑客之sed:修改 xml

    修改前 vim config xml lt config input type verify 61 34 bool 34 name 61 34 flow bypass class 34 visible 61 34 true 34 gt fa
  • STM32串口通信

    STM32串口通信 一 基于寄存器与基于固件库编写的差异二 stm32串口通信实战1 烧录方式2 代码及效果图 三 C语言程序里全局变量 局部变量 堆 栈等概念四 stm32的堆 栈 全局变量的分配地址 一 基于寄存器与基于固件库编写的差异
  • keil下的FreeRtos多任务程序

    keil下的Freertos多任务程序 1 手动移植FreeRtos xff08 以STM32F103为例 xff09 2 直接使用野火的模板 1 手动移植FreeRtos xff08 以STM32F103为例 xff09 用该链接下载Fr
  • 随笔小记(二十七)

    神经网络中Epoch Iteration Batchsize相关理解和说明 batchsize xff1a 中文翻译为批大小 xff08 批尺寸 xff09 简单点说 xff0c 批量大小将决定我们一次训练的样本数目 batch size将
  • 手把手教物体检测——EfficientDet

    目录 摘要 训练数据 1 下载Pytoch版的EfficientDet 2 制作数据集 3 下载EfficientNets预训练模型 4 安装模型需要的包 5 放置数据集 6 修改train py中的参数 测试 注意 摘要 谷歌大脑团队 Q
  • 简化的围棋棋子规则(C++实现)

    题目 xff1a 输入棋盘 xff1a 1 1 2 3 2 3 3 3 2 3 3 3 2 2 2 3 3 3 1 2 2 2 3 3 2 1 1 2 3 1 其中1代表空 xff0c 2代表白子 xff0c 3代表黑子 xff09 输出
  • MATLAB中将图像转换为二值图像im2bw

    在MATLAB中将图像转换为二值图像 xff0c 主要运用im2bw函数 xff0c 涉及到一个灰度门槛的数值 对于灰度图像 bw 61 im2bw I level level空着的话 xff0c 默认是0 5 level一般使用grayt
  • Ubuntu 20.04 Gazebo安装 及模型库下载

    安装参考自官方教程noetic版本 xff0c 为了安装模型库 xff0c 就一起编辑了 1 设置你的电脑来接收软件 sudo sh c 39 echo 34 deb http packages osrfoundation org gaze
  • git pull强制覆盖本地修改

    有时本地代码做了修改 xff0c 但又想放弃这部分修改 xff0c 重新在新代码基础上进行开发 xff0c 这时可用如下方法覆盖先前修改 xff0c 并拉取远程仓更新本地代码 方法一 xff1a git fetch git reset ha
  • gazebo中视觉仿真怎么使用自定义贴图的问题

    gazebo中提供了很少的贴图 xff0c 场景只是用这几张贴图 xff0c 视觉SLAM仿真很容易在不该闭环的时候闭环 xff0c 导致根本没法用 那么我们怎么添加自己的贴图呢 xff1f 首先gazebo建模 使用默认贴图 xff0c
  • 传统定位方法简介--------里程计、IMU惯性传感器以及光电编码器等

    移动机器人最初是通过自身携带的内部传感器基于航迹推算的方法进行定位 xff0c 后来进一步发展到通过各种外部传感器对环境特征进行观测从而计算出移动机器人相对于整个环境的位姿 目前为止 xff0c 形成了基于多传感器信息融合的定位方法 现有移
  • 路由器接口

    深刻认识到如果不好好学习计算机网络 xff0c 对于自己学习后台的知识有很大的阻碍 所以 xff0c 这段时间好好把这方面的知识加强一下 一般路由器上的接口分为三大类 xff1a 一 用于局域网的LAN接口 二 用于广域网接入 互联的WAN
  • UART、I2C、SPI接口常见面试问题总结

    UART 定义 xff1a Universal Asynchronous Receiver Transmitter 通用异步收发传输器 特点 xff1a 速率不快 可全双工 结构上一般由波特率产生器 UART发送器 UART接收器组成 xf