24C16的读写

24C16的读写

  (2009-04-10 23:11:27)
标签: 

杂谈

 
// 头文件
// 使用Eeprom的设备标识符,即器件地址
// 24C64最多可以定定义8个
//#define I2C_FIRST_ID    0xA0    // 1010,000,0B
//#define I2C_SECOND_ID    0xA2    // 1010,001,0B
//#define I2C_THIRD_ID    0xA4    // 1010,010,0B
//#define I2C_FOURTH_ID    0xA6    // 1010,011,0B
//#define I2C_FIFTH_ID    0xA8    // 1010,100,0B
//#define I2C_SIXTH_ID    0xAA    // 1010,101,0B
//#define I2C_SEVENTH_ID    0xAC    // 1010,110,0B
//#define I2C_EIGHTH_ID    0xAE    // 1010,111,0B


// 公用函数
void iicWriteByteAt24c16(    const unsigned char I2C_EEPROM_ID,     // 器件地址
                            const unsigned int address,         // 要写入的地址
                            const unsigned char Ddata            // 要写入的数据
                        );

unsigned char iicReadByteAt24c16(    const unsigned char I2C_EEPROM_ID, // 器件地址
                                    const unsigned int address           // 要读出一个字节的地址
                                );

void iicWrite_N_ByteAt24c16(
                                const unsigned char I2C_EEPROM_ID,     // 从器件地址
                                const unsigned int address,         // 要写入字节的地址
       
51单片机与24C16(一种EEPROM,即电可擦除只读存储器)通信通常需要通过专用的I/O口和特定的指令集。以下是基本步骤: 1. **初始化**:设置单片机的IO口为数据输入/输出模式,比如P0、P1等,用于控制24C16的地址线。 2. **选择操作模式**:对于24C16,有读和写两种操作。读取数据时,先发送一个“读”命令;写入数据时,需要先发送一个“写”命令,然后是数据字节。 3. **地址传输**:将要访问的24C16内部地址通过IO口依次送出。24C16的寻址范围可能会涉及到多次地址线的变化。 4. **数据传输**:如果是读操作,等待一个固定的时间(如8个时钟周期),然后从IO口接收数据。如果是写操作,先发送数据,再发送一个结束信号。 5. **延迟和重复**:由于24C16的数据传输速度较慢,可能需要适当的延时(例如利用定时器)并可能需要多次操作才能完成整个读写过程。 6. **错误检查**:某些型号的24C16支持奇偶校验,可以读取状态寄存器检查写操作是否成功。 以下是一个简单的示例代码片段(以AT89S52为例): ```c void Write24C16(char* data, int len) { // 设置IO口... P0 = 0x0; // 接地表示写操作 for (int i = 0; i < len; i++) { delay_ms(1); // 等待写命令时间 P0 = data[i]; // 发送数据 delay_us(30); // 写入数据时间 P0 |= 0x80; // 结束位 delay_us(50); // 数据延迟 P0 &= ~0x80; // 恢复低电平 delay_us(70); } } char ReadFrom24C16(int addr, char* buffer, int len) { // 设置IO口... P0 = addr << 1 | 0x01; // 地址线上拉高 for (int i = 0; i < len; i++) { P0 &= ~0x80; // 发起读请求 while (!(P0 & 0x80)); // 等待数据准备好 buffer[i] = P0 & 0x7F; // 读取数据 P0 |= 0x80; // 结束读取 delay_us(50); } return 0; // 成功标志 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值