STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

发布者:cxd88988最新更新时间:2022-07-21 来源: csdn关键字:I2C驱动  AT24C08 手机看文章 扫描二维码
随时随地手机看文章

AT24C系列

AT24C系列是常见的EEPROM存储芯片, 常用于保存参数及掉电记忆的数据


容量: 型号代表了其容量, 从AT24C01到AT24C1024, 存储容量为1K BIT ~ 1024K BIT, 注意单位是Bit, 如果转换为字节就是128字节 ~ 128K字节

电压: 整个系列有2.7V (2.7V至5.5V)和1.8V (1.8V至5.5V)两个版本, 都兼容3.3V和5V

封装: 8-lead PDIP, 8-lead JEDEC SOIC, 8-lead MAP, 5-lead SOT23, 8-lead TSSOP 和 8-ball dBGA2

与其他存储器件相比


容量小

皮实, 几近无限的擦写次数: 10万次以上, 典型值为百万

超长的数据保持: 40年以上

工作温度范围: 工业级[-55℃,125℃]

I2C总线, 只需要SCL和SDA两个接口, 并且可以和其他I2C设备复用

支持写保护

因为这些特点, AT24C常用于一些容量小但是稳定性要求高, 并且需要反复擦写的场景.


AT24C的设备地址和存储地址

设备地址

AT24C的设备地址都是一个字节, 以二进制1010开头, 通过A0,A1,A2这三个pin进行调整. 根据容量不同, 设备地址和寻址范围有区别


AT24C01 - AT24C16

这个系列的存储地址只有一个字节, 所以内存寻址只有256字节(2048 bit), 对于AT24C01, AT24C02可以直接寻址, 对于更大容量的型号, 需要结合设备地址对内存地址分page访问


AT24C01, AT24C02: 设备地址 0xA0 - 0xAE, 第8位是R/W, 同一个I2C总线上可以并存8个同类设备

AT24C04: 0xA0 - 0xAC, 第7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存4个同类设备

AT24C08: 0XA0 - 0xA8, 第6,7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存2个同类设备

AT24C16: 0XA0, 第5, 6,7位是page选择, 第8位是R/W, 同一个I2C总线上只能存在1个同类设备

AT24C32, AT24C64

从这个容量开始, 存储地址变成两个字节

设备地址 0xA0 - 0xAE, 第8位是R/W, 同一个I2C总线上可以并存8个同类设备

AT24C128, AT24C256, AT24C512

设备地址 0xA0 - 0xA6, 第5位固定为0, 第8位是R/W, 同一个I2C总线上可以并存4个同类设备

存储地址两个字节

AT24C1024

设备地址 0xA0 - 0xA4, 第5位固定为0, 第7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存2个同类设备

存储地址两个字节, 所以内存寻址只有64K字节, 128K需要分两个page进行访问

通过STC8H访问AT24C系列存储芯片

注意

访问AT24C时I2C总线的频率不能太高.


AT24C系列的I2C总线最高频率是400KHz(2.7V), 在1.8V时频率会降到100KHz

市面上的兼容芯片可能会达不到前面的指标

STC8H系列的主频基本上从24MHz起步, 甚至直接运行在36.864MHz上

STC8H I2C总线的频率是基于FOSC计算的, 在最初的调试阶段, 务必设置一个较大的预分频, 这样可以确保问题不出在频率过高上


接线

对于DIP8封装, 接线方式都是一样的, 测试使用的是 STC8H3K64S2, 可以直接替换为 STC8H 其它型号, 除了下面的4个pin, 还需要选择将A0, A1, A2 接GND或接VCC


P32   -> SCL

P33   -> SDA

GND   -> GND

3.3V  -> VCC


AT24C08访问示例

这个例子演示了单字节存储地址系列型号的访问方式


#include "fw_hal.h"


// 设置地址 0xA0, 对应A0,A1,A2三个pin都接地, 测试中根据自己的接线修改

#define AT24C_ADDR  0xA0


__CODE int8_t dat[20] = {0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB};


// I2C初始化

void I2C_Init(void)

{

    // 主设备模式

    I2C_SetWorkMode(I2C_WorkMode_Master);

    /**

     * I2C 总线频率 = FOSC / 2 / (__prescaler__ * 2 + 4) 这里设成最大值0x3F

    */

    I2C_SetClockPrescaler(0x3F);

    // 选择I2C端口

    I2C_SetPort(I2C_AlterPort_P32_P33);

    // 启用 I2C

    I2C_SetEnabled(HAL_State_ON);

}


// GPIO初始化

void GPIO_Init(void)

