I/O口模擬I2C驅動代碼

此I2C代碼是通用代碼。不是什麼高難度技術。

頭文件 I2C.H :

#ifndef _I2C_H
#define _I2C_H

//定義函數
void I2C_Initial(void);
void I2C_Set_sda_high(void);
void I2C_Set_sda_low (void);
void I2C_Set_sck_high(void);
void I2C_Set_sck_low (void);
BYTE  I2C_GetACK(void);
void I2C_SetACK(void);
void I2C_SetNAk(void);
void I2C_START(void);
void I2C_STOP(void);
void I2C_TxByte(BYTE);
BYTE I2C_RxByte(void);
BYTE WriteSingleByte(BYTE nAddr,BYTE nValue);
BYTE PageWrite(BYTE nAddr,BYTE *pBuf);
BYTE ReadRandom(BYTE nAddr, BYTE *nValue);
BYTE ReadSeq(BYTE nAddr,BYTE *nValue,BYTE nLen);

#endif

源文件 I2C.C :

/*******************************************************************************
* 版權所有 (C)2007,XXXXXXXX。
*
* 文件名稱:XXXXXX
* 文件標識:
* 內容摘要:
* 其它說明:
* 當前版本:1.0
* 作    者:XXXX
* 開始日期:XXXX年XX月XX日
*
* 修改記錄1:
*    修改日期:
*    版 本 號:
*    修 改 人:
*    修改內容:
* 修改記錄2:…
*******************************************************************************/

/*******************************************************************************
// 模塊運行環境配置
*******************************************************************************/
#include "AX5051_subject.h"
#include "AX5051_Registers.h"
#include "AX5051_device.h"

/*******************************************************************************
// 模塊內部定義
*******************************************************************************/

/*******************************************************************************
// 模塊內部變量
*******************************************************************************/

/*******************************************************************************
* 函數名稱:I2C_Set_sda_low
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_Set_sda_low(void)
{
    RTC_I2C_CMD_PxDIR |= SDA;		//將SDA設置爲輸出模式
    RTC_I2C_CMD_PxOUT &= ~(SDA);		//SDA管腳輸出爲低電平
    
    _NOP();
    _NOP();
}
/*******************************************************************************
* 函數名稱:I2C_Set_sda_high
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_Set_sda_high( void )
{
    RTC_I2C_CMD_PxDIR |= SDA;		//將SDA設置爲輸出模式
    RTC_I2C_CMD_PxOUT |= SDA;		//SDA管腳輸出爲高電平
    
    _NOP();
    _NOP();
}
/*******************************************************************************
* 函數名稱:I2C_Set_sck_high
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_Set_sck_high( void )
{
    P4OUT |= SCL;		//SCL管腳輸出爲高電平
    
    _NOP();
    _NOP();
}
/*******************************************************************************
* 函數名稱:I2C_Set_sck_low
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_Set_sck_low ( void )
{
    P4OUT &= ~(SCL);		//SCL管腳輸出爲低電平
    
    _NOP();
    _NOP();

}
/*******************************************************************************
* 函數名稱:I2C_STOP
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_STOP(void)
{
    BYTE i;
    
    I2C_Set_sck_low();
    I2C_Set_sda_low();
    for(i = 5;i > 0;i--);
    I2C_Set_sck_high();
    for(i = 5;i > 0;i--);
    I2C_Set_sda_high();
    
}
/*******************************************************************************
* 函數名稱:I2C_Initial
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_Initial( void )
{
    RTC_I2C_CMD_PxDIR |= WP;                //寫使能
    P4OUT &= ~(WP);
    RTC_I2C_CMD_PxDIR |= SCL;		//將SCL管腳(P4.6)設置爲輸出管腳
    I2C_Set_sck_high();
    I2C_STOP();
}
/*******************************************************************************
* 函數名稱:I2C_START
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_START(void)
{
    BYTE i;
    
    I2C_Set_sda_high();
    I2C_Set_sck_high();
    for(i = 5;i > 0;i--);
    I2C_Set_sda_low();
    for(i = 5;i > 0;i--);
    I2C_Set_sck_low();
}
/*******************************************************************************
* 函數名稱:I2C_GetACK
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
BYTE  I2C_GetACK(void)
{
    BYTE nTemp = 0;
    BYTE j;
    
    _NOP();
    _NOP();
    I2C_Set_sck_low();
    for(j = 10;j > 0;j--);
    RTC_I2C_CMD_PxDIR &= ~(SDA);		//將SDA設置爲輸入方向
    _NOP();
    _NOP();
    I2C_Set_sck_high();
    
    for(j = 10;j > 0;j--);
    nTemp = P4IN & SDA;	//獲得數據
    
    I2C_Set_sck_low();
    
    return (nTemp);
}
/*******************************************************************************
* 函數名稱:I2C_SetACK
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_SetACK(void)
{   
    BYTE j;
    I2C_Set_sda_low();
    I2C_Set_sck_high();
    for(j = 10;j > 0;j--);
    I2C_Set_sck_low();
}
/*******************************************************************************
* 函數名稱:I2C_SetNAk
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_SetNAk(void)
{
    BYTE j;
    I2C_Set_sda_high();
    I2C_Set_sck_high();
    for(j = 10;j > 0;j--);
    I2C_Set_sck_low();
}
/*******************************************************************************
* 函數名稱:I2C_TxByte
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
void I2C_TxByte(BYTE nValue)
{
    BYTE i;
    BYTE j;
        
    for(i = 0;i < 8;i++)
    {
    	I2C_Set_sck_low();
        if(nValue & 0x80)
    	    I2C_Set_sda_high();
    	else
    	    I2C_Set_sda_low();
    	nValue <<= 1;
    	for(j = 10;j > 0;j--);
    	I2C_Set_sck_high();
    }
    
}
/*******************************************************************************
* 函數名稱:I2C_RxByte
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返 回 值:
* 其它說明:
*******************************************************************************/
BYTE  I2C_RxByte(void)
{
    BYTE nTemp = 0;
    BYTE i;
    BYTE j;
    
    RTC_I2C_CMD_PxDIR &= ~(SDA);			//將SDA管腳設置爲輸入方向
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    for(i = 0;i < 8;i++)
    {
        I2C_Set_sck_low();
        for(j = 10;j > 0;j--);
    	I2C_Set_sck_high();
        for(j = 10;j > 0;j--);
        
    	if(P4IN & SDA)
    	{
    	    nTemp |= (0x80 >> i);
    	}
    }
    I2C_Set_sck_low();
    return nTemp;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章