提供了单片机外部存储芯片EEPROM的底层读写的代码,不足之处请指点
单片机源程序如下:
- // =============================== EEPROM 说明 ===============================//
- /*******************************************************************************
- The CAV24C64 is a 64.Kb CMOS Serial EEPROM device,
- internally organized as 8192 words of 8 bits each.
- It features a 32.byte page write buffer and supports the Standard
- (100 kHz) and Fast (400 kHz) I2C protocol.
- External address pins make it possible to address up to eight
- CAV24C64 devices on the same bus.
- *******************************************************************************/
- // Page Range:0x00 - 0xFF
- // Page Write Buffer range:0x00 - 0x01F
- // 写数据和读数据之间需要有5ms的延时
-
-
- #include "Common_Hdf_Address.h"
- #include STD_DEFS_H
- #include MAIN_H
- #include IO_H
- #include HW_GPT_COMMON_H
- #include EEPROM_H
- #include DBG_MAIN_H
- u8 bufWrite[32];
- u8 bufRead[32];
- // 函数名称:set_sdaDir(u8 dir)
- // 函数说明:设置SDA数据线方向(利用普通IO实现IIC,需要手动设置数据线的方向)
- void set_sdaDir(u8 dir)
- {
- switch(dir)
- {
- case output: sdaDir |= 0x00C0; break;
- case input: sdaDir &= 0xFF7F; break;
- default:
- break;
- }
- }
- // 函数名称:EEPROM_I2C_Start_v()
- // 函数说明:IIC start
- void EEPROM_I2C_Start_v()
- {
- FUN_HW_Time_Delayus(1);
- set_sdaDir(output); // 设置SDA数据线方向为输出
- eepromSDA_OUT = 1; // 设置SDA为高电平
- eepromSCL = 1; // 设置SCL为高电平
- FUN_HW_Time_Delayus(1); // SDA和SCL至少保持高电平4.7us
- eepromSDA_OUT = 0; // 设置SDA为低电平,此时SCL为高电平,SDA由高电平变为低电平,触发开始条件
- FUN_HW_Time_Delayus(1); // SDA置低后,SCL至少保持4us的高电平时间
- eepromSCL = 0; // 设置SCL为低电平,防止数据误入;I2C总线空闲时,SDA和SCL均为高电平
- }
- // 函数名称:eeprom_I2C_Stop_v()
- // 函数说明:IIC stop
- void EEPROM_I2C_Stop_v()
- {
- FUN_HW_Time_Delayus(1);
- set_sdaDir(output); // 设置SDA数据线方向为输出
- eepromSDA_OUT = 0; // 设置SDA为高电平
- eepromSCL = 1; // 设置SCL为高电平
- FUN_HW_Time_Delayus(1);
- eepromSDA_OUT = 1; // 设置SDA为高电平,此时SCL为高电平,SDA由低电平变为高电平,触发停止条件
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- }
- // 函数名称:EEPROM_I2C_readASK()
- // 函数说明:I2C读取ACK信号(主设备写数据时使用)
- void EEPROM_I2C_readASK()
- {
- FUN_HW_Time_Delayus(1);
- set_sdaDir(input);
- eepromSCL = 0; // 设置SCL为低电平
- FUN_HW_Time_Delayus(1);
- eepromSCL = 1; // 设置SCL为高电平
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- }
- // 函数名称:eeprom_I2C_sendASK()
- // 函数说明:I2C写入ACK信号(主设备读数据时使用)
- void EEPROM_I2C_sendASK()
- {
- FUN_HW_Time_Delayus(1);
- set_sdaDir(output); // 设置SDA数据线方向为输出
- eepromSCL = 0; // 设置SCL为低电平
- eepromSDA_OUT = 0;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 1;
- }
- // 函数名称:EEPROM_I2C_writeByte(u8 byte)
- // 函数说明:写数据
- void EEPROM_I2C_writeByte(u8 byte)
- {
- u8 i;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- set_sdaDir(output); // 设置SDA数据线方向为输出
- for (i = 0; i < 8; i ++)
- {
- if (byte & 0x80) eepromSDA_OUT = 1;
- else eepromSDA_OUT = 0;
- eepromSCL = 1;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- FUN_HW_Time_Delayus(1);
- byte <<= 1;
- }
- EEPROM_I2C_readASK();
- }
- // 函数名称:EEPROM_I2C_readByte()
- // 函数说明:读数据
- u8 EEPROM_I2C_readByte(u8 ask)
- {
- u8 i;
- u8 tempSDA_Read = 0;
- FUN_HW_Time_Delayus(1);
- set_sdaDir(input); // 设置SDA数据线方向为输入
- for (i = 0; i < 8; i ++)
- {
- tempSDA_Read <<= 1;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 1; // 设置SCL为高电平
- FUN_HW_Time_Delayus(1);
- tempSDA_Read |= (u8)eepromSDA_IN;
- eepromSCL = 0; // 设置SCL为低电平
-
- }
- set_sdaDir(output);
- eepromSDA_OUT = ask;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 1;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- eepromSDA_OUT = 1;
- return tempSDA_Read;
- }
- // 函数名称:void EEPROM_I2C_write_oneByte(u8 addrH, u8 addrL, u8 One_ByteData)
- // 函数说明:写单字节数据
- void EEPROM_I2C_write_oneByte(u8 addrH, u8 addrL, u8 One_ByteData)
- {
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- EEPROM_I2C_writeByte(One_ByteData);
- EEPROM_I2C_Stop_v();
- }
- // 函数名称:u8 eeprom_I2C_read_oneByte(u8 addrH, u8 addrL)
- // 函数说明:读单字节数据
- u8 EEPROM_I2C_read_oneByte(u8 addrH, u8 addrL)
- {
- u8 receiveData;
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- EEPROM_I2C_Stop_v();
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA1);
- receiveData = EEPROM_I2C_readByte(1);
- return (receiveData);
- }
- // 函数名称:void EEPROM_I2C_write_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufWrite, u8 length)
- // 函数说明:写多字节数据
- // pageAddr:页地址;byteAddr:字节地址;buf:写缓冲区;length:字节长度
- void EEPROM_I2C_write_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufWrite, u8 length)
- {
- u8 i;
- u8 addrH = 0;
- u8 addrL = 0;
- addrH = (pageAddr >> 3);
- addrL = (pageAddr << 5);
- addrL |= byteAddr;
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- if(length > 32) length = 32;
- for (i = 0; i < length; i ++)
- {
- EEPROM_I2C_writeByte(bufWrite[i]);
- FUN_HW_Time_Delayus(1);
- }
- EEPROM_I2C_Stop_v();
-
- // p_tx[0] = (u8)(pageAddr);
- // p_tx[1] = (u8)(byteAddr);
- // p_tx[2] = (u8)(length);
- // p_tx[3] = (u8)(*bufWrite);
- // p_tx[4] = (u8)(*(bufWrite+1));
- // p_tx[5] = (u8)(*(bufWrite+2));
- // p_tx[6] = (u8)(*(bufWrite+3));
- // p_tx[7] = (u8)(*(bufWrite+4));
- // FUN_CAN_DBG_send_OBJ_i(21,p_tx);
- }
- // 函数名称:EEPROM_I2C_read_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufRead, u8 length)
- // 函数说明:读多字节数据
- // pageAddr:页地址;byteAddr:字节地址;buf:读缓冲区;length:字节长度
- void EEPROM_I2C_read_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufRead, u8 length)
- {
- u8 i;
- u8 addrH = 0;
- u8 addrL = 0;
- addrH = (pageAddr >> 3);
- addrL = (pageAddr << 5);
- addrL |= byteAddr;
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- EEPROM_I2C_Stop_v();
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA1);
- if(length > 32) length = 32;
- for (i = 0; i < length - 1; i ++)
- {
- bufRead[i] = (~ EEPROM_I2C_readByte(0));
- }
- bufRead[i] = (~ EEPROM_I2C_readByte(1));
- EEPROM_I2C_Stop_v();
- // p_tx[0] = (u8)(pageAddr);
- // p_tx[1] = (u8)(byteAddr);
- // p_tx[2] = (u8)(length);
- // p_tx[3] = (u8)(*bufRead);
- // p_tx[4] = (u8)(*(bufRead+1));
- // p_tx[5] = (u8)(*(bufRead+2));
- // p_tx[6] = (u8)(*(bufRead+3));
- // p_tx[7] = (u8)(*(bufRead+4));
- // FUN_CAN_DBG_send_OBJ_i(21,p_tx);
- }
- // 函数名称:EEPROM_vEraseDataBlock(void)
- // 函数说明:擦除数据,一共256页,从第0页到第255页,每页32个字节,从第0个字节到第31个字节
- // pageAddr: 页地址; byteAddr: 字节地址; byteNum: 从byteAddr开始,擦除的字节数
- void EEPROM_vEraseDataBlock(u8 pageAddr, u8 byteAddr, u8 byteNum)
- {
- u8 i;
- u8 addrH = 0;
- u8 addrL = 0;
- addrH = (pageAddr >> 3);
- addrL = (pageAddr << 5);
- addrL |= byteAddr;
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- if(byteNum > 32) byteNum = 32;
- for (i = 0; i < byteNum; i ++)
- {
- EEPROM_I2C_writeByte(0xFF);
- FUN_HW_Time_Delayus(10);
- }
- EEPROM_I2C_Stop_v();
- }
复制代码
所有资料51hei提供下载:
EEPROM——CAV24C64读写代码.zip
(2.39 KB, 下载次数: 9)
|