{

    // SDA

    GPIO_P3_SetMode(GPIO_Pin_3, GPIO_Mode_InOut_QBD);

    // SCL

    GPIO_P3_SetMode(GPIO_Pin_2, GPIO_Mode_Output_PP);

}


int main(void)

{

    uint8_t offset, i, buf[20];


    SYS_SetClock();

    // 开启 UART1, baud 115200 with Timer2, 1T mode, no interrupt

    UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);


    GPIO_Init();

    I2C_Init();

    // 对地址0x00连续写入12个字节

    I2C_Write(AT24C_ADDR, 0x00, dat, 12);


    while(1)

    {

    // 分4次, 起始地址递增, 每次连续读出6个字节并通过串口输出

        for (offset = 0; offset < 4; offset++)

        {

            I2C_Read(AT24C_ADDR, offset, buf, 6);

            for (i = 0; i < 6; i++)

            {

                UART1_TxHex(buf[i]);

                UART1_TxChar(':');

            }

            UART1_TxString("  ");

            SYS_Delay(10);

        }

        UART1_TxString("rn");

        // 间隔1秒

        SYS_Delay(1000);

    }

}


代码地址


GitHub https://github.com/IOsetting/FwLib_STC8/blob/master/demo/i2c/at24c/at24c08_stc8h3k.c

Gitee https://gitee.com/iosetting/fw-lib_-stc8/blob/master/demo/i2c/at24c/at24c08_stc8h3k.c

AT24C32访问示例

这个例子演示了双字节存储地址系列型号的访问方式


#include "fw_hal.h"


// AT24C device address, change according to the voltage level of A0/A1/A2

#define AT24C_ADDR  0xA0

// Test data

__CODE int8_t dat[20] = {0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB};


void I2C_Init(void)

{

    // Master mode

    I2C_SetWorkMode(I2C_WorkMode_Master);

    /**

     * I2C clock = FOSC / 2 / (__prescaler__ * 2 + 4)

    */

    I2C_SetClockPrescaler(0x3F);

    // Switch alternative port

    I2C_SetPort(I2C_AlterPort_P32_P33);

    // Start I2C

    I2C_SetEnabled(HAL_State_ON);

}


void GPIO_Init(void)

{

    // SDA

    GPIO_P3_SetMode(GPIO_Pin_3, GPIO_Mode_InOut_QBD);

    // SCL

    GPIO_P3_SetMode(GPIO_Pin_2, GPIO_Mode_Output_PP);

}


int main(void)

{

    uint8_t offset, i, buf[20];


    SYS_SetClock();

    // UART1 configuration: baud 115200 with Timer2, 1T mode, no interrupt

    UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);


    GPIO_Init();

    I2C_Init();

    // 与AT24C08示例的区别在于使用了16bit地址

    I2C_Write16BitAddr(AT24C_ADDR, 0x0000, dat, 12);


    while(1)

    {

        for (offset = 0; offset < 4; offset++)

        {

        // 与AT24C08示例的区别在于使用了16bit地址

            I2C_Read16BitAddr(AT24C_ADDR, 0x0000|offset, buf, 6);

            for (i = 0; i < 6; i++)

            {

                UART1_TxHex(buf[i]);

                UART1_TxChar(':');

            }

            UART1_TxString("  ");

            SYS_Delay(10);

        }

        UART1_TxString("rn");

        SYS_Delay(1000);

    }

}


代码地址


GitHub https://github.com/IOsetting/FwLib_STC8/blob/master/demo/i2c/at24c/at24c32_stc8h3k.c

Gitee https://gitee.com/iosetting/fw-lib_-stc8/blob/master/demo/i2c/at24c/at24c32_stc8h3k.c


关键字:I2C驱动  AT24C08 引用地址:STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

上一篇:STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片
下一篇:MOS管实现的STC自动下载电路

推荐阅读最新更新时间:2024-11-04 14:08

C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)
/* 名称:C51IO口模拟I2C总线驱动EEPROM(AT24C16) 说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线。它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据,SDA数据总线用来发送数据(或地址)。 和SPI总线不同的是,I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了,无非是通过IO口模拟产生所需信号 (如通信开始信号是SCL为高时,SDA产生一个下降沿信号。) 驱动程序中有 具体的说明。 */ //定义I2C相关变量 sbit SCL=P2^1; //I2C 时钟
[单片机]
C51单片机模拟I2C总线驱动程序设计(1)
/********************************** I2C 总线驱动 ****************************** 模块名:I2C 总线驱动 型号:I2C 功能描述: 此模块包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能 很方便的与用户程序进行连接并扩展。需要注意的是,函数是采用延时方法产生 SCL 脉冲, 对高晶振频率要做一定的修改!!在写 E2PROM 的时候一定要延时!!! 说明: 1us机器周期,晶振频率要小于12MHz 返回1:则操作成功,返回0:则操作失败。 sla为器件从地址,suba为器件子地址。 ********
[单片机]
将数据0x0f写入AT24C08再读出送P0口显示C语言程序设计
//将数据 0x0f 写入AT24C08再读出送P0口显示 #include reg52.h // 包含51单片机寄存器定义的头文件 #include intrins.h //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写入操作,0xa1即为1010 0000B sbit SDA=P3^5; //将串行数据总线SDA位定义在为P3.5引脚 sbit SCL=P3^4; //将串行时钟总线SDA位定义在为P3.4引脚 /**************
[单片机]
STM8L驱动I2C类型的12864
原理 之前没有操作过12864这种类型的屏,但是,操作过其他类型的,原理都是相通的。12864是拥有128x64像素点这类屏幕的称号吧。屏幕有64行,128列;每个汉字是16x16,所以一个这样的屏,最多可以显示4x8的汉字或者8x16的字符。 我使用的是不带字库的I2C接口的屏幕,主芯片是ST7656。这样的屏,只能写,不能读。先配置屏幕,然后通过字模制作软件制作出待显示内容的像素数字,最后,通过数据线传送给屏幕显示。了解了原理后,接下来就根据主芯片的数据手册进行配置屏幕就好了。 硬件连线 CS:片选 RST: 复位 RS:数据或命令选择 SDA:I2C数据线 SCL:I2C时钟线 I2C采用的是软件模拟的
[单片机]
ST 发布世界第一个采用SO8窄封装的高密度EEPROM存储器芯片
高密度EEPROM存储器配高速接口是数字电视、游戏机、汽车信息娱乐、医疗设备和计算机外设的参数存储应用的理想解决方案 中国,2007年8月1日 — 世界非易失性存储器IC的领导厂商意法半导体(纽约证券交易所代码:STM)今天推出一款采用外壳宽度仅为150-mil (3.8mm)的微型SO8N封装、支持SPI(串行外设接口)总线的1兆位串口EEPROM存储器芯片— 目前市场上唯一的在如此小的封装内放进如此高密度的SPI串口EEPROM存储器。除窄封装外,新产品M95M01还有一个SO8W宽封装版。该产品是为参数快速变化的存储应用专门设计的,例如:数字电视、DVD影碟机、游戏机以及医疗设备、工控机、汽车信息娱乐和计算机外设等。存储
[新品]
TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)
内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M NandFlash:256M 内存:64M) 摘要 这里并不深入分析Linux下I2C驱动的实现,只是以TQ2440硬件平台为例分析I2C驱动的两种方法。 第一种方法: 使用S3C2440自带的I2C控制器实现,这个kernel已经支持,我们只需要配置即可。 第二种方法: 使用GPIO模拟,这个在kernel中已经集成,实现代码在drivers/i2c/busses/i2c-gpio.c。 在TQ2440平台上有一个EEPROM,型号是:AT24C02C。我们就以驱动at24c02c为例。 硬件原理
[单片机]
TQ2440学习笔记——Linux上<font color='red'>I2C</font><font color='red'>驱动</font>的两种实现方法(1)
STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
Nokia5110 LCD 有片很早以前买的Nokia5110 LCD一直在纸箱里吃灰. 可能是买其它配件时送的? 没有合适的用途一直扔在那里, 偶尔见到总会想什么时候有空给它点一下. 外观长这样. 其实市面上这种模块有几个不同的版本, 另一种版本是上下有两排排针, 方便不同的PCB布局, 功能是一样的. 单色LCD, 84x48像素, 带4颗蓝色LED灯珠作为背光. 显示芯片是Philips PCD8544. 因为是Nokia5110手机的显示屏, 所以一般都叫它Nokia5110 LCD. 在2014年大屏手机还没流行的年代, 这是个相当不错的显示输出设备, 相对于1602和2004LCD, 体积小分辨率高, 便宜
[单片机]
<font color='red'>STC8H</font><font color='red'>开发</font>(十): SPI<font color='red'>驱动</font>Nokia5110 LCD(PCD8544)
关于51单片机字符串 EEPROM存储与读取的问题
题目如下 通过串口助手控制 LCD 显示屏,通过 LCD1602 显示并保存在 EEPROM 中,实现 数据的掉电保存(例 如:串口向单片机发送一串英文字符,该字符在 LCD 上显示出 来,若按下 k1 则实现数据的保存,按下 k2 实 现读取上次保存的数据,显示在 1602 上) 效果如下 #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 #include i2c.h #include string.h typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbi
[单片机]
关于51单片机字符串 <font color='red'>EEPROM</font><font color='red'>存储</font>与读取的问题
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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