
如何将程序写入FM24C16?
FM24C16 是一种常见的串行 EEPROM 芯片,常用于存储数据,以下是基于汇编语言和 C 语言的写入程序示例:
一、汇编语言写入程序

以下是使用 AVR 微控制器与 FM24C16 进行通信的汇编语言写入程序示例:
; 定义相关寄存器和常量 .EQU FM24C16_ADDR = 0x50 ; 假设 FM24C16 的 I2C 地址为 0x50 .EQU PAGE_SIZE = 256 ; 每页大小为 256 字节 ; 起始位子程序 START_BIT: ; 在这里实现 I2C 起始位的发送逻辑 RET ; 从应答子程序 SLAVE_ACK: ; 在这里实现检测从设备的应答位的逻辑 RET ; 停止位子程序 STOP_BIT: ; 在这里实现 I2C 停止位的发送逻辑 RET ; 送位子程序 SHFTO: ; 将累加器 A 中的数据通过 SDA 线移位输出,R7 指定移位次数 ; 同时在 SCL 线上产生相应的时钟脉冲 RET ; 页面写子程序 PAGE_WRITE: ACALL START_BIT ; 发送起始信号 MOV A, #10100000B ; 发送设备地址和写命令(假设地址引脚 A0、A1 都接地) MOV R7, #4 ACALL SHFTO ; 以上3行发送设备地址到 FM24C16 MOV A, #20H ; 设置要写入的页地址高8位 MOV R7, #3 ACALL SHFTO ; 以上3行发送页地址高8位到 FM24C16 MOV A, #00H ; 设置要写入的页地址低8位 MOV R7, #1 ACALL SHFTO ; 以上3行发送页地址低8位到 FM24C16 ACALL SLAVE_ACK ; 检测从应答位 MOV A, #00H ; 设置写入数据的首地址为 0x00 MOV R7, #8 ACALL SHFTO ; 以上3行发送数据首地址到 FM24C16 ACALL SLAVE_ACK ; 检测从应答位 MOV R0, #00H ; R0 指向被写入数据所在单元的首地址 MOV R4, #PAGE_SIZE ; R4 为要写入的字节数,这里为一页的大小 256B NEXT_DATA: MOV A, @R0 ; 调入第1个写入数据 INC R0 ; R0 指向第2个数据所在单元地址 MOV R7, #8 ACALL SHFTO ; 写入数据 ACALL SLAVE_ACK ; 检测从应答位 DJNZ R4, NEXT_DATA ; 循环写入下一个字节数据 ACALL STOP_BIT ; 发送停止位,结束写操作 RET ; 返回,程序结束
二、C 语言写入程序
以下是使用 C 语言编写的基于 I2C 总线对 FM24C16 进行写入操作的程序示例:
#include <reg52.h> sbit SDA = P2^7; // SDA 数据线连接端口 P2 的第 7 位 sbit SCL = P2^6; // SCL 时钟线连接端口 P2 的第 6 位 void delay() { // 简单的延时函数 unsigned char i; for (i = 0; i < 10; i++); } void I2C_Start() { SDA = 1; SCL = 1; delay(); SDA = 0; delay(); SCL = 0; } void I2C_Stop() { SDA = 0; SCL = 1; delay(); SDA = 1; delay(); } void I2C_Ack() { SDA = 0; delay(); SCL = 1; delay(); SCL = 0; delay(); SDA = 1; delay(); } void I2C_NoAck() { SDA = 1; delay(); SCL = 1; delay(); SCL = 0; } void I2C_SendByte(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { SDA = dat & 0x80; dat <<= 1; SCL = 1; delay(); SCL = 0; delay(); } I2C_NoAck(); // 发送完一个字节后等待从设备应答,这里假设不需要应答 } void Write_FM24C16(unsigned short addr, unsigned char *data, unsigned char length) { I2C_Start(); // 发送起始信号 I2C_SendByte(0xA0); // 发送设备地址 + 写命令(假设地址引脚 A0、A1 都接地) I2C_SendByte((addr >> 8) & 0xFF); // 发送地址高8位 I2C_SendByte(addr & 0xFF); // 发送地址低8位 while (length) { I2C_SendByte(*data++); // 发送数据字节 } I2C_Stop(); // 发送停止信号结束通信 } int main() { unsigned char data[] = {0x12, 0x34, 0x56, 0x78}; // 要写入的数据数组 Write_FM24C16(0x0000, data, sizeof(data)); // 调用写函数,将数据写入到 FM24C16 的地址 0x0000 开始的位置 while (1); // 进入死循环,保持程序运行 }
三、常见问题解答(FAQs)
Q1:如何确定 FM24C16 的 I2C 地址?
A1:FM24C16 的 I2C 地址由其硬件引脚 A0、A1、A2 的状态决定,如果这些引脚都接地,那么其地址通常为 0x50,具体计算方式为:I2C 地址 = 0x50 + (A2 << 2) + (A1 << 1) + A0,如果 A0 = 0,A1 = 0,A2 = 0,则地址为 0x50;A0 = 1,A1 = 0,A2 = 0,则地址为 0x51,以此类推,在实际使用中,需要根据具体的硬件连接情况来确定其准确的 I2C 地址。
Q2:在写入程序中,如何处理多个连续字节的写入?
A2:如果要向 FM24C16 写入多个连续字节的数据,可以在写入第一个字节后,继续发送后续的字节数据即可,在上述 C 语言程序中,Write_FM24C16
函数中的while
循环就是用来处理多个连续字节的写入,每次循环将数据指针data
加1,然后继续发送下一个字节,直到所有指定的字节数都写入完成,在实际应用中,需要根据具体的需求和数据长度来确定循环的次数和条件。
文章版权及转载声明
作者:豆面本文地址:https://www.jerry.net.cn/articals/27379.html发布于 2025-02-05 00:41:08
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司