精华内容
下载资源
问答
  • 在Arduino项目中使用Atmels EEPROM AT24C32 / AT24C64 / AT24C128 / AT24C256 / AT24C512的库。 有关定义和差异的信息,请参见 。 由Christian Paul撰写,2014年-2015年。该软件根据MIT许可条款发行。 有关详细信息...
  • AT24C64程序

    2015-07-09 10:17:11
    使用STC的12C5A60S2单片机 因为要测试IIC通信协议,研究了好久终于改出来了,本程序适用于AT24c64 E2PROM芯片
  • AT24C64_程序

    2013-05-22 19:43:49
    AT24C64_程序
  • AT24C64A芯片资料

    2010-11-21 11:51:24
    AT24C64A,芯片资料 AT24C64A,芯片资料
  • AT24C64 系列内存程序

    2015-06-19 19:40:35
    AT24C64 系列内存程序 适合AT24C32以上的 内存 本人测试通过
  • 模拟iic驱动,更改移植方便,直接改两个IO口即可
  • 该代码是基于msp430f149单片机通过IIC接口对EEPROM AT24C64读写操作,代码已实验过,注意器件地址。
  • AT24C64驱动程序

    2010-12-28 11:53:14
    AT24C64芯片C语言驱动(51单片机 AVR单片机)
  • 都是官方文档,一篇是英文,官方的,一篇是中文,国内代理公司的。EEPROM芯片AT24C64的datasheet,不要积分,免费下载。
  • ATMEL-AT24C64B,详细的文档资料,开发者必备,英文原版。
  • AT24C64A资料

    2009-01-05 21:25:20
    这是AT24C64A芯片的一些资料,不过是英文的,看起来这里没什么这类的资料啊,我原来是想来找个中文的。。。
  • 基于at24c64的IIC总线协议-里面有详细的介绍,很好的
  • ;=======================================;PIC16C74B单片机与AT24C64通讯;该程序实现的功能是:;将I...
  • AT24C64-EEPROM阅读记录

    2021-05-16 11:07:45
    AT24C64-EEPROM阅读记录 从机地址介绍: 1 0 1 0 A2 A1 A0 R/W 1 0 1 0 0 0 0 N 说明: 1、对于AT24C64,A2 A1 A0必须是0. 2、在Linux设备树里面配置的地址为 1010000 = 0x50 因为最后一位是读写位,所以不...

    AT24C64-EEPROM阅读记录
     
    从机地址介绍:
        1    0    1    0    A2    A1    A0    R/W
        1    0    1    0    0    0    0    N    
        说明:
            1、对于AT24C64,A2 A1 A0必须是0.
            2、在Linux设备树里面配置的地址为 1010000 = 0x50        因为最后一位是读写位,所以不计入地址,因此地址只取高7位。
            
    写操作:
        写字节:
            创建一个start信号,先广播1个R/W为0的从机地址,然后主机发送2个地址字节和1个数据字节,最后再创建一个STOP信号。    
        写页:
            创建一个start信号,先广播1个R/W为0的从机地址,然后主机发送2个地址字节和N个数据字节,最后再创建一个STOP信号。
            注:这里的N如果大于32,那么多于的字节会循环覆盖本页。
            
            
           

    展开全文
  • 该代码,适用于AT24C64所有场合,STM32、51都适用。 51型号 :STC15W4K32S4 存储器:AT24C64 (好像看到说,24c64和24c02不一样,02地址是8位,64地址是16位,所以64不能直接用02的代码) 不要设置开漏模式,使用...

    纠错

    如图,代码中的500us全部改成2us,在写之后加5ms延时就可以了!!!

    0. 序

    从stm32上移植下来的代码,改了间隔时间,证明本代码可移植性很强。

    注意自己的单片机型号,修改间隔时间以正确读写。该代码,适用于AT24C64所有场合,STM32、51都适用。

    51型号 :STC15W4K32S4 

    存储器:AT24C64 (好像看到说,24c64和24c02不一样,02地址是8位,64地址是16位,所以64不能直接用02的代码

    不要设置开漏模式,使用默认的准双向口,代码内容应该是有了读后写操作,所以设置开漏反而无法读写,我在这里卡了2小时。

    1. 注意

    延时,写最少需要800us,其他延时最少需要500us,太短会导致读写不全,读错误结果是FF,写错误就是没写进去

     

    2. 代码

    IIC.c

    #include <IIC.H>
    #include <Delay.h>
    
    sbit SCL=P5^5;
    sbit SDA=P5^4;
    
    
    void EEP_I2c_Start(void)
    {
        SDA=1;
        DelayUs(500);
        SCL=1;
        DelayUs(500);
        SDA=0;
        DelayUs(500);  // hold time start condition (t_HD;STA)
        SCL=0;
        DelayUs(500);
    }
    
    void EEP_I2c_Stop(void)
    {
        SCL=0;
        DelayUs(500);
        SDA=0;
        DelayUs(500);
        SCL=1;
        DelayUs(500);  // hold time start condition (t_HD;STA)
        SDA=1;
        DelayUs(500);
    }
    
    u8 IIC_hostWait_Ack(void)//ack creat from slave
    {
        u8 ucErrTime=0;
    
        SDA=1;
        DelayUs(500);
        SCL=1;
        DelayUs(500);
        while(SDA==1)
        {
            ucErrTime++;
            if(ucErrTime>250)
            {
                EEP_I2c_Stop();
                return 1;
            }
        }
        SCL=0;
        return 0;
    }
    
    /产生ACK应答//4
    void IIC_hostAck(void)
    {
        SCL=0;
        SDA=0;
        DelayUs(500);
        SCL=1;
        DelayUs(500);
        SCL=0;
    }
    /不产生ACK应答	//5
    void IIC_hostNAck(void)
    {
        SCL=0;
        SDA=1;
        DelayUs(500);
        SCL=1;
        DelayUs(500);
        SCL=0;
    }
    /------------6
    void EEP_I2c_WriteByte(u8 txByte)
    {
    
        u8    count;
        SCL=0;
        for(count = 0; count <8; count ++)// shift bit for masking (8 times)
        {
    
            if((txByte<<count)&0x80)
                SDA=1; // masking txByte, write bit to SDA-Line
            else
                SDA=0;
            DelayUs(800);     // data set-up time (t_SU;DAT)
            SCL=1;    // generate clock pulse on SCL
            DelayUs(800);   // SCL high time (t_HIGH)
            SCL=0;
            DelayUs(800);
        }
    
    //check slave ack after send write
    }
    
    /------------7
    u8 EEP_I2c_ReadByte( u8 ack)
    {
    
        u8 rxByte;
        u8 count;
        rxByte = 0x00;
        // release SDA-line
        for(count = 0; count < 8; count++)    // shift bit for masking (8 times)
        {
            SCL=0;                           // start clock on SCL-line
            DelayUs(500);
            SCL=1;
            // SCL high time (t_HIGH)
            rxByte<<=1;
            if(SDA==1)
                rxByte |= 1;             // read bit
            DelayUs(500);                    // data hold time(t_HD;DAT)
        }
    
        //SDA=1;            // release SDA-line
        if (!ack)
            IIC_hostNAck();//发送nACK
        else
            IIC_hostAck(); //发送ACK
        DelayUs(500);
        return rxByte;         // return with no error
    }
    
    
    /*-------------------------------AT24c64---------------------------------------------*/
    
    u8 AT24CXX_ReadOneByte(u16 ReadAddr)
    {
        u8 temp=0;
        EEP_I2c_Start();
        if(EE_TYPE>AT24C16)
        {
            EEP_I2c_WriteByte(0XA0);	   //发送写命令
            IIC_hostWait_Ack();
            EEP_I2c_WriteByte(ReadAddr>>8);//发送高地址
            IIC_hostWait_Ack();
        }
        else
        {
            EEP_I2c_WriteByte(0XA0+((ReadAddr/63999)<<1));   //发送器件地址0XA0,写数据
            IIC_hostWait_Ack();
        }
        EEP_I2c_WriteByte(ReadAddr%63999);   //发送低地址
        IIC_hostWait_Ack();
        EEP_I2c_Start();
        EEP_I2c_WriteByte(0XA1);           //进入接收模式
        IIC_hostWait_Ack();
        temp=EEP_I2c_ReadByte(0);
        EEP_I2c_Stop();//产生一个停止条件
        DelayUs(500);
        return temp;
    }
    /       9
    //AT24CXX  Byte Write
    //WriteAddr  :写入数据的目的地址
    //DataToWrite:要写入的数据
    void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
    {
        u8 i;
        EEP_I2c_Start();
        if(EE_TYPE>AT24C16)
        {
            EEP_I2c_WriteByte(0XA0);	    //发送写命令
            IIC_hostWait_Ack();
            EEP_I2c_WriteByte(WriteAddr>>8);//发送高地址
        }
        else
        {
            EEP_I2c_WriteByte(0XA0+((WriteAddr/63999)<<1));   //发送器件地址0XA0,写数据
        }
        IIC_hostWait_Ack();
        EEP_I2c_WriteByte(WriteAddr%63999);   //发送低地址
        IIC_hostWait_Ack();
        EEP_I2c_WriteByte(DataToWrite);     //发送字节
        IIC_hostWait_Ack();
        EEP_I2c_Stop();//产生一个停止条件
            DelayUs(500);
    
    }
    //在AT24CXX里面的指定地址开始写入长度为Len的word or double word
    //write 16bit or 32 bit data
    //WriteAddr  :开始写入的地址
    //DataToWrite:
    //Len        :len =2 or len=4  ,first high then tow as habit
    //
    void AT24CXX_WriteLenByte(  u16 WriteAddr,u32 DataToWrite,u8 Len)
    {
        u8 t;
        for(t=0; t<Len; t++)
        {
            //AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
            AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*(Len-t-1)))&0xff);
        }
    }
    
    //在AT24CXX里面的指定地址开始读出长度为Len word or double word
    //该函数用于读出16bit或者32bit的数据.
    //ReadAddr   :开始读出的地址
    //返回值     :数据
    //Len        :要读出数据的长度2,4
    u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
    {
        u8 t;
        u32 temp=0;
        for(t=0; t<Len; t++)
        {
            temp<<=8;
            //temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);
            temp+=AT24CXX_ReadOneByte(ReadAddr+t);
        }
        return temp;
    }
    
    //在AT24CXX里面的指定地址开始读出指定个数的数据
    //ReadAddr :24c02 0~255  ,24c16 63999*32
    //pBuffer  :数据数组首地址
    //NumToRead:要读出数据的个数
    void AT24CXX_Read(u16 ReadAddr,char  *pBuffer,u16 NumToRead)
    {
        while(NumToRead)
        {
            *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
            NumToRead--;
        }
    }
    //在AT24CXX里面的指定地址开始写入指定个数的数据
    //WriteAddr :24c02 0~255
    //pBuffer   :数据数组首地址
    //NumToWrite:要写入数据的个数
    void AT24CXX_Write(u16 WriteAddr,char *pBuffer,u16 NumToWrite)
    {
        while(NumToWrite--)
        {
            AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
            WriteAddr++;
            pBuffer++;
        }
    }
    
    
    

    IIC.h

    #ifndef IIC_H
    #define IIC_H
    #include <STC15.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  AT24C64
    
    
    void EEP_I2c_Start(void);
    void EEP_I2c_Stop(void);
    u8 IIC_hostWait_Ack(void);
    void IIC_hostAck(void);
    void IIC_hostNAck(void);
    void EEP_I2c_WriteByte(u8 txByte);
    u8 EEP_I2c_ReadByte( u8 ack);
    
    /*-------------------------------AT24c64---------------------------------------------*/
    u8 AT24CXX_ReadOneByte(u16 ReadAddr);
    void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite);
    void AT24CXX_WriteLenByte(  u16 WriteAddr,u32 DataToWrite,u8 Len);
    u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len);
    void AT24CXX_Read(u16 ReadAddr,char  *pBuffer,u16 NumToRead);
    void AT24CXX_Write(u16 WriteAddr,char *pBuffer,u16 NumToWrite);
    
    
    
    
    #endif
    
    

    Delay.h

    #include <Delay.h>
    
    //*==============================================|=====================*
    //*函数原型:
    //*功能描述:    微妙级延时函数
    //*说    明:	晶振11.0592Mhz 12T 函数体中单独放_nop_()表示1us
    //*测    试:	已测试,方规 逻辑分析仪测试长度如下:
    //	DelayUs(3);				//延时2.5us
    //	DelayUs(5);				//延时3.5us
    //	DelayUs(10);			//延时4.5us
    //	DelayUs(30);			//延时53us
    //	DelayUs(100);			//延时167us
    //	DelayUs(10);
    //	DelayUs(10);
    //	DelayUs(10);
    //	DelayUs(10);
    //	DelayUs(10);			//延时21us
    //	DelayUs(500);			//延时819us
    //	DelayMs(500);			//延时491
    //*结    论:	此函数做不到精确延时,以上数据供以后参考,对时序要求严格的驱动,
    //*				一定要使用仪器来测量,此延时跟晶振和指令周期都有关系
    //*==============================================|=====================*
    void DelayUs(unsigned int us)		//1000 -> 1.7ms
    {
    	unsigned int j;		
    	if(us==3){
    		_nop_();_nop_();_nop_();
    		return;
    	}	
    	if(us==5){
    		_nop_();_nop_();_nop_();_nop_();_nop_();
    		return;
    	}
    	if(us==10){
    		_nop_();_nop_();_nop_();_nop_();_nop_();
    		_nop_();_nop_();_nop_();_nop_();_nop_();
    		return;
    	}
    	for(j=0;j<us;j++){
    		_nop_();
    	}
    }
    
    //*==============================================|=====================*
    //*函数原型:    
    //*功能描述:    毫秒级延时函数
    //*说    明:	晶振11.0592Mhz 12T 1000表示1秒延时
    //*测    试:	已测试,方规
    //*==============================================|=====================*
    void DelayMs(unsigned int ms)		//1000 -> 1秒
    {
    	unsigned int i=0;
    	for(i=0;i<ms;i++){
    		DelayUs(600);
    	}
    }

     

    展开全文
  • at24c64 的芯片资料

    2009-08-21 16:56:54
    2-Wire Serial EEPROM 64K (8192 x 8) AT24C64B
  • AT24C64 i2c eeprom

    2018-04-23 16:23:38
    The AT24C32A/64A provides 32,768/65,536 bits of serial electrically erasable and programmable read only memory (EEPROM) organized as 4096/8192 words of 8 bits each. The device’s cascadable feature ...
  • Proteus8.9的VSM Studio使用的SDCC仿真_STC15W4k32S4_013_iic_06_AT24C64编程代码和仿真操作实验
  • 以前一直用FALSH,结果折腾整整一天,不管怎么写,读出来的都是FF,网上的帖子都翻烂了,就在我绝望的时候,我发现这个破玩意竟然和Flash有个不一样的地方,flash写保护接高,我就理所当然的把AT24C64的写保护也接高...

    这是一个经验贴,我第一次画这个芯片,以前一直用FALSH,结果折腾整整一天,不管怎么写,读出来的都是FF,网上的帖子都翻烂了,就在我绝望的时候,我发现这个破玩意竟然和Flash有个不一样的地方,flash写保护接高,我就理所当然的把AT24C64的写保护也接高了,但是,其事,它要写低 内部下拉,悬空也可以,我就他妈的……离谱啊……
    补充,一直以为是STM IIC的bug,差点就软件模拟IIC了,但是Hal库的貌似挺好用的

    展开全文
  • AT24C64读写程序(C语言,TI msp430单片机亲测)
  • 一,打开文件(可以随文下载放置在...四,编辑main.c 代码如Proteus8.9 VSM Studio SDCC编译器仿真STC15W4K32S4系列013_iic_06_AT24C64 (如下图6所示) 图6 五,Main.c 代码: /* Main.c file generated by New Projec

    一,打开文件(可以随文下载放置在文档中打开)。(如下图1所示)
    在这里插入图片描述
    图1

    二,调整原理图大小,适合可视,另存工程文件。(如下图2,3,4所示)
    在这里插入图片描述
    图2

    在这里插入图片描述
    图3

    在这里插入图片描述
    图4

    三,点击Source Code标签。(如下图5所示)
    在这里插入图片描述
    图5

    四,编辑main.c 代码如Proteus8.9 VSM Studio SDCC编译器仿真STC15W4K32S4系列013_iic_06_AT24C64 (如下图6所示)
    在这里插入图片描述
    图6

    五,Main.c 代码:

    /* Main.c file generated by New Project wizard
    *

    • Created: 周二 6月 2 2020
    • Processor: STC15W4K32S4
    • Compiler: SDCC for 8051
      */

    #include “mcomds.h”

    u8 __code table[] = “Write:”;
    u8 __code table2[] = “Read :”;

    int main(void) {
    u16 i;
    init();

    set_lcd(0x80);//把位置设置为第一行第一位
    delay(50);
    for(i=0;i<6;i++) set_data(table[i]);
    
    set_lcd(0x80 + 7);
    delay(200);
    set_data('H');	
    set_data('e');
    set_data('l');
    set_data('l');
    set_data('o');
    write_at_addr(0x0000,'H');
    write_at_addr(0x0001,'e');
    write_at_addr(0x0002,'l');
    write_at_addr(0x0003,'l');
    write_at_addr(0x0004,'o');
    
    delay(5);	
    
    
    set_lcd(0x80+0x40);//把位置设置到第二行第一位	 
    for(i=0;i<6;i++) set_data(table2[i]);
    
    set_lcd(0x80+0x40+7);
    delay(200);
    set_data( read_at_addr(0) );
    set_data( read_at_addr(1) );
    set_data( read_at_addr(2) );
    set_data( read_at_addr(3) );
    set_data( read_at_addr(4) ); 
    
    
    while(1) {
    	
    	delay(2000);
    }
    

    }
    comds.h:

    /* Main.c file generated by New Project wizard
    *Coder: Ziegler Yin

    • Created: 周日 5月 3 2020
    • Processor: AT89C51RD2
    • Compiler: Keil for 8051
      */

    #ifndef _MCOMDS_H
    #define _MCOMDS_H

    #include “mySTC01.h”
    #include “INTRINS.H”

    #define u8 unsigned char
    #define u16 unsigned int

    __sbit __at 0xB3 port_rs ;
    __sbit __at 0xB4 port_rw ;
    __sbit __at 0xB5 port_en ;

    __sbit __at 0x90 scl ;
    __sbit __at 0x91 sda ;

    //sbit port_rs = P3 ^ 4; //数据/命令选择端,1是数据,0是命令(状态)
    //sbit port_rw = P3 ^ 5; //读写控制,1是读,0是写
    //sbit port_en = P3 ^ 6; //使能端,高电平允许

    //sbit scl = P1 ^ 0;
    //sbit sda = P1 ^ 1;

    void delay_us(u16 t);
    void delay_ms(u16 t);
    u8 ReadKey(u8 GPIOx, u8 iobt);
    void UInit(void);
    void init(void);
    void delay(u16 t);
    void set_lcd(u8 val);
    void set_data(u8 dat);
    void start(void);
    void stop(void);
    void Ask(void);
    void NoAsk(void);
    void respons(void);
    void write_byte(u8 Data);
    u8 read_byte(void);
    void write_at_addr(u16 addr,u8 dat);
    u8 read_at_addr(u16 addr);

    #endif

    六,点击构建工程按钮,编译工程。(如下图7所示)
    在这里插入图片描述
    图7

    七,点击窗口左下方仿真按钮,可见虚拟AT24C64读写闪烁显示在屏。 (如下图8,9,10所示)
    在这里插入图片描述
    图8

    在这里插入图片描述
    图9
    在这里插入图片描述
    图10

    八,选择release,点击构建工程按钮,编译工程生成Hex文件。(如下图11所示)
    在这里插入图片描述
    图11

    附件下载:https://download.csdn.net/download/kaillen/12494464
    附件Proteus8.9 VSM Studio SDCC编译器仿真STC15W4K32S4系列013_iic_06_AT24C64在已安装Proteus8.9的计算机文件夹中打开即可
    需要进一步了解,请加入QQ群:976235464

    展开全文
  • 该程序采用德州仪器的cc2530单片机,在模拟IIC时序下进行读写,断电复位后串口0打印写入的数据
  • //DISABLE wr /* USER CODE END I2C1_MspInit 1 */ } } 从设备读写 一般的EEPROM,像AT24C02这种小容量的设备,地址都只需要8位,页大小一般是16字节一个页 而像AT24C32C、AT24C64C这种32K、64K字节的大容量EEPROM...
  • 这是基于89C51和FM24C64的仿真程序。里面的代码是经过测试的,没有问题。
  • C语言程序>>AT24C64

    千次阅读 2011-12-22 17:38:52
    程序说明:EEPROM 24C64子程序 注:(1)单片机:AT89S52晶振Fosc:11.0592MHz编程软件:Keil uVision2;  (2)地址为000;容量为8K;I2C 在时钟线为高时数据被写入  (3)I2C 开始信号:在时钟线为高时
  • void AT24C04_Write(uchar adress,uchar tdata) { bit temp; AT24C04_Start(); AT24C04_Write_Byte(0xa0); temp = AT24C04_Ack(); if(temp == 0) AT24C04_Stop(); else { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,745
精华内容 3,098
关键字:

at24c64