久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
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://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
色香婷婷
|
99精品一级欧美片免费播放
|
毛片一区二区
|
91人人视频在线观看
|
精品少妇一区二区三区在线播放
|
日韩中文字幕在线免费
|
伊人狠狠操
|
婷婷久久五月
|
一区二区三区视频在线免费观看
|
高清免费在线
|
91色视频在线观看
|
成人高清在线
|
久久久久久99
|
青草青草久热精品视频在线观看
|
亚洲一区免费视频
|
三级在线视频
|
亚洲国产成人在线观看
|
欧洲一区在线观看
|
欧美5区
|
一级久久久久久
|
欧美日韩久久精品
|
av黄色在线
|
欧美久久久久
|
久久伊人免费视频
|
一呦二呦三呦国产精品
|
欧美日韩电影一区
|
操一草
|
欧美精品欧美精品系列
|
精品亚洲第一
|
欧美精品在线看
|
久久香蕉网
|
欧美成人精品一区二区男人看
|
av成年人网站
|
国产成人精品免费视频大全最热
|
国产欧美一区二区三区另类精品
|
天天干天天爽
|
亚洲精品一区二区三区蜜桃久
|
国产伦一区二区三区久久
|
成人av播放
|
国产免费自拍
|
成人av免费在线观看
|