?? 24c02.c
字號:
#if 1
#include "i2c.h"
/*****************************************************************************
** 函數名稱: IIC_Delay
** 功能描述: I2C時序延時
** 全局變量: 無
** 調用模塊: 無
** 輸入: t:延時量
** 輸出: 無
******************************************************************************/
void IIC_Delay(unsigned char t)
{
while(t--);
}
/*****************************************************************************
** 函數名稱: I2C_Start
** 功能描述: 啟動I2C總線的函數,當SCL為高電平時使SDA產生一個負跳變
** 全局變量: DELAY_TIME
** 調用模塊: IIC_Delay()
** 輸入: 無
** 輸出: 無
******************************************************************************/
void I2C_Start(void)
{
SDA=1;
SCL=1;
IIC_Delay(DELAY_TIME);
SDA=0;
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函數名稱: I2C_Stop
** 功能描述: 終止I2C總線,當SCL為高電平時使SDA產生一個正跳變
** 全局變量: DELAY_TIME
** 調用模塊: IIC_Delay()
** 輸入: 無
** 輸出: 無
******************************************************************************/
void I2C_Stop(void)
{
SDA=0;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
SDA=1;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函數名稱: SEND_0
** 功能描述: 發送0(或應答信號),在SCL為高電平時使SDA信號為低
** 全局變量: DELAY_TIME
** 調用模塊: IIC_Delay()
** 輸入: 無
** 輸出: 無
******************************************************************************/
void SEND_0(void)
{
SDA=0;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函數名稱: SEND_1
** 功能描述: 發送1,在SCL為高電平時使SDA信號為高
** 全局變量: DELAY_TIME
** 調用模塊: IIC_Delay()
** 輸入: 無
** 輸出: 無
******************************************************************************/
void SEND_1(void)
{
SDA=1;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函數名稱: Check_Acknowledge
** 功能描述: 發送完一個字節后檢驗設備的應答信號
** 全局變量: DELAY_TIME
** 調用模塊: IIC_Delay()
** 輸入: 無
** 輸出: bit-當有應答信號時返回1,否則返回0。
******************************************************************************/
bit Check_Acknowledge(void)
{
bit F0;
unsigned char Error_time=255; //因故障接收方無ACK,超時值為255
SDA=1;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
F0=SDA;
while(F0)
{
IIC_Delay(8);
F0 = SDA;
if(--Error_time == 0)
return FALSE; //超時無應答,返回
}
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
/*****************************************************************************
** 函數名稱: Send_UnAcknowledge
** 功能描述: 主控器發送停止信號前發送的非應答信號
** 全局變量: DELAY_TIME
** 調用模塊: IIC_Delay()
** 輸入: 無
** 輸出: 無
******************************************************************************/
void Send_UnAcknowledge(void)
{
SDA=1;
IIC_Delay(DELAY_TIME);
SCL=1;
IIC_Delay(DELAY_TIME);
SCL=0;
IIC_Delay(DELAY_TIME);
}
/*****************************************************************************
** 函數名稱: WriteI2CByte
** 功能描述: 向I2C總線寫一個字節
** 全局變量: DELAY_TIME,SEND_1(),SEND_0(),
** 調用模塊: IIC_Delay()
** 輸入: b:要發送的數據
** 輸出: 無
******************************************************************************/
void WriteI2CByte(unsigned char Byte)//reentrant
{
unsigned char i;
for(i=0;i<8;i++)
{
if((Byte << i) & 0x80)
SEND_1();
else
SEND_0();
}
}
/*****************************************************************************
** 函數名稱: ReadI2CByte
** 功能描述: 從I2C總線讀一個字節
** 全局變量: DELAY_TIME
** 調用模塊: IIC_Delay()
** 輸入: 無
** 輸出: char-從I2C總線讀出的數據.
******************************************************************************/
unsigned char ReadI2CByte(void)//reentrant
{
bit F0;
unsigned char Byte=0,i;
for(i=0; i<8; i++)
{
SDA=1; /*釋放總線*/
IIC_Delay(DELAY_TIME);
SCL=0; //置時鐘線為低,準備接收數據
IIC_Delay(DELAY_TIME);
SCL=1; /*接受數據*/
IIC_Delay(DELAY_TIME);
F0=SDA;
IIC_Delay(DELAY_TIME);
SCL=0;
if(F0 == 1)
{
Byte <<= 1;
Byte |= 0x01;
}
else
Byte <<= 1;
}
return Byte;
}
/*****************以下為讀寫24c04的函數**************************************/
/*****************************************************************************
** 函數名稱: Write_One_Byte
** 功能描述: write a byte to memory
** 全局變量: 無
** 調用模塊: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge()
** 輸入: addr:寫入地址,thedata:要寫入的數據
** 輸出: bit-當寫入正確時反回1,否則返回0。
******************************************************************************/
bit Write_One_Byte(unsigned char addr,unsigned char thedata)
{
bit acktemp=1;
I2C_Start();
WriteI2CByte(SLAW); /*write the SLAW*/
acktemp = Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
WriteI2CByte(addr); /*write memory address*/
acktemp = Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
WriteI2CByte(thedata); /*the data*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
I2C_Stop();
IIC_Delay(8);
return(TRUE);
}
/*****************************************************************************
** 函數名稱: Write_A_Page
** 功能描述: write a page to AT24c04
** 全局變量: 無
** 調用模塊: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge()
** 輸入: *buffer:寫入數據緩沖首地址,addr:寫入頁首地址
** 輸出: bit-當寫入正確時反回1,否則返回0。
******************************************************************************/
bit Write_A_Page(unsigned char *buffer,unsigned char addr)
{
bit acktemp=1;
unsigned char i;
I2C_Start();
WriteI2CByte(SLAW); /*write the SLAW*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
WriteI2CByte(addr); /*write memory address*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
for(i=0;i<Page_Word;i++)
{
WriteI2CByte(*buffer);
buffer++;
if(!Check_Acknowledge())
{
I2C_Stop();
return(FALSE);
}
}
I2C_Stop();
for(i=0;i<10;i++)
{
IIC_Delay(200); //IIC_Delay 10mS
}
return(TRUE);
}
/*****************************************************************************
** 函數名稱: Read_One_Byte
** 功能描述: read a byte from memory
** 全局變量: 無
** 調用模塊: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge(),Send_UnAcknowledge()
** 輸入: addr:讀入地址
** 輸出: char-當讀出正確時反回讀出值,否則返回0xff。
******************************************************************************/
unsigned char Read_One_Byte(unsigned char addr)
{
bit acktemp=1;
unsigned char mydata;
I2C_Start();
WriteI2CByte(SLAW); /*write the SLAW*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(0xff);
}
WriteI2CByte(addr); /*write memory address*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(0xff);
}
I2C_Start();
WriteI2CByte(SLAR); /*write the SLAR*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(0xff);
}
mydata=ReadI2CByte();
Send_UnAcknowledge();
I2C_Stop();
return mydata;
}
/*****************************************************************************
** 函數名稱: Read_N_Bytes
** 功能描述: read N bytes from memory N<16
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -