?? at24c02.c
字號:
/*
作者:劉文廣
日期:2007-9-30
說明:AT24C02驅(qū)動程序
*/
#ifndef _I2C24C02_C_
#define _I2C24C02_C_
/********************************************************************************************
* 函數(shù)名稱:I2C_Start()
* 功 能:啟動I2C總線
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void I2C_Start(void)
{
SDA=1;
NOP;
SCL=1;
NOP;
NOP;
NOP;
SDA=0;
NOP;
NOP;
NOP;
SCL=0;
NOP;
}
/********************************************************************************************
* 函數(shù)名稱:I2C_Stop()
* 功 能:終止I2C總線
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void I2C_Stop(void)
{
SDA=0;
NOP;
SCL=1;
NOP;
NOP;
NOP;
SDA=1;
NOP;
NOP;
NOP;
}
/********************************************************************************************
* 函數(shù)名稱:I2C_Check_Ack()
* 功 能:發(fā)送完一個字節(jié)后檢驗設(shè)備的應(yīng)答信號
* 入口參數(shù):無
* 出口參數(shù):返回值為True,成功
* 返回值為False,失敗
*********************************************************************************************/
bit I2C_Check_Ack(void)
{
SDA=1;
NOP;
SCL=1;
NOP;
NOP;
F0=SDA;
SCL=0;
if(F0==1) return FALSE;
return TRUE;
}
/***********************************************
函數(shù)名字:Ack()
功 能:mcu對器件進行連續(xù)讀操作時,回應(yīng)器件。
入口參數(shù):無
出口參數(shù):無
**********************************************/
void Ack(void)
{
SDA=0; //數(shù)據(jù)線保持低,時鐘線上升沿
NOP;
SCL=1;
NOP;
SCL=0;
NOP;
SDA=1;
}
//非應(yīng)答
void NoAck()
{
SDA=1;
NOP;
NOP;
SCL=1;
NOP;
NOP;
SCL=0;
}
/********************************************************************************************
* 函數(shù)名稱:I2C_Write8Bit()
* 功 能:向I2C總線寫入8bit數(shù)據(jù)
* 入口參數(shù):I2C_data 將要寫入I2C總線的8bit數(shù)據(jù)
* 出口參數(shù):無
*********************************************************************************************/
void I2C_Write8Bit(uint8 I2C_data)
{
uint8 i;
for(i=8;i!=0;i--)
{
SDA=(bit)(I2C_data&0x80); //寫一個BIT
NOP;
NOP;
SCL=1;
NOP;
NOP;
SCL=0;
I2C_data=I2C_data<<1;
}
}
/********************************************************************************************
* 函數(shù)名稱:I2C_Read8Bit()
* 功 能:從I2C總線接收8bit數(shù)據(jù)
* 入口參數(shù):無
* 出口參數(shù):返回值為從I2C總線上接收到的8bit數(shù)據(jù)
*********************************************************************************************/
uint8 I2C_Read8Bit(void) //reentrant
{
uint8 I2C_data=0,i;
for(i=0;i<8;i++)
{
SCL=1;
NOP;
NOP;
NOP;
F0=SDA;
NOP;
SCL=0;
if(F0==1)
{
I2C_data=I2C_data<<1;
I2C_data=I2C_data|0x01;
}
else
I2C_data=I2C_data<<1;
}
return I2C_data;
}
/********************************************************************************************
* 函數(shù)名稱:AT24C02_Write1Byte()
* 功 能:向AT24C02指定地址上寫入1字節(jié)數(shù)據(jù)
* 入口參數(shù):AT24C02_Address AT24C02內(nèi)的地址
* AT24C02_1Byte 將要寫入AT24C02的1字節(jié)數(shù)據(jù)
* 出口參數(shù):無
*********************************************************************************************/
void AT24C02_Write1Byte(uint8 AT24C02_Address,uint8 AT24C02_1Byte)
{
bit AckTemp=1;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_Address);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_1Byte);
AckTemp=I2C_Check_Ack();
I2C_Stop();
}
/********************************************************************************************
* 函數(shù)名稱:AT24C02_Read1Byte()
* 功 能:從AT24C02指定地址上讀出1字節(jié)數(shù)據(jù)
* 入口參數(shù):AT24C02_Address AT24C02內(nèi)的地址
* 出口參數(shù):從AT24C02指定地址上讀出的1字節(jié)數(shù)據(jù)
*********************************************************************************************/
uint8 AT24C02_Read1Byte(uint8 AT24C02_Address)
{
bit AckTemp=1;
uint8 AT24C02_1Byte;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_Address);
AckTemp=I2C_Check_Ack();
I2C_Start();
I2C_Write8Bit(AT24C02_ReadDeviceAddress);
AckTemp=I2C_Check_Ack();
AT24C02_1Byte=I2C_Read8Bit();
AckTemp=I2C_Check_Ack();
I2C_Stop();
return AT24C02_1Byte;
}
/***********************************************************************
*函數(shù)名稱:AT24C02_WriteNByte()
*功 能:連續(xù)寫n個字節(jié)到AT24C02
*入口參數(shù):Address: 內(nèi)部儲存開始地址,*Wdata:數(shù)據(jù)起始指針,number:個數(shù)
*出口參數(shù):無
*備 注:每8個字節(jié)一頁,一次最多只能寫8個字節(jié)(超過則會與前面的重疊)
************************************************************************/
void AT24C02_WriteNByte(unsigned char Address,unsigned char *Wdata,unsigned char number)
{
unsigned char i;
bit AckTemp=1;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(Address); //開始的地址
AckTemp=I2C_Check_Ack();
for(i=0;i<number;i++)
{
I2C_Write8Bit(*Wdata); //數(shù)據(jù)
while(I2C_Check_Ack()==FALSE);
Wdata++;
}
I2C_Stop();
}
/***********************************************************************
*函數(shù)名稱:AT24C02_ReadNByte()
*功 能:連續(xù)從AT24C02讀n字節(jié)出來
*入口參數(shù):Address: 內(nèi)部儲存開始地址,*Wdata:數(shù)據(jù)存儲起始指針,number:個數(shù)
*出口參數(shù):無
*備 注:每8個字節(jié)一頁,一次最多只能讀8個字節(jié)
************************************************************************/
void AT24C02_ReadNByte(unsigned char Address,unsigned char *Wdata,unsigned char number)
{
unsigned char i;
bit AckTemp=1;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(Address);
AckTemp=I2C_Check_Ack();
I2C_Start();
I2C_Write8Bit(AT24C02_ReadDeviceAddress);
AckTemp=I2C_Check_Ack();
for(i=0;i<number;i++)
{
*Wdata = I2C_Read8Bit();
Ack();
Wdata++;
}
NoAck();
I2C_Stop();
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -