物联网实战--驱动篇之(一)EEPROM存储器(AT24C64)

目录

一、驱动概述

二、AT24C64简介

三、驱动编写

四、驱动应用


一、驱动概述

        这是驱动篇的第一篇,所以先说明下驱动篇的作用和书写计划。之前的净化器项目已有提及,向ESP8266、SHT30这些都属于驱动设备,主芯片STM32是核心,相当于大脑,这些外部模块相当于手眼耳鼻。那STM32要如何调用这些驱动设备呢,这就需要驱动程序了,像双面胶一样,粘合这两部分。

        其实驱动程序我们平时在使用个人电脑的时候也经常接触,比如我们在使用烧写器的时候直接插电脑USB首先是电脑无法识别的,需要你安装驱动程序后才能识别,这个驱动程序是烧写器厂家根据Windows的系统要求编写的,如果厂家没有写苹果系统的驱动程序,那么理论上你就不能在苹果电脑上使用烧写器了。所以,驱动程序要有比较好的移植能力,这样你在各个单片机平台之间就可以很好复用了,因为你毕竟无法预料老板想用哪款芯片做新项目。

        这样一说,大家也应该基本明白了,驱动程序之间没有关联,所以这个系列就是在不断扩充品类,上下文之间没有太大关联。根据计划,我把要写的清单先列一下:EEPROM存储器AT24C64、4G、NB-Iot、LoRa、实时时钟DS1302、电能芯片HLW8032、磁编码AS5600、modbus协议、加解密算法、hp303b气压传感器、MPU6050陀螺仪、SHA204A安全认证芯片、FLASH存储器 W25Q64、以太网W5500等等,反正想到什么写什么了,或者读者有什么需要的可以留言,有条件也安排上了。

        这里面LoRa是比较特殊的,因为它可以使用LoRaWAN也可以自组网,后面应该会单独开一篇LoRa自组网协议的文章。

二、AT24C64简介

        下面回归本篇主题,EEPROM存储器 AT24C64,AT24CXX是个系列,后面XX代表容量,这里具体可以看手册。AT24C64_(IDCHIP(英锐芯))AT24C64中文资料_价格_PDF手册-立创电子商城

        看手册不管中文版或者英文版,都要学会抓关键,像这类IIC器件的关键就是器件地址和数据地址,一般器件地址是厂家定义+引脚自定义决定的,数据地址对于这款芯片来说就是空间容量了,提炼出来就是下面这些截图了。

        如上图所示,AT24C64存储空间是8192字节,转换成16进制就是0x2000,所以读写范围不要超过这个,驱动程序内要有边界保护。

        如上图所示,一般来讲如果就一块AT24C64的话,地址A0A1A2都是直接接地的,根据地址脚数量可知,一条IIC总线可以挂载8个存储芯片。对于IIC,我这里都是使用模拟IIC,这样可移植性以较好。

        如上图所示,AT24C64的起始器件地址是0xA0,二进制(1010 0000),其它的根据硬件电路决定。

        如上图所示,读写都是差不多的,注意点是数据地址是2字节,因为存储空间是0x2000;还有一个是写的时候,如果地址重新换页了,那么要重启总线信号才能继续写数据进去,AT24C64一页是32个字节,所以代码里有部分是如下所示。

三、驱动编写

        接下去是代码部分,先看下头文件部分,并不复杂。

        接下来是代码部分,代码里都有注释了读写的数据地址范围,还有写数据换页时候要重启总线,然后稍微延时下,这里写代码时候稍微有点技巧,自己看代码琢磨了。


#include "drv_at24c64.h"At24c64WorkStruct g_sAt24c64Work={0};
/*		 
================================================================================
描述 :初始化
输入 : 
输出 :  
================================================================================
*/
void at24c64_init(GPIO_TypeDef* port_sda, u16 pin_sda, GPIO_TypeDef* port_scl, u16 pin_scl)
{ I2cDriverStruct *pIIC=&g_sAt24c64Work.tag_iic;pIIC->port_sda=port_sda; pIIC->pin_sda=pin_sda;pIIC->port_scl=port_scl;pIIC->pin_scl=pin_scl;	g_sAt24c64Work.dev_addr=0xA0;//默认器件地址IIC_GPIOInit(pIIC);}/*		
================================================================================
描述 : 设置器件地址
输入 : 
输出 : 
================================================================================
*/
void at24c64_set_dev_addr(u8 dev_addr)
{g_sAt24c64Work.dev_addr=dev_addr;
}/*		
================================================================================
描述 : 读数据
输入 : 
输出 : 
================================================================================
*/
u16 at24c64_read(u32 data_addr, u8 *out_buff, u16 len)
{u8 dev_addr=g_sAt24c64Work.dev_addr;//器件地址u16 i=0;if(len==0 || data_addr+len>AT24C64_MAX_ADDR)//数据范围检测return 0;I2cDriverStruct *pIIC=&g_sAt24c64Work.tag_iic;IIC_Start(pIIC);IIC_WriteByte(pIIC, dev_addr );//写器件地址IIC_WaitAck(pIIC);IIC_WriteByte(pIIC, data_addr>>8 );IIC_WaitAck(pIIC);	IIC_WriteByte(pIIC, data_addr ); //写数据地址IIC_WaitAck(pIIC);IIC_Start(pIIC);IIC_WriteByte(pIIC, dev_addr|0x01 );//准备读IIC_WaitAck(pIIC);for(i=0;i<len-1;i++)//循环读取,少一个字节{out_buff[i]=IIC_ReadByte(pIIC);IIC_Ack(pIIC);//ACK}		out_buff[i]=IIC_ReadByte(pIIC);//读取最后一个字节IIC_NAck(pIIC);//NACKIIC_Stop(pIIC);return len;
}/*		
================================================================================
描述 :写数据
输入 : 
输出 : 
================================================================================
*/
u16 at24c64_write(u32 data_addr, u8 *in_buff, u16 len)
{u8 dev_addr=g_sAt24c64Work.dev_addr;//器件地址u8 *pData=in_buff;if(len==0 || data_addr+len>AT24C64_MAX_ADDR)//数据范围检测return 0;I2cDriverStruct *pIIC=&g_sAt24c64Work.tag_iic;while(len>0){IIC_Start(pIIC);IIC_WriteByte(pIIC, dev_addr);//写器件地址IIC_WaitAck(pIIC);IIC_WriteByte(pIIC, data_addr>>8 );IIC_WaitAck(pIIC);	IIC_WriteByte(pIIC, data_addr );//写数据地址IIC_WaitAck(pIIC);//继续写while(len>0){IIC_WriteByte(pIIC, *pData );IIC_WaitAck(pIIC);len--;			pData++;data_addr++;if(data_addr%32==0)//写满一页,必须重新启动总线{break;}}IIC_Stop(pIIC);		delay_ms(5);//适当延时}return len;
}
四、驱动应用

        应用层就是初始化,然后读写了,没什么太复杂的东西。以后还会接触一个FLASH存储器,那个需要整页先擦除才能写入,容量比较大;而EEPROM不需要这个步骤,某个地址可以直接重复写入,但是它的容量比较小,适合存储一些参数信息。

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

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

相关文章

C++从入门到精通——范围for的使用

范围for的使用 前言一、&#xff08;引言&#xff09;python中for循环的使用二、C中的范围forC语言中的for循环C中的范围for的语法不使用范围for的正常写法范围for的写法正常范围forauto自动推导范围for 三、范围for的使用条件for循环迭代的范围必须是确定的迭代的对象要实现和…

第五节 LLava模型数据处理源码解读(input_ids/labels/attention_mask/image,上篇)

文章目录 前言一、torch.nn.utils.rnn.pad_sequence与torch.ne函数1、torch.nn.utils.rnn.pad_sequence函数功能解读1、函数原理2、demo示列3、demo结果对比2、torch.ne函数介绍二、图像与语言加载1、语言处理tokenizer的来源2、图像处理process的来源3、数据加工方法三、数据加…

redis 数据库的安装及使用方法

目录 一 关系数据库与非关系型数据库 &#xff08;一&#xff09;关系型数据库 1&#xff0c;关系型数据库是什么 2&#xff0c;主流的关系型数据库有哪些 3&#xff0c;关系型数据库注意事项 &#xff08;二&#xff09;非关系型数据库 1&#xff0c;非关系型数据库是…

vue-element-template 设置权限管理配置文件 \ vue用户权限管理

最近使用vue-element-template模板做系统时&#xff0c;需要实现用户权限管理&#xff0c;通过后端传来的roles字段来判断不同用户的身份&#xff0c;不同用户显示不同的侧边栏&#xff0c;下面是配置方法&#xff1a; 0.需要配置的文件有&#xff1a; src/routersrc/store/mo…

模拟---算法

1、定义 仅仅使用较简单的算法和数据结构的题目。模拟顾名思义,按照题目的要求,一步步写出代码。 特点:模拟题目通常是具有码量大、操作多、思路繁复的特点。 2、步骤 读题,读懂题目的意思,要知道题目想做什么建模,利用什么样的数据结构来实现代码实现,写出代码框架调…

maven上传pom和jar文件到远程仓库

上传.pom文件 例如只想要上传 Spring Cloud Dependencies 的 .pom 文件到 Maven 远程仓库&#xff0c;可以执行如下命令 mvn deploy:deploy-file -Durlrepository-url -DrepositoryIdrepository-id -Dfilepath-to-pom-file -DpomFilepath-to-pom-file其中&#xff0c;需要…

day04-MQ

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你…

LeNet卷积神经网络

文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下&#xff1a; self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数&#xff0c;out_cha…

蓝桥杯备考随手记: practise06

问题描述: 一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成的串。 例如&#xff0c;字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab&#xff0c;一共7 个。 注意在计算时&#xff0c;只算本质不同的串的个数。 请问&#xff0c;字符串01001100010100…

Redis从入门到精通(五)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

接口的总结与面试题

接口本身不能创建对象&#xff0c;只能创建接口的实现类对象&#xff0c;接口类型的变量可以与实现类对象构成多态引用。 声明接口用interface&#xff0c;接口的成员声明有限制&#xff1a; &#xff08;1&#xff09;公共的静态常量 &#xff08;2&#xff09;公共的抽象方…

【洛谷 P8656】[蓝桥杯 2017 国 B] 对局匹配 题解(映射+位集合+贪心算法)

[蓝桥杯 2017 国 B] 对局匹配 题目描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分&#xff0c;代表他的围棋水平。 小明发现网站的自动对局系统在匹配对手时&#xff0c;只会将积分差恰好是 K K K 的两名用户匹配在一起。如果两人分差小…

Python网络爬虫(四):b站评论

首先来看一下采集的数据格式: 本文不对数据采集的过程做探讨,直接上代码。首先要在程序入口处bvids列表内替换成自己想要采集的视频bvid号,然后将self.cookies替换成自己的(需要字典格式),代码可以同时爬取多个视频的评论,且爬取的评论较为完整,亲测有效: im…

el-upload上传图片图片、el-load默认图片重新上传、el-upload初始化图片、el-upload编辑时回显图片

问题 我用el-upload上传图片&#xff0c;再上一篇文章已经解决了&#xff0c;el-upload上传图片给SpringBoot后端,但是又发现了新的问题&#xff0c;果然bug是一个个的冒出来的。新的问题是el-upload编辑时回显图片的保存。 问题描述&#xff1a;回显图片需要将默认的 file-lis…

VScode使用持续更新中。。。

VScode 安装 Ubuntu18.04安装和使用VScode 使用 Vscode如何设置成中文

基于springboot大学生兼职平台管理系统(完整源码+数据库)

一、项目简介 本项目是一套基于springboot大学生兼职平台管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

基于Springboot + vue + mysql 游戏分享管理系统 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;系统架构 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; 管理员功能需求E/R图 &#x1f4ac; 用户功能需求E/R图 &#x1f4ac; 游戏文章E/R图 &#x1f4ac; 用户E/R图 &#x1f4da; 系…

Jmeter的使用

Jmeter的使用 1.Jmeter简介 以下内容来自Jmeter中文网http://www.jmeter.com.cn/jieshao&#xff0c;很好的解释了Jmeter的作用&#xff1a; Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xf…

zabbix绑定钉钉进行通知,网页端添加JavaScript,无脑式操作

文章目录 前言一、编辑zabbix告警JavaScript脚本二、代码如下&#xff1a;编辑消息模板&#xff0c;自定义markdown格式的消息。 总结 前言 随着人工智能的不断发展&#xff0c;zabbix监控这门技术也越来越重要&#xff0c;一下进入正题。 一、编辑zabbix告警JavaScript脚本 没…

水离子雾化壁炉如何实现火焰的虚实变化?

水离子雾化壁炉通过调节水雾的密度和电子控制器的设置来实现火焰的虚实变化。具体实现方法如下&#xff1a; 调节水雾密度&#xff1a; 超声波振动器可以调节水分子的雾化效果&#xff0c;从而控制水雾的密度。增加水雾的密度会使火焰看起来更实&#xff0c;而减少水雾的密度则…