如何向AT24C256芯片写入数据?
硬件连接
1、连接引脚:将AT24C256的SCL引脚连接到单片机的SCL引脚,通常为PB10;SDA引脚连接到单片机的SDA引脚,通常为PB11;VCC引脚连接到3.3V或5V电源;GND引脚接地;WP引脚可悬空或接地(接地允许写操作,悬空且不连接上拉电阻时芯片内部下拉到地)。
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写入数据相关的常见问题及解答:
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
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司