I/O 포트 에뮬레이션 I2C 드라이브 코드

6824 단어 구동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;
}

좋은 웹페이지 즐겨찾기