⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _iic.c

📁 at91rm9200 mac control源码
💻 C
字号:

/****************************************************************
 *                                                              *
 *  Program : _IIC.C                                            *
 *                                                              *
 *  Purpose : Handler for IIC.                                  *
 *                                                              *
 *  Compile : ARM SDT Ver2.51                                   *
 *                                                              *
 *  Version : 1.00                                              *
 *                                                              *
 *  Create  : 2002-09-01 Sunday              By KWM             *
 *                                                              *
 *  Copyright (C) 2002  Amnokgang Technology Development Corp.  *
 *  All Rights Reserved.                                        *
 *                                                              *
 ****************************************************************/

#include "_MyType.H"  
#include "_Bios.H"  
#include "lib_AT91RM9200.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/* keyword : YMMFAB                                                     */
/*               You must modify follow according board                 */
/*           ----------------------------------------------             */  

//#define mcrSDAtoINPUT	{ rGPECON &= 0x1FFFFFFF; }
//#define mcrSDAtoOUTPUT	{ rGPECON &= 0x0FFFFFFF;	\
//						  rGPECON |= 0x50000000;	\
//						};
#define mcrSDAtoINPUT	AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91C_PIO_PA25)
#define mcrSDAtoOUTPUT	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA25)

#define mcrSCLK_SET		AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA26)
#define mcrSCLK_CLR		AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA26)

//#define SDAO_CTRL_BIT	BIT(15)		// PORTE
#define mcrSDAO_SET		AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA25)
#define mcrSDAO_CLR		AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA25)
#define mcrSDAO_CHK		AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, AT91C_PIO_PA25)


/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

/*========================================================================
// Function    : DelayIIC
// Description : 5us delay for IIC bus control.
// Return type : void
// Argument
// Date        : 2002/06/26 PM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
void DelayIIC(void)
{
	U16 i;
	
/*	i = (AT91C_BASE_TC0->TC_RC>>1)/100;	//1000us/2/25	
	
	AT91C_BASE_TC0->TC_CCR = 4;	//复位为0,加计数
	
		while(AT91C_BASE_TC0->TC_CV<=i);
		while(AT91C_BASE_TC0->TC_CV>i);
	*/
	for(i=0;i<15000;i++);
}
/*========================================================================
// Function    : StartIIC
// Description : Make start condition on IIC bus.
// Return type : void
// Argument
// Date        : 1998/08/24  AM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
void StartIIC( void )
{
    /*                   ____________________________________
       SDA______________|

                                                 ____________
       SCL______________________________________|
    */
	 
	
	mcrSDAtoOUTPUT;							
	mcrSCLK_SET;
	mcrSDAO_SET;	DelayIIC();
	mcrSDAO_CLR;	DelayIIC();  
	mcrSCLK_CLR;
	DelayIIC();
}

/*========================================================================
// Function    : OutDataIIC
// Description : Out data to IIC bus.
// Return type : BOOL
// Argument
//   ( In )    : aData=Data to output.
// Date        : 1998/08/24  AM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
void OutDataIIC( BYTE aData )
{
	BYTE vFilter=0x80;
	int i;

	mcrSDAtoOUTPUT;

	for( i=0; i<8; i++ ){
		if( aData & (vFilter>>i) ) 
			mcrSDAO_SET;
		else 
			mcrSDAO_CLR;
		DelayIIC();
		mcrSCLK_SET;
		DelayIIC();
		mcrSCLK_CLR;		
		DelayIIC();
	}
	mcrSDAO_SET;
}

/*========================================================================
// Function    : InDataIIC
// Description : Input data from IIC bus.
// Return type : BOOL
// Argument
//   ( In )    : apData=Buffer for data to input.
// Date        : 1998/08/24  AM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
void InDataIIC( BYTE *apData )
{	BYTE vFilter=0x80;
	int i;

	mcrSDAtoINPUT;

	*apData = 0;
	for( i=0; i<8; i++ ){
		DelayIIC();
		mcrSCLK_SET;
		DelayIIC();
		if( mcrSDAO_CHK ) 	*apData |= vFilter>>i;
		DelayIIC();
		mcrSCLK_CLR;
		DelayIIC();
	}
}

/*========================================================================
// Function    : StopIIC
// Description : Make start condition on IIC bus.
// Return type : void
// Argument
// Date        : 1998/08/24  AM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
void StopIIC( void )
{
    /*    ________________________________________
       SDA                                        |______________

          ______________
       SCL              |________________________________________
    */

	mcrSDAtoOUTPUT;

	mcrSCLK_CLR;
	mcrSDAO_CLR;	DelayIIC();
	mcrSCLK_SET;	DelayIIC();
	mcrSDAO_SET;
	DelayIIC();
}

/*========================================================================
// Function    : ReadAckIIC
// Description : Read acknowlege signal from IIC bus.
// Return type : BOOL
// Argument
// Date        : 1998/08/24  AM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
BOOL ReadAckIIC( void )
{
	BYTE vState;
	mcrSDAtoINPUT;
	DelayIIC();
	mcrSCLK_SET;
	DelayIIC();
	if( mcrSDAO_CHK ) vState = 1;
	else vState = 0;
	DelayIIC();
	mcrSCLK_CLR;
	DelayIIC();

	if( vState == 0 ) return TRUE;
	else return FALSE;
//	return TRUE;
}

/*========================================================================
// Function    : OutAckIIC
// Description : Output acknowlege signal to IIC bus.
// Return type : void
// Argument
// Date        : 1998/08/24  AM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
void OutAckIIC( void )
{
	mcrSDAtoOUTPUT;

	mcrSDAO_CLR;
	DelayIIC();
	mcrSCLK_SET;
	DelayIIC();
	mcrSCLK_CLR;
	DelayIIC();
}

/*========================================================================
// Function    : OutNakIIC
// Description : Output nonacknowlege signal to IIC bus.
// Return type : void
// Argument
// Date        : 1998/08/24  AM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
void OutNakIIC( void )
{
	mcrSDAtoOUTPUT;

	mcrSDAO_SET;
	DelayIIC();
	mcrSCLK_SET;
	DelayIIC();
	mcrSCLK_CLR;
	DelayIIC();
}

/*========================================================================
// Function    : SetIICRegister
// Description : Set value to register by driving IIC bus.
// Return type : BOOL
// Argument
//   ( In )    : aDevIdNum=Device ID Number to set.
//   ( In )    : aRegNum=Number of register to set.
//   ( In )    : aRegValue=Value to set.
// Date        : 1998/08/24  AM     - Ver.1.0 -   By Kim Won Myong
//========================================================================*/
BOOL SetIICRegister( BYTE aDevIdNum, BYTE aRegNum, BYTE aRegValue )
{	register int vState=TRUE;
	StartIIC();

	OutDataIIC( aDevIdNum );
	if( !ReadAckIIC() ) vState = FALSE;

	OutDataIIC( aRegNum );
	if( !ReadAckIIC() ) vState =  FALSE;

	OutDataIIC( aRegValue );
	if( !ReadAckIIC() ) vState = FALSE;

	StopIIC();

	return vState;
}

/*========================================================================
 Function    : GetIICRegister
 Description : Get value to register by driving IIC bus. 
 Return type : BOOL 
 Argument
    (In/Out) : BYTE aWDevIdNum
    (In/Out) : BYTE aRDevIdNum
    (In/Out) : BYTE aRegNum
    (In/Out) : BYTE *apRegValue
// Create      : 2003-01-05 12:05:55 PM		   By Kim Won Myong
========================================================================*/
BOOL GetIICRegister( BYTE aWDevIdNum, BYTE aRDevIdNum, BYTE aRegNum, BYTE *apRegValue )
{	register int vState=TRUE;	
	BYTE *Temp= apRegValue;
	
	StartIIC();

	OutDataIIC( aRDevIdNum );
	if( !ReadAckIIC() ) vState = FALSE;
	
	OutDataIIC( aRegNum );
	if( !ReadAckIIC() ) vState =  FALSE;

	InDataIIC( apRegValue );
	OutAckIIC();

	StopIIC();

	return vState;
}

/****************************************************************
 *
 *                End of file : IIC.C
 *
 ****************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -