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

07-19 1344阅读

目录

一、驱动概述

二、AT24C64简介

三、驱动编写

四、驱动应用


 本项目的交流QQ群:701889554

物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html

物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html

物联网实战--平台篇https://blog.csdn.net/ypp240124016/category_12653350.html

端点物联开发教程https://blog.csdn.net/ypp240124016/category_12696766.html

一、驱动概述

        这是驱动篇的第一篇,所以先说明下驱动篇的作用和书写计划。之前的净化器项目已有提及,向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器件的关键就是器件地址和数据地址,一般器件地址是厂家定义+引脚自定义决定的,数据地址对于这款芯片来说就是空间容量了,提炼出来就是下面这些截图了。

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

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

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

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

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

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

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

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

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

三、驱动编写

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

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

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

#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;iAT24C64_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不需要这个步骤,某个地址可以直接重复写入,但是它的容量比较小,适合存储一些参数信息。

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

驱动文件https://download.csdn.net/download/ypp240124016/89096777

本项目的交流QQ群:701889554

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]