本文作者:豆面

如何向AT24C256芯片写入数据?

豆面 2025-02-02 21:52:28 1
如何向AT24C256芯片写入数据?摘要: 硬件连接1、连接引脚:将AT24C256的SCL引脚连接到单片机的SCL引脚,通常为PB10;SDA引脚连接到单片机的SDA引脚,通常为PB11;VCC引脚连接到3.3V或5V电源...

硬件连接

1、连接引脚:将AT24C256的SCL引脚连接到单片机的SCL引脚,通常为PB10;SDA引脚连接到单片机的SDA引脚,通常为PB11;VCC引脚连接到3.3V或5V电源;GND引脚接地;WP引脚可悬空或接地(接地允许写操作,悬空且不连接上拉电阻时芯片内部下拉到地)。

如何向AT24C256芯片写入数据?

2、上拉电阻:在SDA和SCL线上分别接一个上拉电阻,阻值一般为4.7KΩ左右,以确保总线在空闲时保持高电平。

软件编程

1、初始化I2C:使用单片机的I2C库函数进行初始化设置,包括设置通信速率、模式等参数,并使能I2C外设时钟。

2、写入数据

单字节写入:先发送器件地址和写指令,再发送要写入的地址(占2个字节),最后发送写入的字节,向AT24C256内存地址为0的地方写入数据“1”,代码如下:

void AT24C256_WriteByte(uint16_t addr, uint8_t dat)
{
    HAL_I2C_Mem_Write(&hi2c2, AT24C256_ADDR_WRITE, addr, AT24C256_ADDR_LEN, &dat, 1, 0xffff);
    HAL_Delay(AT24C256_WAIT_TIME_UINT);
}

连续写入:如果一次写入的个数超过一页的字节数或者地址计到一页的尾部时,需要处理跨页问题,一般先计算开始页剩余待写入字节数、除去开始页剩下字节数以及末页待写入字节数,然后分页写入。

void AT24C256_WriteMultiByte(uint16_t addr, uint8_t *dat, uint16_t n)
{
    uint16_t i = 0;
    uint16_t cnt = 0;        // 写入字节计数
    uint16_t head;
    uint16_t left;
    uint16_t tail;
    if ((n + addr  1) / AT24C256_PAGE_SIZE == addr / AT24C256_PAGE_SIZE)        // 如果在同一页
    {
        HAL_I2C_Mem_Write(&hi2c2, AT24C256_ADDR_WRITE, addr, AT24C256_ADDR_LEN, dat, n, 0xFFFF);
        HAL_Delay(AT24C256_WAIT_TIME_UINT * n);
    }
    else
    {
        head = (addr / AT24C256_PAGE_SIZE + 1) * AT24C256_PAGE_SIZE  addr;    // 开始页剩余待写入字节数
        left = n  head;        // 除去开始页剩下字节数
        tail = left  left / AT24C256_PAGE_SIZE * AT24C256_PAGE_SIZE;    // 末页待写入字节数
        HAL_I2C_Mem_Write(&hi2c2, AT24C256_ADDR_WRITE, addr, AT24C256_ADDR_LEN, dat, head, 0xffff);
        HAL_Delay(AT24C256_WAIT_TIME_UINT * head);
        for (i = 0; i < left / AT24C256_PAGE_SIZE; i++)
        {
            HAL_I2C_Mem_Write(&hi2c2, AT24C256_ADDR_WRITE, addr + head + i * AT24C256_PAGE_SIZE,
            AT24C256_ADDR_LEN, dat + head + i * AT24C256_PAGE_SIZE, AT24C256_PAGE_SIZE, 0xffff);
            HAL_Delay(AT24C256_WAIT_TIME_UINT * AT24C256_PAGE_SIZE);
        }
        HAL_I2C_Mem_Write(&hi2c2, AT24C256_ADDR_WRITE, addr + head + i * AT24C256_PAGE_SIZE, AT24C256_ADDR_LEN,
        dat + head + i * AT24C256_PAGE_SIZE, tail, 0xffff);
        HAL_Delay(AT24C256_WAIT_TIME_UINT * tail);
    }
}

写页:利用AT24C256的页写功能,可以一次性写入一页数据,先发送起始信号、设备地址和写命令,接着发送要写入的地址(高8位和低8位),然后连续发送一页的数据,最后发送停止信号。

void AT24C256_PageWrite(uint16_t addr, uint8_t *data)
{
    IIC_Start();  
    IIC_Send_Byte(AT24C256_ADDR_WRITE);	    // 发送写命令
    IIC_Wait_Ack();
    IIC_Send_Byte(addr >> 8); // 发送高地址 
    IIC_Wait_Ack();    
    IIC_Send_Byte(addr % 256);   // 发送低地址
    IIC_Wait_Ack(); 	
    for (int i = 0; i < 64; i++)
    {
        IIC_Send_Byte(data[i]);     // 发送字节	   
        IIC_Wait_Ack();  
    }
    IIC_Stop();// 产生一个停止条件 
    delay_ms(10);  
}

注意事项

1、延时等待:由于AT24C256写入数据需要一定时间,每次写入操作后需要适当延时等待,确保数据写入完成,一般单字节写入延时5~10ms,连续写入或写页时根据写入的字节数和页面情况相应增加延时。

2、错误处理:在实际应用中,应考虑加入错误处理机制,如超时检测、ACK/NACK检测等,以提高数据写入的可靠性。

如何向AT24C256芯片写入数据?

以下是两个与AT24C256写入数据相关的常见问题及解答:

1、如何确定AT24C256的写入是否成功?

可以通过检查I2C通信过程中的ACK信号来判断,在发送每个字节后,如果接收到从机的ACK信号,则表示该字节写入成功;如果接收到NACK信号,则表示写入失败,还可以通过读取回写入的数据进行验证。

2、AT24C256的写入速度有什么限制?

AT24C256的写入速度受到多种因素的影响,如I2C总线的频率、数据传输的稳定性、芯片的内部擦写周期等,其标准模式下的通信速率为100kbps,快速模式下为400kbps,高速模式下为3.4Mbps,但在实际写入数据时,由于需要考虑芯片的擦写时间和数据完整性,写入速度可能会比理论值低一些。

文章版权及转载声明

作者:豆面本文地址:https://www.jerry.net.cn/articals/26190.html发布于 2025-02-02 21:52:28
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司

阅读
分享