STM32驱动AT24CXX系列芯片

发布者:zukeq2009最新更新时间:2017-01-13 来源: eefocus关键字:STM32  AT24CXX系列 手机看文章 扫描二维码
随时随地手机看文章

AT24Cxx系列EEPROM是由美国Mcrochip公司出品,1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms,典型时间为5ms)的。串行E2PROM一般具有两种写入方式,一种是字节写入方式,还有另一种页写入方式。允许在一个写周期内同时对1个字节到一页的若干字节的编程写入,1页的大小取决于芯片内页寄存器的大小。其中,AT24C01具有8字节数据的页面写能力,AT24C02/04/08/16具有16字节数据的页面写能力,AT24C32/64具有32字节数据的页面写能力

AT24CXX的驱动是基于IIC的,在基本的IIC上加入了一些通讯协议,具体如下

1.随机写


主器件发送起始命令和从器件地址
信息(R/W 位置 0)给从器件,主器件在收到从器件产生应答信号后,主器件发送 1 个 8 位字节地
址写入 AT24C01/02/04/08/16 的地址指针,对于 AT24C31/64/128/256 来说,所不同的是主器件发
送两个 8 位地址字写入 AT24C32/64/128/256 的地址指针。主器件在收到从器件的另一个应答信号
后,再发送数据到被寻址的存储单元。AT24Cxx 再次应答,并在主器件产生停止信号后开始内部
数据的擦写,在内部擦写过程中,AT24Cxx 不再应答主器件的任何请求

2.页写


。在页写模式下,AT24C01/02/04/08/16/32/64/128/256 
可一次写入 8 /16/16/16/16/32/32/64/64 个字节数据。页写操作的启动和字节写一样,不同的是在
于传送了一字节数据后并不产生停止信号。主器件被允许发送 P(AT24C01:P=7;
AT24C02/04/08/16: P=15;AT24C32/64:P=31;AT24C128/256:P=63)个额外的字节。每发送
一个字节数据后 AT24Cxx 产生一个应答位, 且内部低位地址加 1,高位保持不变。如果在发送停
止信号之前主器件发送超过 P+1 个字节,地址计数器将自动翻转,先前写入的数据被覆盖。 接
收到 P+1 字节数据和主器件发送的停止信号后,AT24Cxx 启动内部写周期将数据写到数据区。 所
有接收的数据在一个写周期内写入 AT24Cxx

3.立即读


也就是说,立即读取读取的是存储器内部指针的当前数据,不需要我们设定地址

4.随机读


随机读操作允许主器件对寄存器的任
意字 节进行读操作,主器件首先通过发送起始信号、从器件地址和它想读取的字节数据的地
址执行一个伪写操作。在 AT24Cxx 应答之后,主器件重新发送起始信号和从器件地址,此时
R/W 位置 1, AT24CXX 响应并发送应答信号,然后输出所要求的一个 8 位字节数据,主器件
不发送应答信号但产生一个停止信号。 

随机读需要设定需要读的地址,然后有一次伪写入过程,这个伪写入是为了修改存储器内部的工作指针

5.顺序读


。顺序读操作可通过立即读或选择性读操作启
动。在 AT24Cxx 发送完一个 8 位字节数据后,主器件产生一个应答信号来响应,告知 AT24CXX
主器件要求更多的数据,对应每个主机产生的应答信号 AT24Cxx 将发送一个 8 位数据字节。当
主器件不发送应答信号而发送停止位时结束此操作。 从 AT24Cxx 输出的数据按顺序由 N 到 N+1
输出。读操作时地址计数器在 AT24Cxx 整个地址内增加,这样整个寄存器区域在可在一个读操
作内全部读出。当读取的字节超过 E(AT24C01,E=127;AT24C02,E=255;AT24C04,E=511;
AT24C08,E=1023;AT24C16,E=2047;AT24C32,E=4095;AT24C64,E=8191;AT24C128,
E=16383;AT24C256,E=32767)计数器将翻转到零并继续输出数据字节

顺序读其实就是在前两个的基础上,一个数据读完了不发送noack二十发送ACK这样就可以一直读下去,需要自己计数因为存储器内部指针会自动循环的


所以只要按照时序图的标准来祝贺IIC基础驱动,就能实现一个存储器的驱动了

代码如下


#ifndef __24CXX_H
#define __24CXX_H
#include "iic.h"
#include "delay.h"

#define AT24C01		127
#define AT24C02		255
#define AT24C04		511
#define AT24C08		1023
#define AT24C16		2047
#define AT24C32		4095
#define AT24C64	    8191
#define AT24C128	16383
#define AT24C256	32767  

#define EE_TYPE AT24C02

#define AT_ADDR		0xa0

#define AT_CHECK_ADDR	0X00
#define AT_CHECK_VALUE	0X52


