?? i2c.c
字號:
/******************************************************************************
I2C.C
標準80C51模擬I2C總線程序(主模式)
Copyright (c) 2007,廣州周立功單片機發展有限公司
All rights reserved.
本程序僅供學習參考,不提供任何可靠性方面的擔保;請勿用于商業目的
******************************************************************************/
#include "I2C.H"
/******************************************************************************
函數:I2C_Delay()
功能:模擬I2C總線延時
說明:請根據具體情況調整延時值
******************************************************************************/
void I2C_Delay()
{
unsigned char t;
t = 10;
while ( --t != 0 ); //延時2*t個機器周期
}
/******************************************************************************
函數:I2C_Init()
功能:I2C總線初始化,使總線處于空閑狀態
說明:在main()函數的開始處,應當執行一次本函數
******************************************************************************/
void I2C_Init()
{
I2C_SCL = 1; I2C_Delay();
I2C_SDA = 1; I2C_Delay();
}
/******************************************************************************
函數:I2C_Start()
功能:產生I2C總線的起始條件
說明:
SCL處于高電平期間,當SDA出現下降沿時啟動I2C總線
本函數也用來產生重復起始條件
******************************************************************************/
void I2C_Start()
{
I2C_SDA = 1; I2C_Delay();
I2C_SCL = 1; I2C_Delay();
I2C_SDA = 0; I2C_Delay();
I2C_SCL = 0; I2C_Delay();
}
/******************************************************************************
函數:I2C_Write()
功能:向I2C總線寫1個字節的數據
參數:dat是要寫到總線上的數據
******************************************************************************/
void I2C_Write(unsigned char dat)
{
unsigned char t = 8;
do
{
I2C_SDA = (bit)(dat & 0x80);
dat <<= 1;
I2C_SCL = 1; I2C_Delay();
I2C_SCL = 0; I2C_Delay();
} while ( --t != 0 );
}
/******************************************************************************
函數:I2C_Read()
功能:從從機讀取1個字節的數據
返回:讀取的1個字節數據
******************************************************************************/
unsigned char I2C_Read()
{
unsigned char dat;
unsigned char t = 8;
I2C_SDA = 1; //在讀取數據之前,要把SDA拉高,使之處于輸入狀態
do
{
I2C_SCL = 1; I2C_Delay();
dat <<= 1;
if ( I2C_SDA ) dat++;
I2C_SCL = 0; I2C_Delay();
} while ( --t != 0 );
return dat;
}
/******************************************************************************
函數:I2C_GetAck()
功能:讀取從機應答位(應答或非應答),用于判斷:從機是否成功接收主機數據
返回:
0:從機應答
1:從機非應答
說明:從機在收到每一個字節后都要產生應答位,主機如果收到非應答則應當終止傳輸
******************************************************************************/
bit I2C_GetAck()
{
bit ack;
I2C_SDA = 1; I2C_Delay();
I2C_SCL = 1; I2C_Delay();
ack = I2C_SDA;
I2C_SCL = 0; I2C_Delay();
return ack;
}
/******************************************************************************
函數:I2C_PutAck()
功能:主機產生應答位(應答或非應答),用于通知從機:主機是否成功接收從機數據
參數:
ack=0:主機應答
ack=1:主機非應答
說明:主機在收到每一個字節后都要產生應答,在收到最后一個字節后,應當產生非應答
******************************************************************************/
void I2C_PutAck(bit ack)
{
I2C_SDA = ack; I2C_Delay();
I2C_SCL = 1; I2C_Delay();
I2C_SCL = 0; I2C_Delay();
}
/******************************************************************************
函數:I2C_Stop()
功能:產生I2C總線的停止條件
說明:SCL處于高電平期間,當SDA出現上升沿時停止I2C總線
******************************************************************************/
void I2C_Stop()
{
unsigned int t;
I2C_SDA = 0;
I2C_Delay();
I2C_SCL = 1;
I2C_Delay();
I2C_SDA = 1;
I2C_Delay();
//對于某些器件來說,在下一次產生Start之前,額外增加一定的延時是必須的
t = 15;
while ( --t != 0 );
}
/******************************************************************************
函數:I2C_Puts()
功能:主機通過I2C總線向從機發送多個字節的數據
參數:
SlaveAddr:從機地址(高7位是從機地址,最低位是讀寫標志)
SubAddr:從機的子地址
size:數據大小(以字節計)
*dat:要發送的數據
返回:
0:發送成功
1:在發送過程中出現異常
******************************************************************************/
bit I2C_Puts(
unsigned char SlaveAddr,
unsigned char SubAddr,
unsigned char size,
unsigned char *dat
)
{
//確保從機地址最低位是0
SlaveAddr &= 0xFE;
//啟動I2C總線
I2C_Start();
//發送從機地址
I2C_Write(SlaveAddr);
if ( I2C_GetAck() )
{
I2C_Stop();
return 1;
}
//發送子地址
I2C_Write(SubAddr);
if ( I2C_GetAck() )
{
I2C_Stop();
return 1;
}
//發送數據
do
{
I2C_Write(*dat++);
if ( I2C_GetAck() )
{
I2C_Stop();
return 1;
}
} while ( --size != 0 );
//發送完畢,停止I2C總線,返回
I2C_Stop();
return 0;
}
/******************************************************************************
函數:I2C_Gets()
功能:主機通過I2C總線從從機接收多個字節的數據
參數:
SlaveAddr:從機地址(高7位是從機地址,最低位是讀寫標志)
SubAddr:從機的子地址
size:數據大小(以字節計)
*dat:保存接收到的數據
返回:
0:接收成功
1:在接收過程中出現異常
******************************************************************************/
bit I2C_Gets(
unsigned char SlaveAddr,
unsigned char SubAddr,
unsigned char size,
unsigned char *dat
)
{
//確保從機地址最低位是0
SlaveAddr &= 0xFE;
//啟動I2C總線
I2C_Start();
//發送從機地址
I2C_Write(SlaveAddr);
if ( I2C_GetAck() )
{
I2C_Stop();
return 1;
}
//發送子地址
I2C_Write(SubAddr);
if ( I2C_GetAck() )
{
I2C_Stop();
return 1;
}
//發送重復起始條件
I2C_Start();
//發送從機地址
SlaveAddr |= 0x01;
I2C_Write(SlaveAddr);
if ( I2C_GetAck() )
{
I2C_Stop();
return 1;
}
//接收數據
for (;;)
{
*dat++ = I2C_Read();
if ( --size == 0 )
{
I2C_PutAck(1);
break;
}
I2C_PutAck(0);
}
//接收完畢,停止I2C總線,返回
I2C_Stop();
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -