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

AT24C1024的模拟IIC驱动

AT24C1024是基于IIC的EEPROM,容量为1024/8=128k bytes。它的引脚如下:

其中A1,A2为硬件地址引脚

WP为写保护引脚,一般我们需要读写,需要接低电平GND,接高的话则仅允许读

SDA和SCL则为IIC通信引脚

芯片通信采用IIC,有关IIC的通信原理可参考:

https://blog.csdn.net/u011436603/article/details/136007075文章浏览阅读293次,点赞5次,收藏8次。这样看起来,区分起止信号与数据电平是不是就更加容易些了,但是嘛由于只有一根数据线了,缺点就是无法同时收发了,因此它是半双工通信的。一般的IIC器件,比如EEPROM,此时会发送要写入或读取的地址,如往0x0000地址写入数字1,那么会先发送0x0000,等到回码后再发送0x01,之后在收到应答后结束通信。前面在讲UART时提到过通信传输所需要的几个必要条件,首先得知道什么时候通信开始,什么时候通信结束,然后就是如何去解析数据了,根据这几点,我们来谈谈IIC是如何实现通信的。从图上可以看到,IIC规定的。https://blog.csdn.net/u011436603/article/details/136007075接下来说下具体的操作流程

读数据:

  1. 启动总线
  2. 发送设备地址+写...等待应答
  3. 发送数据存储地址...等待应答
  4. 发送数据
  5. 结束总线

写数据:

  1. 启动总线
  2. 发送设备地址+写...等待应答
  3. 发送数据存储地址...等待应答
  4. 发送设备地址+读...等待应答
  5. 读数据
  6. 结束总线

本次采用模拟IIC的方式,便于移植,具体的代码如下

void eeprom_start(void)
{IIC_SDA_ON;IIC_SCL_OFF;DELAY_US (10);IIC_SCL_ON;DELAY_US(1);IIC_SDA_OFF;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}void eeprom_stop(void)
{IIC_SDA_OFF;IIC_SCL_OFF;DELAY_US(1);IIC_SCL_ON;DELAY_US(1);IIC_SDA_ON;DELAY_US(2);IIC_SCL_OFF;DELAY_US(2);IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}void eeprom_ack(void)
{IIC_SDA_ON;IIC_SCL_OFF;DELAY_US (10);IIC_SDA_OFF;DELAY_US(1);IIC_SCL_ON;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}void eeprom_noack(void)
{IIC_SDA_ON;IIC_SCL_OFF;DELAY_US (10);IIC_SCL_ON;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}void eeprom_checkack(void)
{IIC_SCL_ON;DELAY_US(10);IIC_SCL_OFF;
}void eeprom_write_byte(unsigned char ucChar)
{unsigned char i;IIC_SDA_ON;IIC_SCL_OFF;DELAY_US (10);for(i=0; i<8; i++){if(!(ucChar & BIT(7-i)) == 0)  IIC_SDA_ON;else                           IIC_SDA_OFF;DELAY_US (1);IIC_SCL_ON;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);}IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}unsigned char eeprom_read_byte(void)
{unsigned char i;unsigned char ucChar = 0;for(i=0; i<8; i++){if(IIC_SDA_VALUE == 1){ucChar |= BIT(7 - i);}else{ucChar &= ~BIT(7 - i);}IIC_SCL_ON;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);}IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);return ucChar;
}
void eeprom_write_char(unsigned int nAddress,unsigned char ucChar)
{eeprom_start();if(nAddress>=0x10000)    eeprom_write_byte(0xa2);else                     eeprom_write_byte(0xa0);eeprom_checkack();eeprom_write_byte(nAddress/256);                               eeprom_checkack();eeprom_write_byte(nAddress%256);                          eeprom_checkack();eeprom_write_byte(ucChar);eeprom_checkack();eeprom_stop();                                if(nAddress%256 == 0) DELAY_MS(100);else DELAY_MS(8);
}unsigned char eeprom_read_char(unsigned int nAddress)
{unsigned char ucChar;eeprom_start();                                      if(nAddress>=0x10000)    eeprom_write_byte(0xa2);else                     eeprom_write_byte(0xa0);eeprom_checkack();eeprom_write_byte(nAddress/256);                        eeprom_checkack();eeprom_write_byte(nAddress%256);                eeprom_checkack();eeprom_start();                                             if(nAddress>=0x10000)    eeprom_write_byte(0xa3);else                     eeprom_write_byte(0xa1);eeprom_checkack();ucChar = eeprom_read_byte();eeprom_noack();eeprom_stop();DELAY_US(10);return  ucChar;
}

