📄 _iic.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 + -