欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
CAV24C64 EEPROM底層讀寫代碼分享
[打印本頁]
作者:
taozi12138
時間:
2019-10-18 16:03
標題:
CAV24C64 EEPROM底層讀寫代碼分享
提供了單片機外部存儲芯片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)
2019-10-18 16:00 上傳
點擊文件名下載附件
EEPROM
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1