?? 24c02.c
字號(hào):
#include"REG51F.h"
#include"intrins.h"
#include"USEH1.h"
#include"24c02.h"
//讀寫(xiě)控制命令
//const uchar WR24C02 = 0xA0; //EEPROM地址+寫(xiě)命令
//const uchar RD24C02 = 0xA1; //EEPROM地址+讀命令
#define WR24C02 0xA0
#define RD24C02 0xA1
//用戶變量聲明
bit ErrorBit; //讀寫(xiě)錯(cuò)誤標(biāo)志 1錯(cuò)誤 0 正確
uchar ErrorCode; //錯(cuò)誤碼
void Start(void);
void Stop(void);
void Ack(void);
void NoAck(void);
void TestAck(void);
void WriteI2c(uchar date);
uchar ReadI2c(void);
//void DelayMs(uchar time);
/***************************************
*函數(shù)名稱: void Start(void)
*功能描述: 讀寫(xiě)開(kāi)始
*輸入: 無(wú)
*輸出: 無(wú)
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無(wú)
****************************************/
void Start(void)
{
I2C_SDA = 1; //起始條件的數(shù)據(jù)信號(hào)
_nop_();
I2C_SCL = 1; //起始條件時(shí)鐘信號(hào)
_nop_(); //信號(hào)建立時(shí)間>4.7us
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 0; //起始信號(hào)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0; //鉗住I2C總線, 準(zhǔn)備發(fā)送或者接受數(shù)據(jù)
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void Stop(void)
*功能描述: 讀寫(xiě)結(jié)束
*輸入: 無(wú)
*輸出: 無(wú)
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無(wú)
****************************************/
void Stop(void)
{
I2C_SDA = 0; //結(jié)束條件的數(shù)據(jù)信號(hào)
_nop_();
I2C_SCL = 1; //結(jié)束條件的時(shí)鐘信號(hào)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 1; //結(jié)束信號(hào)
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void Ack(void)
*功能描述: 正確應(yīng)答,讀一個(gè)字節(jié)后必須應(yīng)答
*輸入: 無(wú)
*輸出: 無(wú)
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無(wú)
****************************************/
void Ack(void)
{
I2C_SDA = 0;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
//_nop_();
//_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
I2C_SDA = 1;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void NoAck(void)
*功能描述: 無(wú)應(yīng)答
*輸入: 無(wú)
*輸出: 無(wú)
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無(wú)
****************************************/
void NoAck(void)
{
I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void TestAck(void)
*功能描述: 讀寫(xiě)錯(cuò)誤測(cè)試,寫(xiě)一個(gè)字節(jié)應(yīng)該測(cè)試應(yīng)答信號(hào)
*輸入: 無(wú)
*輸出: 返回一個(gè)位
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無(wú)
****************************************/
void TestAck(void)
{
I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
ErrorBit = I2C_SDA;
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void WriteI2c(uchar date)
*功能描述: 寫(xiě)I2C
*輸入: 待送數(shù)據(jù),高字節(jié)先送
*輸出: 無(wú)
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無(wú)
****************************************/
void WriteI2c(uchar date)
{
uchar i;
for(i=0; i<8; i++)
{
I2C_SDA = date & 0x80; //送數(shù)據(jù)到數(shù)據(jù)線上
date <<= 1;
_nop_();
I2C_SCL = 1; //置時(shí)鐘信號(hào)為高電平,使數(shù)據(jù)有效
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
}
/***************************************
*函數(shù)名稱: uchar ReadI2c(void)
*功能描述: 讀I2C
*輸入: 無(wú)
*輸出: 返回一個(gè)字節(jié)的數(shù)據(jù),高字節(jié)在前
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無(wú)
****************************************/
uchar ReadI2c(void)
{
uchar i;
uchar byte = 0;
for(i=0; i<8; i++)
{
I2C_SCL = 0; //置時(shí)鐘為低電平,準(zhǔn)備接受數(shù)據(jù)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 1; //置時(shí)鐘為高電平,使數(shù)據(jù)線數(shù)據(jù)有效
_nop_();
_nop_();
byte <<= 1;
byte |= I2C_SDA;
_nop_();
_nop_();
I2C_SCL = 0;
}
return(byte);
}
/***************************************
*函數(shù)名稱: void DelayMs(uchar time)
*功能描述: 延時(shí)
*輸入: 延時(shí)時(shí)間
*輸出: 無(wú)
*全局變量: 無(wú)
*調(diào)用模塊: 無(wú)
****************************************/
/*void DelayMs(uchar time)
{
uchar i;
do
{
for(i=0; i<125; i++); //*延時(shí) 8us x 125 = 1ms
}
while(time--);
}*/
/***************************************
*函數(shù)名稱: void WriteDate(uchar StartAddress,uchar *date,uchar bytes)
*功能描述: 寫(xiě)數(shù)據(jù)
*輸入: 數(shù)據(jù)開(kāi)始地址,保存數(shù)據(jù)指針,數(shù)據(jù)字節(jié)數(shù)
*輸出: 無(wú)
*全局變量: 無(wú)
*調(diào)用模塊: Start(),WriteI2c(),Stop(),TestAck()
*注意事項(xiàng): 調(diào)用之前,需要定義一個(gè)數(shù)組,用來(lái)存待發(fā)送的數(shù)據(jù)
****************************************/
void WriteDate(uchar StartAddress, uchar *date, uchar bytes)
{
uchar i = 0;
Start();
WriteI2c(WR24C02);
TestAck();
WriteI2c(StartAddress);
TestAck();
for(i=0; i<bytes; i++)
{
WriteI2c(*date);
TestAck();
date++;
}
Stop();
//DelayMs(20);
}
/***************************************
*函數(shù)名稱: void ReadDate(uchar StartAddress,uchar *date,uchar bytes)
*功能描述: 讀數(shù)據(jù)
*輸入: 數(shù)據(jù)開(kāi)始地址,讀取數(shù)據(jù)指針,數(shù)據(jù)字節(jié)數(shù)
*輸出: 無(wú)
*全局變量: 無(wú)
*調(diào)用模塊: Start(),WriteI2c(),ReadI2c(),Ack(),NoAck(),Stop(),TestAck()
*注意事項(xiàng): 調(diào)用之前,需要定義一個(gè)數(shù)組,用來(lái)存讀取的數(shù)據(jù)
****************************************/
void ReadDate(uchar StartAddress, uchar *date, uchar bytes)
{
uchar i;
Start();
WriteI2c(WR24C02);
TestAck();
WriteI2c(StartAddress);
TestAck();
Start();
WriteI2c(RD24C02);
TestAck();
for (i=0; i<bytes; i++)
{
*date = ReadI2c();
Ack();
date++;
}
NoAck();
Stop();
//DelayMs(10);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -