【总线】IIC学习笔记

2023-05-16

【总线】IIC学习笔记

  • 参考链接
  • IIC总线介绍
  • IIC总线时序
    • 1.空闲信号
    • 2. 启动信号与停止信号
    • 3.数据的有效性
    • 4.应答信号
    • 5.七位地址传输
  • IIC读写过程(AT24C02举例)
    • IIC读过程
    • IIC写过程
  • 正点原子IIC驱动问题
    • 1、IIC停止信号问题
    • 2、IIC-AT24C02的器件地址发送的疑惑

参考链接

IIC时序图+代码
IIC总线+上拉电阻计算
IIC通信协议
IIC学习

IIC总线介绍

IIC是一种串行、半双工的总线。通信距离短、通信速度低的场合。
IIC有两根线,一个是SDA,用于收发数据的数据线;一个是SCL,用于双方通信时钟的同步。

在这里插入图片描述

IIC是一种多主机总线。连接在IIC总线上的器件分别为主机和从机。
主机有权启用和结束一次通信,从机只能被主机呼叫。
当总线上有多个主机同时启用总线时,IIC具有冲突检测和仲裁的功能。IIC通信的同步和仲裁是自动进行的

每个连接到IIC总线的器件都有一个唯一地址(7bit),每个器件就可以作为主机也作为从机,但是同一时刻只能有一个主机。

IIC总线上的器件删除或者添加,不会影响其他器件的正常工作。

总线空闲时,设备都是开漏输出,由电路中的上拉电阻使SDA和SCL都保持高电平。当任一设备输出低电平时都会使总线上的信号线变低。

IIC三种传输模式:标准模式传输速率为100kbit/s,快速模式为400kbit/s,高速模式下可达3.4M/s,但目前大多IIC设备尚不支持高速模式。连接到总线的接口数量只由总线电容是 400pF 的限制决定。

IIC总线时序

1.空闲信号

在总线未被主机占用时,电路中的上拉电阻使 SDA 和 SCL 线保持高电平状态,并等待主机启用总线。

2. 启动信号与停止信号

起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态 在停止条件的某段时间后,总线再次处于空闲状态。

① 启动信号:在SCL线是高电平时,SDA线从高到低的跳变;
② 停止信号:在SCL线是高电平时,SDA线从低到高的跳变。

在这里插入图片描述

3.数据的有效性

在IIC总线进行数据传输时,SCL时钟信号为高电平期间,SDA数据线上的数据必须保持稳定。只有在SCL时钟线上的信号为低电平期间,SDA数据线上的电平状态才允许变化。
SDA数据线在SCL的每个时钟周期传输一位数据。

在这里插入图片描述

4.应答信号

发送器每发送一个字节,会在第九个时钟脉冲期间释放数据线(低电平),由接收器反馈一个响应(ACK/NACK)。

① ACK(应答信号):应答信号为低电平(0)时,表示接收器已经成功地接收了该字节;
② NACK(非应答信号):应答信号为高电平(1)时,一般表示接收器接收该字节没有成功。

在这里插入图片描述

5.七位地址传输

起始信号后发送的第一个字节(8位)是从机地址+数据方向位。
从机地址共有 7 位,紧接着的第 8 位是数据方向位 R/ W(表示从机进行读/写)操作。
“0” 表示“写”发送数据,“1” 表示“读”请求数据。

在这里插入图片描述

IIC读写过程(AT24C02举例)

本小节图片来源:IIC协议实战项目

IIC读过程

首先,主机发起启动信号。
然后,主机发送器件地址和写方向(一字节)的广播器件寻址,并等待从机应答。
从机应答后,主机发送要读取的数据存储地址,并等待从机应答。
从机应答后,主机再次发起启动信号。
然后,主机发送器件地址和读方向(一字节)的广播器件寻址,并等待从机应答。【更换接收方向】
然后,主机通过SDA读取一个字节的数据。
数据接收完毕后,如果主机不想在接收数据了,需要回复非应答信号。
最后,主机发起停止信号。

在这里插入图片描述

IIC写过程

首先,主机发起启动信号。
然后,主机发送器件地址和写方向(一字节)的广播器件寻址,并等待从机应答。
从机应答后,主机发送要写入的数据存储地址,并等待从机应答。
从机应答后,主机发送想要写入的数据,并等待从机应答。
从机应答后,主机发起停止信号。

在这里插入图片描述

正点原子IIC驱动问题

1、IIC停止信号问题

在这里插入图片描述

上述原版驱动代码。可以发现,一开始两根线都是低电平,并等待了4us。
然后SCL高,SDA立马拉高,并等待4us。停止信号是,在SCL为高的情况下,SDA由低向高转变。这么短的时候,留给SDA的时间太短了吧?
我搜索查到,有些朋友说,慢速没问题,时钟高了就有问题。所以,还是应该注意下。
我觉得应该如下:

void IIC_Stop(void)
{
	SDA_OUT();//sda线输出
	IIC_SCL=0;
	IIC_SDA=0;
	IIC_SCL=1;
	delay_us(4);
	IIC_SDA=1;
	delay_us(4);
}

在这里插入图片描述

2、IIC-AT24C02的器件地址发送的疑惑

在IIC_Send_Byte(0XA0+((ReadAddr/256)<<1))中,0XA0是器件地址,为什么还要加上(ReadAddr/256)<<1?
在使用AT24C02的情况下,这句话并没有用。
因为24C02,一共2Kbit的大小,也就是256字节。所以用一个字节就能把它全部的读写地址表示了。
但是对于04,一共有4Kbit的大小,也就是512字节,一个字节并不能表示其全部的读写地址,得需要9bit才行。
这就跟这个IIC器件有关了,对于高容量eeprom,它有大小分区。
它将读写地址的一部分放到了器件地址中,具体的可以看数据手册。

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

【总线】IIC学习笔记 的相关文章

  • 软件破解注册码

    写在破解之前 xff1a xff1a xff1a 软件破解的目的是 xff1a 有些需要注册的软件 xff0c 可是找不到注册码 xff0c 将其破解之后 xff0c 输入任何注册码都会提示注册成功 声明 xff1a 此贴适合从来没接触过软
  • keil中怎么添加自己的头文件,加入工程,保存路径。#include还用吗

    keil中怎么添加自己的头文件 xff0c 例如 xff1a 添加 include lt led h gt 要把它写在哪里 xff0c 保存在哪里 xff0c 才能编译后 xff0c 显示 include lt reg51 h gt inc
  • 面试题整理简历中深度学习机器学习相关的知识及linux操作系统命令

    深度学习与机器学习 都在整理关于后台的 xff0c 被问到后忘了 xff0c 尴尬 的确是我的问题 xff0c 基本的机器学习知识还是要整理一波 o inception 网络 xff1a 主要应用了深度可分离卷积 xff1a 主要用了大尺度
  • 面试可能遇到的问题野指针等解决方法

    空指针 xff1a 一般声明一个指针变量赋值为NULL xff0c 这就是空指针 xff0c 各个类型的空指针都存在确确实实的内存地址 xff0c 但是不会指向任何有效的值的内存地址 xff0c 对空指针操作 xff0c 例如访问属性和方法
  • 大规模分布式储存系统笔记(一)

    分布式储存系统的特性 xff1a 1 可扩展性 可按集群规模增长 xff0c 系统性能线性增长 xff1b 2 低成本 系统自动容错 xff0c 自动负载均衡 xff0c 运维方便 3 高性能 4 易用性 对外提供接口 数据类型 xff1a
  • 用MATLAB实现对运动物体识别与跟踪

    不得不说MATLAB的图像处理函数有点多 xff0c 但速度有时也是出奇的慢 还是想c的指针 xff0c 虽然有点危险 xff0c 但速度那是杠杠的 第二个MATLAB程序 xff0c 对运动物体的识别与追踪 这里我们主要运用帧差法实现运动
  • PS 开启GPU加速图片处理

    还认为你的电脑的速度效果比不上苹果吗 xff1f 还在嫌电脑渲染速度慢吗 xff1f 试一下 xff0c 电脑开启GPU硬件加速吧 xff01 只要有独显轻松加速 xff08 毕竟苹果笔记本要配独显电脑的价格基本上在15000以上 xff0
  • 管道鸟cortex-M4(TM4C1294)

    看到满屏的贪吃蛇 xff0c 我也来开源一个Ti开发板 xff08 TM4C1294 xff09 的游戏 将简化版的管道鸟 xff0c 根据自己玩的经历 xff0c 在cortexm4开发板上重新撸了一边 xff0c 设计思路 xff1a
  • C#连接MYSQL数据库并进行查询

    之前用MFC开发结果界面太难看被pass了 要求用C 重新来开发 gt lt 不过终于摆脱VC6 0的蛋疼操作了Y 先来连接数据库 xff08 1 xff09 用c 连接MYSQL数据库需要用到mysql connector net xff
  • binascii.Error: Incorrect padding 报错解决

    输入的base64编码字符串必须符合base64的padding规则 当原数据长度不是3的整数倍时 如果最后剩下两个输入数据 xff0c 在编码结果后加1个 61 xff1b 如果最后剩下一个输入数据 xff0c 编码结果后加2个 61 x
  • 通过过滤器链了解spring security + oauth2实现单点登录的过程

    一 系统 注意部署在同一机器 xff08 localhost xff09 上的三个应用 xff0c 为了防止存放在cookie中的JSESSIONID不被覆盖 xff0c 需要设置不同的path xff0c 可以在配置文件中指定不同的上下文
  • jetson tx2开箱上电

    期待已久的jetson tx2终于到了 xff0c 来做一个开箱 jetson tx2是英伟达的第三代GPU嵌入式开发板 前两代分别是jetson tk1和jetson tx1 jetson tk1 xff1a 绿色的版板子接口丰富 jet
  • Jetson tx2刷机过程中的坑

    暑假各种事忙得差不多后 xff0c 终于有时间拿出早就申请到的tx2 xff0c 开始刷机教程 xff0c 这两天几乎踩边了所有的坑 第一个坑 xff0c 虚拟机 一般在安装VMware虚拟机时 xff0c 建议的安装空间20GB xff0
  • python词云实现

    python的一个蛮酷炫的功能是可以轻松地实现词云 github上有关于这个项目的开源代码 xff1a https github com amueller word cloud 注意跑例程时要删除里面的wordcloud文件夹 词云的功能有
  • docker中accessTokens拉取私有git仓库

    背景 当需要git clone拉取私有库时 xff0c 传统的做法为将本机的ssh配置到gitlab中 但在docker中执行程序时需要拉取私有库 xff0c 此时无法为每个docker容器配置ssh 网上的一种方案为 xff0c 将配置好
  • Docker世界 -- 进阶篇(入门)

    一 Docker Compose 1 1 Docker Compose 介绍 1 1 1 简介 xff1a 传统的 docker 服务 xff0c 我们一般通过编写 Dockerfile 文件 xff0c 通过 build 命令创建一个镜像
  • 树莓派pico CMake工程 直接添加 .c .h文件

    假设工程名test1 xff0c 带main 的源代码文件 main c xff0c 要往工程里添加oled c oled h之类的源代码 直接添加为可执行文件 xff1a 编辑工程根目录的 CmakeLists txt add execu
  • 张量的通俗理解

    1 关于张量的四种定义 张量 在不同的运用场景下有不同的定义 xff08 1 xff09 张量是多维数组 xff0c 这个定义常见于各种人工智能软件 听起来还好理解 xff08 2 xff09 张量是某种几何对象 xff0c 不会随着坐标系
  • 如何搭建node_exporter

    如何搭建node exporter 1 观看条件 1 假设你已经看过上一篇文章 如何搭建普罗米修斯 Prometheus 2 假设你已经会搭建普罗米修斯 xff08 promethus xff09 3 上面两个假设 xff0c 只要满足一个
  • python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,···,参数n)区别

    前言 这两种初始化形式 xff0c 就类似于C 43 43 类中的构造函数 形式1 def init self span class token keyword class span span class token class name

随机推荐

  • Go语言操作grpc详细使用

    Go语言操作grpc详细使用 零 参考链接一 protobuf的详细使用二 grpc与protobuf的go文件的生成1 安装两个插件2 写proto文件3 编译proto文件 xff0c 生成go文件 三 grpc的详细使用1 一元RPC
  • Steghide使用教程及其密码爆破

    Steghide使用教程及其密码爆破 工具介绍 Steghide是一款开源的隐写术软件 xff0c 它可以让你在一张图片或者音频文件中隐藏你的秘密信息 xff0c 而且你不会注意到图片或音频文件发生了任何的改变 而且 xff0c 你的秘密文
  • 一道Gloang并发、锁的面试题,你会吗?

    Gloang并发 锁的面试题 1 题目描述2 问题分析2 1问题一2 2问题二2 3问题三2 4问题四2 5问题五 3 问题解决方法4 代码实现4 1 map前后加锁的方式4 2 sync map解决方式 1 题目描述 源地址 xff1a
  • 阿里云、腾讯云centos7安装mysql

    阿里云 腾讯云centos7安装mysql 1 下载2 解压与准备3 安装4 配置4 1配置数据库4 2查看默认密码4 3启动mysql4 4设置密码 5 开启远程登录5 1开放3306端口5 2开启远程登录6 参考链接 1 下载 镜像网站
  • go语言gin、net/http的优雅关机

    gin net http的优雅关机 什么是优雅关机 xff1f 优雅关机的实现参考链接 什么是优雅关机 xff1f http server运行过程中 xff0c 若进程被关闭 xff0c 那么正在处理的请求可能只被处理了一半就停止了 xff
  • C语言不详细记录

    C记录 1 内存管理2 结构体内存对其规则3 字符串函数4 二维数组5 const 指针6 字符串7 图片记录8 函数指针 1 内存管理 C语言内存讲解 详说内存分布和heap空间 2 结构体内存对其规则 C语言结构体对齐规则 C语言 结构
  • 【web压测】压测常用工具、压测指标到底是什么?

    压测常用工具 压测指标到底是什么 xff1f 一 压测指标 I1 QPS xff0c 每秒查询2 TPS xff0c 每秒事务3 RT xff0c 响应时间 二 压测指标 II三 压测工具1 ab2 go wrk 在window上压测 一
  • C语言结构体字节对其规则简述

    C语言结构体字节对其规则简述 规则描述示例示例一示例二 字节对齐规则 xff0c 一直不是很理解 xff0c 网上的答案也是参差不齐 规则描述 首先 xff0c 预处理指令 pragma pack n 可以改变默认对齐数进行字节对齐 n 取
  • 【STM32学习】SysTick定时器(嘀嗒定时器)

    SysTick定时器 一 参考资料二 时钟源选择与定时时间计算1 时钟源选择2 定时时间计算 三 SysTick Handler中断服务函数 一 参考资料 嘀嗒定时器 xff1a 时钟源 寄存器 二 时钟源选择与定时时间计算 结合正点原子的
  • 【STM32学习】GPIO口的八种工作模式

    GPIO口的八种工作模式 一 参考资料二 GPIO八种模式1 输入模式2 输出模式 三 施密特触发器1 电路2 电路计算 一 参考资料 GPIO原理图详解 强烈建议观看 xff1a GPIO为什么这样设计 xff1f 施密特触发器 原理 施
  • 【STM32学习】WWDG窗口看门狗

    STM32学习 WWDG窗口看门狗 x1f415 1 图展示WWDG原理2 复位 中断条件3 溢出时间计算4 与独立看门狗 x1f415 的对比 1 图展示WWDG原理 2 复位 中断条件 产生复位的情况 xff1a 当递减计数器数值递减到
  • 【STM32学习】时钟配置详解

    STM32学习 时钟配置详解 看懂时钟图结合代码外部高速时钟修改 看懂时钟图 在刚开始学习32的时候 xff0c 并不会在意这些 xff0c 或者即使看了也看的不是很明白 随着学习的深入 xff0c 我们发现看门狗 定时器 ADC很多外设都
  • vnc远程访问ubuntu18.04桌面系统 vncserver开机自启动

    文章目录 一 windows端准备二 ubuntu端准备三 远程连接桌面四 配置vncserver开机自启动 一 windows端准备 下载TightVNC xff1a https www tightvnc com 二 ubuntu端准备
  • 【STM32学习】定时器寄存器配置、功能工作过程详解

    STM32学习 定时器寄存器配置 功能工作过程详解 零 参考一 引言二 功能以及寄存器说明1 最基本的定时功能 xff08 时基单元 xff09 1 1 框图1 2 工作流程1 3 寄存器介绍1 3 1 CR1寄存器1 3 2 CNT PS
  • 【STM32学习】实时时钟 —— RTC

    STM32学习 实时时钟 RTC 零 参考一 工作原理1 RTC介绍2 工作过程 二 相关寄存器三 代码说明1 rtc初始化2 关于中断3 中断配置代码 xff08 仅供参考 xff09 3 1 秒中断 43 普通闹钟功能3 2 待机模式唤
  • 【JLink仿真器】盗版检测、连接故障、检测不到芯片问题

    JLink仿真器 盗版检测 连接故障 检测不到芯片问题 一 问题描述二 解决方法1 降低驱动 xff08 解决非法问题以及连接故障 xff09 2 SWD引脚被锁 xff08 解决检测不到芯片 xff09 三 说明 一 问题描述 盗版检测
  • 【STM32学习】直接存储器访问——DMA

    STM32学习 直接存储器访问 DMA 零 参考一 对DMA的理解二 DMA通道优先级三 DMA通道x传输数量寄存器 DMA CNDTRx 四 DMA缓冲区设计 零 参考 一个严谨的STM32串口DMA发送 amp 接收 xff08 1 5
  • 【STM32学习】模数转换器——ADC

    STM32学习 模数转换器 ADC 零 参考一 ADC转换耗时二 转换模式三 对某些寄存器的理解1 ADC CR22 ADC SQRX 四 库函数注意事项 零 参考 STM32固件库 xff08 标准外设库 xff09 入门学习 第七章 A
  • 【面试】嵌入式C语言题目整理

    面试 嵌入式C语言题目整理 描述内存四区 内存四区分为 xff1a 代码区 静态区 堆区 栈区 代码区就是用来存放代码的 静态区用来存放全局变量 静态变量 常量 xff08 字符串常量 const修饰的全局变量 xff09 堆区中的内存是由
  • 【总线】IIC学习笔记

    总线 IIC学习笔记 参考链接IIC总线介绍IIC总线时序1 空闲信号2 启动信号与停止信号3 数据的有效性4 应答信号5 七位地址传输 IIC读写过程 xff08 AT24C02举例 xff09 IIC读过程IIC写过程 正点原子IIC驱