u8 At24cxxReadOneByte(u16 ReadAddr);							//指定地址读取一个字节


void At24cxxWriteOneByte(u16 WriteAddr,u8 DataToWrite);		//指定地址写入一个字节


void At24cxxWriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len);//指定地址开始写入指定长度的数据


u32 At24cxxReadLenByte(u16 ReadAddr,u8 Len);					//指定地址开始读取指定长度数据


void At24cxxWrite(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite);	//从指定地址开始写入指定长度的数据


void At24cxxRead(u16 ReadAddr,u8 *pBuffer,u16 NumToRead);   	//从指定地址开始读出指定长度的数据



u8 At24cxxCheck(void);  //检查器件


void At24cxxInit(void); //初始化IIC


#endif

 

#include "24cxx.h" 										 


//初始化IIC接口
void At24cxxInit(void)
{
    IIcInit();
}


//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到的数据
u8 At24cxxReadOneByte(u16 ReadAddr)
{				  
    u8 temp=0;		  	    																 
    IIcStart();  
    if(EE_TYPE>AT24C16)
    {
        IIcSendByte(AT_ADDR);	   //发送写命令
        IIcWaitAck();
        IIcSendByte(ReadAddr>>8);//发送高地址	    
    }else IIcSendByte(AT_ADDR+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据 	   
    IIcWaitAck(); 
    IIcSendByte(ReadAddr%256);   //发送低地址
    IIcWaitAck();	    
    IIcStart();  	 	   
    IIcSendByte(AT_ADDR+1);           //进入接收模式			   
    IIcWaitAck();	 
    temp=IIcReadByte(0);		   
    IIcStop();//产生一个停止条件	    
    return temp;
}


//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址    
//DataToWrite:要写入的数据
void At24cxxWriteOneByte(u16 WriteAddr,u8 DataToWrite)
{				   	  	    																 
    IIcStart();  
    if(EE_TYPE>AT24C16)
    {
        IIcSendByte(AT_ADDR);	    //发送写命令
        IIcWaitAck();
        IIcSendByte(WriteAddr>>8);//发送高地址	  
    }else IIcSendByte(AT_ADDR+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据 	 
    IIcWaitAck();	   
    IIcSendByte(WriteAddr%256);   //发送低地址
    IIcWaitAck(); 	 										  		   
    IIcSendByte(DataToWrite);     //发送字节							   
    IIcWaitAck();  		    	   
    IIcStop();//产生一个停止条件 
    DelayMs(10);	 
}


//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
//WriteAddr  :开始写入的地址  
//DataToWrite:数据数组首地址
//Len        :要写入数据的长度2,4
void At24cxxWriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
{  	
    u8 t;
    for(t=0;t>(8*t))&0xff);
    }												    
}

