您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > I2C接口的EEPROM-24C64芯片的驱动方法
I2C接口的EEPROM24C64芯片的驱动方法与93C46类似的,24C64也是EEPROM,但不同的是24C64是I2C接口的,容量也要更大些,用来存储较大容量的数据,甚至在某些单片机中可以用作程序存储器。24C64提供65536个位,它们是以字节方式进行组织的。通过设置不同的地址,可以实现多达8个芯片共享两线总线。它被广泛应用于工业、化工等需要低功耗与低电压的领域。同时,它还提供诸如4.5V~5.5V、2.7V~5.5V、2.5V~5.5V与1.8V~5.5V各种工作电压范围的芯片,从而使其应用更加通用。24C64的引脚定义:引脚功能详细描述:24C64的功能框图:引脚名称功能A0~A2地址输入SDA串行数据SCL串行时钟输入WP写保护引脚功能描述:串行时钟(SCL):在SCL的上升沿数据写入芯片中,在下降沿从芯片中读出数据。串行数据(SDA):SDA用作双向数据传输。这个引脚是漏极开路驱动,需要加上拉电阻。设备地址(A2,A1,A0):A2~A0是设备地址设置引脚,可以通过接高或接低来设置不同的地址,也可以直接悬空。设置为不同地址时最多可以在同一总线上存在多达8个芯片。当这些引脚悬空时,默认地址为0。写保护(WP):当此引脚接到GND上时,允许正常的写操作。当WP接到VCC时,所有的写操作都是被禁止的。如果悬空,则WP在内部被拉到GND。24C64的组织方式:24C64在内部被组织为256个页,每个页32个字节。可以按字节来进行操作,地址为13位。24C64的操作方法:24C64是采用I2C接口来进行数据传输的,在这里不再介绍I2C接口数据传输的相关内容,具体的I2C总线协议在相关章节有详细讲解,敬请翻阅。下面只针对于24C64的操作方法进行讲解。1)设备寻址在开始条件使芯片使能后,需要给其写入一个8位的设备地址码,以使某一芯片被命中。在地址码的开头有两个“10”序列,共4位,然后是3位的地址,最后是1位的读写标识位。具体的地址码结构如下:24C64使用3个设备地址位A2、A1、A0使多达8个芯片同时存在于一条总线上。这个地址码被每一个芯片与自身设置的地址相比较。第8位是读/写操作选择位。如果是1的话,一个读操作将被初始化,而如果是0的话,则一个写操作将被初始化。2)写操作1.任意字节写:在进行写操作时,在设备地址与回复后,需要写入两个8位地址。在收到地址后,芯片会返回一个低电平,然后就可以写入一个8位数据。在收到这个8位数据后,芯片会返回一个低电平,此时应产生一个停止条件。芯片开始自身的读入过程。在读入过程中,所有的数据输入都是无效的,芯片也不会给予回复。字节写操作的时序图如下:字节写的程序:voidAT24C64_W(void*mcu_address,unsignedintAT24C64_address,unsignedintcount){while(count){I2C_Start();/*I2C_Send_Byte(0xa0+AT24C64_address/256*2);*//*24C16USE*/I2C_Send_Byte(0xa0);I2C_Send_Byte(AT24C64_address/256);I2C_Send_Byte(AT24C64_address%256);I2C_Send_Byte(*(unsignedchar*)mcu_address);I2C_Stop();Delay_N_mS(10);/*waitingforwritecycletobecompleted*/((unsignedchar*)mcu_address)++;AT24C64_address++;}}以上程序通过使用字节写实现数据连续写入。2.页写:24C64也是支持页写的。页写的初始化与字节写是相同的,但是在第一个字节被写进去以后并不产生停止条件,而是可以继续写入31个字节。在每一个字节写入后芯片会返回低电平。最后应产生一个停止条件以终止页写操作。内部数据地址的低5位在每接收一个字节后自增,而高位不会自增,保持该页在存储器中的地址。如果有超过32个字节被写入,则页地址会回滚到页头,覆盖前面的数据。页写的时序图如下:页写的程序:voidAT24C64_WP(void*mcu_address,unsignedintAT24C64_address,unsignedintcount){I2C_Start();I2C_Send_Byte(0xa0);I2C_Send_Byte(AT24C64_address/256);I2C_Send_Byte(AT24C64_address%256);while(count){I2C_Send_Byte(*(unsignedchar*)mcu_address);Delay_N_mS(10);/*waitingforwritecycletobecompleted*/((unsignedchar*)mcu_address)++;}I2C_Stop();}3)读操作读操作的初始化与写操作是相同的,唯一不同的是读/写选择位要置为1。读操作有三种:当前地址读、字节读、序列读。1.当前地址读:芯片内部地址计数器记录了最后一次读或写操作后的地址(地址自动加1),这个地址只要芯片电源供给正常就一直有效。在读操作中,当地址到达最后一个地址(最后一个页的最后一个字节)后会自动“回滚”到最开始的位置(第一个页的第一个字节)。而在写操作中,“回滚”则是从当前页的最后一个字节转到该页的第一个字节。当选择位置1后的设备地址码写入芯片,并回应后,当前地址上的数据将会串行输出。此时,单片机应产生一个停止条件。当前地址读的时序图如下:当前地址读的程序:unsignedcharAT24C64_RC(){unsignedchartemp;I2C_Start();I2C_Send_Byte(0xa1);temp=I2C_Receive_Byte();I2C_Nack();I2C_Stop();returntemp;}2.任意字节读:任意字节读需要写入一个地址。当设备地址码与数据地址码写入芯片并得到了回应后,此时单片机必须再产生一个开始条件,随后的操作就与当前地址读相同了。任意字节读的时序图如下:任意字节读的的程序:voidAT24C64_R(void*mcu_address,unsignedintAT24C64_address,unsignedintcount){while(count){I2C_Start();I2C_Send_Byte(0xa0);I2C_Send_Byte(AT24C64_address/256);I2C_Send_Byte(AT24C64_address%256);I2C_Start();I2C_Send_Byte(0xa1);*(unsignedchar*)mcu_address=I2C_Receive_Byte();I2C_Nack();I2C_Stop();((unsignedchar*)mcu_address)++;AT24C64_address++;}}以上程序采用字节读的方式实现从某一地址开始读取count个字节。3.序列读序列读的初始化与当前字节读与任意字节读相同。在单片机收到一个字节后,都要产生一个回应。然后内部地址会自增并可以继续输出数据。当地址到达尽头时,它会自动“回滚”,而序列读操作会继续。当单片机不再产生回应而产生停止条件时,序列读操作终止。序列读的时序图:序列读的程序:voidAT24C64_RS(void*mcu_address,unsignedintcount){I2C_Start();I2C_Send_Byte(0xa1);counter;while(count){*(unsignedchar*)mcu_address=I2C_Receive_Byte();I2C_Ack();((unsignedchar*)mcu_address)++;AT24C64_address++;}*(unsignedchar*)mcu_address=I2C_Receive_Byte();I2C_Nack();I2C_Stop();}以上程序用序列读来实现从当前地址开始读取count个字节。
本文标题:I2C接口的EEPROM-24C64芯片的驱动方法
链接地址:https://www.777doc.com/doc-4727084 .html