其中IIC_SCL_ON和IIC_SCL_OFF表示SCL引脚电平拉高或拉低,

IIC_SDA_ON和IIC_SDA_OFF表示SDA引脚电平拉高或拉低,IIC_SDA_VALUE表示读取SDA引脚电平。需要注意的是,模拟IIC时引脚需要设置为开漏输出且需要上拉电阻。

有两个需要注意的点,一个是器件地址指令,当写存储地址处于前一半时,发送A0指令,当写存储地址处于后一半时,发送A2指令。另一个则是跨页写,每256字节为一页,当出现跨页写时,需要增大延时,否则有可能出错。

相关文章:

AT24C1024的模拟IIC驱动

AT24C1024是基于IIC的EEPROM&#xff0c;容量为1024/8128k bytes。它的引脚如下&#xff1a; 其中A1,A2为硬件地址引脚 WP为写保护引脚&#xff0c;一般我们需要读写&#xff0c;需要接低电平GND&#xff0c;接高的话则仅允许读 SDA和SCL则为IIC通信引脚 芯片通信采用IIC&…...

Stable Diffusion生成式扩散模型代码实现原理

Stable Diffusion可以使用PyTorch或TensorFlow等深度学习框架来实现。这些框架提供了一系列的工具和函数&#xff0c;使得开发者可以更方便地构建、训练和部署深度学习模型。因此可以使用PyTorch或TensorFlow来实现Stable Diffusion模型。 安装PyTorch&#xff1a;确保您已经安…...

解决Keepalived “脑裂”(双VIP)问题

1. 检查广播情况 yum install tcpdump -y tcpdump -i ens33 vrrp -n master 192.168.80.130 与 backup: 192.168.80.131都在广播&#xff0c;正常情况下backup应该是不在广播的&#xff0c;所以可以判断存在防火墙屏蔽vrrp问题&#xff0c;需要设置VRRP过掉防火墙&#xff0…...

cAdvisor+Prometheus+Grafana 搞定Docker容器监控平台

cAdvisorPrometheusGrafana cAdvisorPrometheusGrafana 搞定Docker容器监控平台1、先给虚拟机上传cadvisor2、What is Prometheus?2.1、架构图 3、利用docker安装普罗米修斯4、安装grafana cAdvisorPrometheusGrafana 搞定Docker容器监控平台 1、先给虚拟机上传cadvisor cAd…...

java基础知识面试题

下面是关于java基础知识的一些常见面试题 equals 与区别 在Java中&#xff0c;""是一个比较操作符&#xff0c;用于比较两个变量的值是否相等。而"equals()"是Object类中定义的方法&#xff0c;用于比较两个对象是否相等。 具体区别如下&#xff1a; &…...

科技云报道:黑马Groq单挑英伟达,AI芯片要变天?

科技云报道原创。 近一周来&#xff0c;大模型领域重磅产品接连推出&#xff1a;OpenAI发布“文字生视频”大模型Sora&#xff1b;Meta发布视频预测大模型 V-JEPA&#xff1b;谷歌发布大模型 Gemini 1.5 Pro&#xff0c;更毫无预兆地发布了开源模型Gemma… 难怪网友们感叹&am…...

解决i18n国际化可读性问题,傻瓜式webpack中文支持国际化插件开发

先来看最后的效果 问题 用过国际化i18n的朋友都知道&#xff0c;天下苦国际化久矣&#xff0c;尤其是中文为母语的开发者&#xff0c;在面对代码中一堆的$t(abc.def)这种一点也不直观毫无可读性的代码&#xff0c;根本不知道自己写了啥 &#xff08;如上图&#xff0c;你看得出…...

【Django】执行查询—F()表达式

F() F()可以实现将模型字段值与同一模型中的另一字段做比较。举个例子看一下&#xff1a; class Entry(models.Model):...number_of_comments models.IntegerField(default0)number_of_pingbacks models.IntegerField(default0)...找到所有 number_of_pingbacks 大于 numbe…...

202112CSPT4磁盘文件操作

题意&#xff1a;有n个id号&#xff0c;m段空间&#xff0c;k个操作&#xff1a; 0 0 0:从L开始到R或遇到第一个其他非空id号为止&#xff0c;写入 i d id id号以及值 v a l val val&#xff1b;如果成功写入则输出写入成功的最右位置&#xff0c;否则输出-1 1 1 1:若 [ L , …...

5GC SBA架构

协议标准&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择&#xff0c;根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…...

《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?

根据求生之路2服务器的实际案例分析选择合适的内存和CPU核心数以避免丢包和延迟高的问题&#xff0c;首先需要考虑游戏的类型和对服务器配置的具体要求。《求生之路2》作为一款多人在线射击游戏&#xff0c;其服务器和网络优化对于玩家体验至关重要。 首先&#xff0c;考虑到游…...

精读服务器默认rsyslog的配置文件

rsyslog的配置文件 rsyslog.conf #### MODULES ####$ModLoad imuxsock # provides support for local system logging (e.g. via logger command) $ModLoad imjournal # provides access to the systemd journal #$ModLoad imklog # reads kernel messages (the same are read…...

Vue2:用node+express部署Vue项目

一、编译项目 命令 npm run build执行命令后&#xff0c;我们会在项目文件夹中看到如下生成的文件 二、部署Vue项目 接上一篇&#xff0c;nodeexpress编写轻量级服务 1、在demo中创建static文件夹 2、将dist目录中的文件放入static中 3、修改server.js文件 关键配置&…...

前端开发人员如何做好SEO

前端开发人员如何做好SEO SEO工作不仅限于专业人员。前端开发者也可以在日常开发中实施一些代码层面的SEO优化。 以下是一些前端常用的SEO方法&#xff1a; 设置合理的title、keywords、description title、keywords、description对SEO至关重要&#xff0c;需贴合页面内容编…...

推荐收藏!分享 PyTorch 中一些高级的索引和选择操作技巧

关于 Pytorch &#xff0c;我之前分享过很多篇&#xff0c;喜欢的可以收藏、关注、点赞。 这一次&#xff0c;我准备了 20节 PyTorch 中文课程小白学 PyTorch 系列&#xff1a;54个超强 pytorch 操作9个技巧让你的 PyTorch 模型训练飞快&#xff01;Keras 3.0发布&#xff1a;…...

Apache Calcite 快速入门指南

Apache Calcite 快速入门指南 参考地址&#xff1a;Apache Calcite 快速入门指南 - 知乎 Apache Calcite 是一个动态数据管理框架&#xff0c;提供了&#xff1a;SQL 解析、SQL 校验、SQL 查询优化、SQL 生成以及数据连接查询等典型数据库管理功能。Calcite 的目标是 One Size …...

基于MUSIC算法的六阵元圆阵DOA估计matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于MUSIC算法的六阵元圆阵DOA估计matlab仿真. 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序 ........................................…...

Mysql索引学习

mysql索引-自学版 1 索引语法2 索引类别3 索引原理磁盘IO与预读索引数据结构 B树B树的前生今世B 树代码&#xff08;进阶&#xff09; 4 索引使用策略及优化优化索引的几种方法 索引常见面试题面经实战 1 索引语法 索引的语法&#xff1a;创建、修改、增加、删除等操作&#x…...

【MySQL】:高效利用MySQL函数实用指南

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. MySQL函数概论二. 字符串函数三. 数值函数四. 日期函数五. 流程函数&#x1…...

vue3+electron开发桌面应用,静态资源处理方式及路径问题总结

目录 1、静态资源放到src/assets/目录下 2、静态路径和动态路径的写法 3、编译时vite.config.js的配置...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

StarRocks 全面向量化执行引擎深度解析

StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计&#xff0c;相比传统行式处理引擎&#xff08;如MySQL&#xff09;&#xff0c;性能可提升 5-10倍。以下是分层拆解&#xff1a; 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...