其他分享
首页 > 其他分享> > STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

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

作者:互联网

目录

AT24C系列

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

与其他存储器件相比

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

AT24C的设备地址和存储地址

设备地址

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

AT24C01 - AT24C16

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

AT24C32, AT24C64

AT24C128, AT24C256, AT24C512

AT24C1024

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

注意

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

接线

对于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("\r\n");
        // 间隔1秒
        SYS_Delay(1000);
    }
}

代码地址

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("\r\n");
        SYS_Delay(1000);
    }
}

代码地址

标签:UART1,STC8H,地址,AT24C,GPIO,I2C,AT24C32
来源: https://www.cnblogs.com/milton/p/16441549.html