//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
//ReadAddr   :开始读出的地址 
//返回值     :数据
//Len        :要读出数据的长度2,4
u32 At24cxxReadLenByte(u16 ReadAddr,u8 Len)
{  	
    u8 t;
    u32 temp=0;
    for(t=0;t


关键字:STM32  AT24CXX系列 引用地址:STM32驱动AT24CXX系列芯片

上一篇:STM32标准IIC驱动
下一篇:STM32驱动W25X64存储器

推荐阅读最新更新时间:2024-03-16 15:30

STM32 DS18B20代码详解
DS18B20是最常用来学习某一个新的开发工具的,程序都是大同小异,主要是要注意时序中的延时要准确,指令要正确,这里记录一下! ------------------第一部分是--------ds18b20.h---------------------- #ifndef __DS18B20_H #define __DS18B20_H #include stm32f10x.h #include bsp_SysTick.h //精确延时函数头文件----参考http://blog.csdn.net/xuxuechen/article/details/40783209这个看一下 #define HIGH 1 #define
[单片机]
<font color='red'>STM32</font> DS18B20代码详解
基于STM32的嵌入式双目图像采集系统设计
1 引言 随着图像处理技术及嵌入式系统的发展,利用嵌入式系统进行图像处理,已使如视频监控、视频电话和视频会议等应用成为可能。嵌入式系统上进行图像采集则是实现这些应用的前提[1~2]。 双目立体视觉通常由两个摄像头从两个不同的角度,同时获取外界物体的两幅图像,或由单独一个摄像头在不同时间、不同位置获取外界物体的两幅图像,并基于视差的原理来获取外界物体的三维几何信息,复现外界物体的形状和位置。 目前已有很多方案实现在嵌入式平台上的图像采集。本文基于嵌入式的图像采集系统选择了意法半导体(ST)公司生产的STM32F103ZET6芯片为主控芯片,FIFO结构的AL422B芯片实现图像数据缓存,SD卡实现图像存储以及四线制电阻触摸屏实
[单片机]
基于<font color='red'>STM32</font>的嵌入式双目图像采集系统设计
基于STM32、FreeRTOS实现硬件看门狗+软件看门狗监测多任务的思路
我们都知道硬件看门狗的目的:是用来监测系统,防止系统死机,并在死机的情况下使其系统复位重启。 嵌入式专栏 1 在RTOS操作系统中,如果任务(线程)较多,出现高优先级任务长时间占用CPU资源,低优先级任务长时间得不到执行这种想象,那么我们的系统就是具有“Bug”的系统。 如上描述,假如我们的线程没有死机,只是长时间得不到执行。在这种异常情况下,我们又不希望系统复位,只希望执行特定代码,那我们该如何来避免这种问题呢? 关于看门狗硬件看门狗:利用一个 定时器 计数电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时“喂狗”。 因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内喂
[单片机]
STM32 F4 (8) Systick滴答定时器-延时函数讲解
SysTick定时器适用所有的STM32开发板,这节课讲解SysTick定时器产生的 延时函数,STM32开发指南5.1小节有有关SysTick相关的 介绍,在程序中在delay文件夹中,SysTick定时器是内核级别的,这个定时器很简单,主要用来延时和用作实时系统里面的心跳时钟 可以节省单片机资源,SysTick定时器就是系统滴答定时器,是一个24位的倒计数定时器,当他计数到0时就会从RELOD寄存器(重装载寄存器)重新装载计数初值,由此循环。只要 不把他的使能 位清除,他就会永不停息的工作,即使在睡眠模式下也能正常工作。 SysTick定时器它是捆绑在NVIC中,可以产生SysTick异常,SysTick也可以产生中断 ,
[单片机]
<font color='red'>STM32</font> F4 (8) Systick滴答定时器-延时函数讲解
STM32的GPIO输出编程实例之点亮三色LED
一、概述: 1、发光二极管简介 发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算: R = (E - UF)/IF 式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。 2、STM32 GPIO简介 GPIO可以配置成以下8种工作模式: 浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。 上拉输入:上拉输入模式与浮空输入模式相
[单片机]
<font color='red'>STM32</font>的GPIO输出编程实例之点亮三色LED
什么是Bootloader 浅谈STM32中bootloader的内存分配
1. 什么是Bootlo ad er Bootloader是 硬件 启动的引导程序,是运行 操作系统 的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。 2. Bootloader的特点 Bootloader不属于操作系统,一般采用 汇编 语言和 C语言 开发。需要针对特定的硬件平台编写。在移植过程时,首先为开发板移植Bootloader。Bootloader不但依赖于 CPU 的体系架构,而且依赖于 嵌入式系统 板级设备的配置。 3. STM32 中bootloader的内存分配 stm32默认的是从0x08000000开始启动程序,所以bootloader
[单片机]
什么是Bootloader 浅谈<font color='red'>STM32</font>中bootloader的内存分配
STM32常用通信——USART,IIC,SPI,CAN
STM32常用通信 CAN通信 CAN根据两根线上电位差来判断总线电平,总线电平分为显性电平和隐形电平,两者必居其一,发送方通过控制总线电平发送信息给接收方。 显性电平对应逻辑0,两根线压差2.5V左右,隐形电平对应逻辑1,压差为0。总线上可以挂很多单元,显性电平具有优先权,一个单元 显性电平,则总线为显性。CAN总线起止断有120R的电阻,用于做阻抗匹配,减少回波反射。 CAN的位时序: 同步段SS SS 传播时间段PTS 相位缓冲段1 PBS1 BS1 相位缓冲段2 PBS2 BS2 1位分为四段,每段由若干Tq组成, 波特率=1/(Tq+TBS1+TBS2) TBS1=Tq*(TS1 +1) TBS2=Tq*(
[单片机]
<font color='red'>STM32</font>常用通信——USART,IIC,SPI,CAN
怎么使用C语言控制硬件
C语言的应用编程在单片机的领域占了很大一部分,使用的比较多的51单片机和STM32单片机都可以使用MDK软件编写固件。 单片机烧写了固件后可以点亮LED灯,可以驱动ADC检测电压,也可以驱动蜂鸣器发声,这就是简单地控制硬件。稍微复杂一点的,可以驱动NRF2401进行无线的连接,也可以使用ESP8266这类wifi芯片连接网络。 接下来,简单地讲讲如何使用C语言控制硬件。 1、电路连接 简单的模块可以直接使用高低电平来控制,比如红外线发射模块,当你在驱动引脚上的电压达到3.3v,就能发出红外线;然后将电平设置为0v,红外线发射就停止了。 一般而言,单片机的引脚输出电压能够达到3.3v,也是可以点亮红外线LED,但是可能会导致
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved