e福州官方网站,wordpress注册目录,线上推广营销,公司网站建设需要提供什么材料目录
一、驱动概述
二、AT24C64简介
三、驱动编写
四、驱动应用 一、驱动概述 这是驱动篇的第一篇#xff0c;所以先说明下驱动篇的作用和书写计划。之前的净化器项目已有提及#xff0c;向ESP8266、SHT30这些都属于驱动设备#xff0c;主芯片STM32是核心#xff0c;相…目录
一、驱动概述
二、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存储器 AT24C64AT24CXX是个系列后面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.hAt24c64WorkStruct g_sAt24c64Work{0};
/* 描述 :初始化
输入 :
输出 : */
void at24c64_init(GPIO_TypeDef* port_sda, u16 pin_sda, GPIO_TypeDef* port_scl, u16 pin_scl)
{ I2cDriverStruct *pIICg_sAt24c64Work.tag_iic;pIIC-port_sdaport_sda; pIIC-pin_sdapin_sda;pIIC-port_sclport_scl;pIIC-pin_sclpin_scl; g_sAt24c64Work.dev_addr0xA0;//默认器件地址IIC_GPIOInit(pIIC);}/* 描述 : 设置器件地址
输入 :
输出 : */
void at24c64_set_dev_addr(u8 dev_addr)
{g_sAt24c64Work.dev_addrdev_addr;
}/* 描述 : 读数据
输入 :
输出 : */
u16 at24c64_read(u32 data_addr, u8 *out_buff, u16 len)
{u8 dev_addrg_sAt24c64Work.dev_addr;//器件地址u16 i0;if(len0 || data_addrlenAT24C64_MAX_ADDR)//数据范围检测return 0;I2cDriverStruct *pIICg_sAt24c64Work.tag_iic;IIC_Start(pIIC);IIC_WriteByte(pIIC, dev_addr );//写器件地址IIC_WaitAck(pIIC);IIC_WriteByte(pIIC, data_addr8 );IIC_WaitAck(pIIC); IIC_WriteByte(pIIC, data_addr ); //写数据地址IIC_WaitAck(pIIC);IIC_Start(pIIC);IIC_WriteByte(pIIC, dev_addr|0x01 );//准备读IIC_WaitAck(pIIC);for(i0;ilen-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_addrg_sAt24c64Work.dev_addr;//器件地址u8 *pDatain_buff;if(len0 || data_addrlenAT24C64_MAX_ADDR)//数据范围检测return 0;I2cDriverStruct *pIICg_sAt24c64Work.tag_iic;while(len0){IIC_Start(pIIC);IIC_WriteByte(pIIC, dev_addr);//写器件地址IIC_WaitAck(pIIC);IIC_WriteByte(pIIC, data_addr8 );IIC_WaitAck(pIIC); IIC_WriteByte(pIIC, data_addr );//写数据地址IIC_WaitAck(pIIC);//继续写while(len0){IIC_WriteByte(pIIC, *pData );IIC_WaitAck(pIIC);len--; pData;data_addr;if(data_addr%320)//写满一页,必须重新启动总线{break;}}IIC_Stop(pIIC); delay_ms(5);//适当延时}return len;
}
四、驱动应用 应用层就是初始化然后读写了没什么太复杂的东西。以后还会接触一个FLASH存储器那个需要整页先擦除才能写入容量比较大而EEPROM不需要这个步骤某个地址可以直接重复写入但是它的容量比较小适合存储一些参数信息。