STM32 I2C学习

IIC总线协议介绍

IIC:Inter Integrated Circuit,集成电路总线,是一种同步、串行、半双工通信总线。

同步:需要时钟线
串行:数据一位一位地发送
半双工:同一时间只能接受或发送,不能同时发送或接收

总线就是传输数据的通道
协议就是传输数据的规则

IIC总线结构图

在这里插入图片描述
SDA:数据线——空闲处于高电平(接上拉电阻)
SCL:时钟线——空闲处于高电平(接上拉电阻)

总线支持多设备连接,允许多主机存在,每个设备都有一个唯一的地址

连接到总线上的数目受总线的最大电容400pf限制

数据传输速率:标准模式100k bit/s 快速模式400k bit/s 高速模式3.4M bit/s

IIC协议

三个信号:起始信号、停止信号、应答信号
在这里插入图片描述
两个注意:数据有效性、数据传输顺序
一个状态:空闲状态

在这里插入图片描述
起始信号:SCL高电平时,SDA从高电平变为低电平
停止信号:SCL为高电平时,SDA从低电平变为高电平

在这里插入图片描述
应答信号:上拉电阻影响下SDA默认为高,而从机拉低SDA就是确认收到数据即ACK,否则NACK。

数据先发送高位(MSB),以字节传输,数据在SCL高电平稳定

发送完后,注意释放SDA,从机应答

空闲状态:两根线都是高电平

void iic_start(void)
{IIC_SDA(1);IIC_SCL(1);iic_delay();IIC_SDA(0);iic_delay();//钳住总线,准备发送or接收数据IIC_SCL(0);iic_delay();
}
void iic_stop(void)
{IIC_SDA(0);iic_delay();IIC_SCL(1);iic_delay();IIC_SDA(1);//发送总线停止信号iic_delay();
}
检测应答信号
uint8_t iic_wait_ack(void)
{IIC_SDA(1);iic_delay();IIC_SCL(1);iic_delay();if(IIC_READ_SDA)//SDA为高电平NACK{iic_stop();return 1;}IIC_SCL(0);//SCL拉低结束ACK检查iic_delay();return 0;
}
void iic_ack(void)
{IIC_SCL(0);iic_delay();IIC_SDA(0);iic_delay();IIC_SCL(1);iic_delay();
}
void iic_nack(void)
{IIC_SCL(0);iic_delay();IIC_SDA(1);iic_delay();IIC_SCL(1);iic_delay();
}

发送一字节数据

void iic_send_byte(uint8_t data)
{for(uint8_t i=0; i<8; i++){IIC_SDA((data & 0x80) >> 7);iic_delay();IIC_SCL(1);iic_delay();IIC_SCL(0);data <<= 1;}IIC_SDA(1); //发送完成主机释放SDA线
}
//1:ack;0:nack
uint8_t iic_read_byte(uint8_t ack)
{uint8_t receive;for(uint8_t i; i<8; i++){receive <<= 1;IIC_SCL(1);iic_delay();if(IIC_READ_SDA)receive++;IIC_SCL(0);iic_delay();}if(!ack)iic_nack();elseiic_ack();return receive;
}

AT24C02

EEPROM是一种掉电后数据不丢失的存储器,常用来存储一些配置信息,在系统重新上电时就可以加载。

与之相比的是,后备域需要额外电源供电才能防止丢失。

AT24C02是一个2K bit的EEPROM存储器,使用IIC通信方式。

在这里插入图片描述
A0/1/2:设备地址决定引脚
WP:写保护引脚,如果接高电平,就只能读取,不能写入
SCL、SDA接上拉电阻

在这里插入图片描述
24C02由32页组成,每页8Byte
在这里插入图片描述

AT24C02通讯地址

在这里插入图片描述

  • 不可编程部分:1010
  • 可编程部分:由硬件管脚A0/A1/A2决定
  • 数据传输方向:读数据‘1’,还是写数据‘0’

写操作地址:0xA0,读操作地址:0xA1
在这里插入图片描述
支持的写操作:页写、字节写

AT24C02读写时序

写操作:支持字节写模式和页写模式

字节写模式就是一个地址一个数据进行写入。
页写模式就是连续写入数据。只需要写一个地址,连续写入数据时地址会自增。但存在页的限制。超出一页时,超出数据覆盖原先写入的数据。但读会自动翻页。

读模式:支持当前地址读模式、随机地址读模式和顺序读模式

当前读模式是基于上一次读/写操作的最后位置继续读出数据。
随机地址读模式是指定地址读出数据。
顺序读模式是连续读出数据。

硬件和软件IICC对比

  • 硬件IIC:比较复杂,速度快,较稳定,需使用特定管脚
  • 软件IIC:操作过程比较清晰,速度较慢,稳定,任意管脚,比较灵活

IIC配置步骤

  1. 使能SCL和SDA对应时钟:__HAL_RCC_GPIOB_CLK_ENABLE()
  2. 设置GPIO工作模式:SDA开漏/SCL推挽输出模式,使用HAL_GPIO_Init初始化
  3. 编写基本信号:起始信号、停止信号、应答信号,主机:send_ack、sen_nack、wait ack
  4. 编写读和写函数:iic_read_byte、iic_send_byte,发送完成,主机释放SDA

为什么IIC总线SDA建议用开漏模式?

IIC的SDA引脚既要做为输出,又要作为输入,用开漏输出模式,很好地实现输出输入共用,避免IO模式频繁切换带来的麻烦。

输出时:主机(MCU)输出0,可以拉低信号,来实现低电平发送,主机输出1(实际不起作用),由外部上拉电阻上拉,实现高电平发送。

输入时:主机(MCU)设置输出1状态,此时由于MCU无法输出1,相当于释放MCU,此时外部器件可以主动拉低SDA引脚/释放SDA引脚,实现SDA脚的高低电平变化。

由于开漏输出模式下,MCU还是可以读取IDR状态寄存器,来获取引脚高低电平,即可获得SDA脚的高低电平状态,从而实现输入检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

input框 自动获取焦点

<el-input style"width:200px" autofocus v-model"leftListname"></el-input> element-ui 的 el-input 组件的 autofocus 属性在某些情况下不能实现自动聚焦,有几个可能的原因: 1. autofocus 在移动设备上不被支持。如果是在移动设备上访问,au…

Redis 发布订阅详解

Redis 发布订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。 Redis 有两种发布订阅模式 基于频道&#xff08;Channel&#xff09;的发布订阅基于模式&#xff…

ChatGPT学习第三周

&#x1f4d6; 学习目标 ChatGPT在各行各业的应用 探索ChatGPT在不同领域&#xff08;如教育、客户服务等&#xff09;的实际应用案例。 ChatGPT的局限性和挑战 讨论ChatGPT面临的挑战&#xff0c;包括偏见、误解及其限制。 ✍️ 学习活动 学习资料 《人工智能通用大模型(…

Vue3学习——路由prop配置、replace

写法一 在路由中可直接写prop: true&#xff0c;即可在页面中defineProps使用 相当于&#xff08;<Detail id“1” name“2” />&#xff09;,但只能是params {path: /service,name: 服务,component: () > import(../views/Service/index)&#xff0c;props: true}…

SQLlabs46关

看看源码 最终我们的id是放到order by后面了 如果我们直接用列去排序 ?sortusername/password username&#xff1a; passward 可以看到顺序是不同的&#xff0c;当然第一列第二列第三列也可以&#xff0c;基本上都是这个原理&#xff0c;那怎么去实现注入呢&#xff0c;我…

本地复制文本无法在Ubuntu终端中粘贴问题

在公司&#xff0c;安装Ubuntu环境后无法粘贴。 查询并自己实践后&#xff0c;解决方法如下&#xff1a; 1. sudo apt-get autoremove open-vm-tools 2. sudo apt-get install open-vm-tools-desktop 3.重启虚拟机 又可以愉快的复制粘贴了

【GPTs分享】GPTs分享之Write For Me

Write For Me 是一个专门定制的GPT版本&#xff0c;旨在为用户提供高质量的文本内容创作服务。它适用于各种写作需求&#xff0c;从商业计划、学术文章到创意故事等。下面是从简介、主要功能、使用案例、优点和局限性几个方面对Write For Me 的详细介绍。 简介 Write For Me …

Java 学习和实践笔记(22):package(包机制)、JDK常见的包、类的导入

前面学的类&#xff0c;每创建一个类&#xff0c;在电脑上就是创建了一个对应的类文件。而package 相当于文件夹对文件的管理作用。主要用于管理类、用于解决类的重名问题。这个含义很简单。因为实际的程序&#xff0c;类可能有成千上万个&#xff0c;这样就需要把不同功能的类…

「连载」边缘计算(十九)02-22:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; 从启动函数Start(&#xff09;中可以看到&#xff0c;其以go routine的方式启动很多后台处理服务&#xff0c;具体如下。 1&#xff09;初始化edged的kubeClient&#xff0c;具体如下所示。 // use self defined client to replace fake kube…

JDK5.0新增线程的两种方式

本文主要是了解&#xff0c;并没有进入深入学习&#xff0c;JUC时才会深入学习 8.1新增方式一&#xff1a;实现Callable接口 ~与使用Runable相比&#xff0c;Callable功能更强大些 -- 相比run&#xff08;&#xff09;方法&#xff0c;可以有返回值 ---方法可以抛出异常 -…

LeetCode刷题--- 环形子数组的最大和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

设计模式(十) - 工厂方式模式

前言 在此前的设计模式&#xff08;四&#xff09;简单工厂模式中我们介绍了简单工厂模式&#xff0c;在这篇文章中我们来介绍下工厂方法模式&#xff0c;它同样是创建型设计模式&#xff0c;而且又有些类似&#xff0c;文章的末尾会介绍他们之间的不同。 1.工厂方法模式简介 …

C# TesseractOCR识别身份证号

https://github.com/tesseract-ocr/tessdata 新建控制台项目并添加包 Tesseract和Tesseract.Drawing 下载训练的模型 地址 代码实现 using Tesseract;var filePath "F:\\Desktop\\韦小宝.png"; var exePath AppDomain.CurrentDomain.BaseDirectory; var …

机器视觉运动控制一体机在光伏汇流焊机器人系统的解决方案

一、市场应用背景 汇流焊是光伏太阳能电池板中段加工工艺&#xff0c;其前道工序为串焊&#xff0c;在此环节流程中&#xff0c;需要在多个太阳能电池片表面以平行方式串焊多条焊带&#xff0c;形成电池串。串焊好的多组电池串被有序排列输送到汇流焊接工作台&#xff0c;通过…

接受回调函数的函数

直接上代码 const oneWord function (str) {return str.replace(/ /g, ).toLowerCase(); };const upperFirstWorld function (str) {const [first, ...others] str.split( );return [first.toUpperCase(), ...others].join( ); };// 高阶函数 const transformer function …

深度学习 精选笔记(3)线性神经网络-线性回归

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

workon把pyhton环境切换为python3.7环境配置

重新创建虚拟环境 创建workon的虚拟环境&#xff08;注意修改中文&#xff09; 注&#xff1a;-p后面的路径为你需要的python版本的python.exe执行文件 mkvirtualenv -p C:\Users\用户名\AppData\Local\Programs\Python\Python37\Python.exe 环境名进入环境&#xff08;注意…

代码随想录Day63 |503.下一个更大元素II 42. 接雨水

代码随想录Day63 |503.下一个更大元素II 42. 接雨水 503.下一个更大元素II42.接雨水双指针单调栈 503.下一个更大元素II 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 单调栈&#xff0c;成环了可怎么办&#xff1f;LeetCode&#xff1a;503.下一个更大元素II 状态 单…

基于Java SSM框架实现高考填报信息系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现高考填报信息系统演示 JAVA简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;JSP&#xff08;java serv…

OpenAI 与开源多语言嵌入模型

原文地址&#xff1a;OpenAI vs Open-Source Multilingual Embedding Models 选择最适合您的数据的模型 2024 年 2 月 25 日 OpenAI最近发布了他们的新一代embedding模型&#xff0c;称为embeddingv3&#xff0c;他们描述是他们性能最好的embedding模型&#xff0c;具有更高…