📄 iic.c
字号:
/****************************************************************************
+----------------------------------------------------------------------+
| Copyright Trumpion Microelectronics Inc. 1999 |
| Trumpion Microelectronics Inc. reserves the right to change products |
| or specifications without notice. |
+----------------------------------------------------------------------+
Project : LCD monitor
Version : 0.94
File Name : iic.c
Functions : i2c interface routine
Revision :
1999-05-18 OriginalTeam First Created
2000-07-07 Glen Chang Modify IIC access timing
2000-07-17 Bill Tseng Porting to C source
****************************************************************************/
/**************************************************************************/
/* INCLUDE FILES */
/**************************************************************************/
// Standard include files
#include "lib\extent.h"
#include "lib\wreg516.h"
#include "lib\declare.h"
// Project include files
#include "lib\global.h"
#include "lib\initial.h"
#include <intrins.h>
/**************************************************************************/
/**************************************************************************/
#define SUCCESS 0
#define FAILURE 1
/**************************************************************************/
/**************************************************************************/
extern Bool SendData( void );
extern Bool SendEEPROMData( void );
extern Bool ReadI2CData(Byte,Byte);
extern Bool IIC_SendByte(Byte);
//static Bool IIC_SendByte(Byte);
static void IIC_Start(void);
static void IIC_Stop(void);
static void IIC_Delay(Byte);
/**************************************************************************/
/**************************************************************************/
Bool SendData( void )
{
Byte i,j;
Bool no_ack = 1;
for( i=0; i<10; i++) /* retry for 10 times */
{
IIC_Start();
if( IIC_SendByte(SlvAdr) )
{
IIC_Stop();
continue;
}
no_ack = 0;
for(j=0; j<ByteCnt; j++)
{
if( IIC_SendByte( TrmBuf[j] ) != SUCCESS )
{
no_ack = 1;
break;
}
}
IIC_Stop();
if( no_ack==0 ) break; /* complete */
}
return no_ack;
}
/**************************************************************************/
/**************************************************************************/
Bool SendEEPROMData( void )
{
Byte i,j;
Bool no_ack = 1;
for( i=0; i<10; i++)
{
IIC_Start();
if( IIC_SendByte(SlvAdr) )
{
IIC_Stop();
IIC_Delay(10);
continue;
}
no_ack = 0;
for(j=0; j<ByteCnt; j++)
{
if( IIC_SendByte( TrmBuf[j] ) != SUCCESS )
{
no_ack = 1;
break;
}
}
IIC_Stop();
if( no_ack==0 ) break; /* complete */
IIC_Delay(10); /* delay 10 ms */
}
return no_ack;
}
/**************************************************************************/
/**************************************************************************/
Bool ReadI2CData(Byte base_addr,Byte byte_cnt)
{
Byte i,j,k,bval;
Bool no_ack = 1;
for( i=0; i<10; i++) /* retry for 10 times */
{
IIC_Start();
if( IIC_SendByte(SlvAdr) )
{
IIC_Stop();
continue;
}
if( IIC_SendByte(base_addr) != SUCCESS )
{
IIC_Stop();
continue;
}
IIC_Start();
if( IIC_SendByte(SlvAdr+1) )
{
IIC_Stop();
continue;
}
SDA_PIN = 1;
for(j=0; j<byte_cnt; j++)
{
bval = 0;
for(k=0; k<8; k++)
{
SCL_PIN = 1;
bval = bval << 1;
if( SDA_PIN ) bval |= 0x01;
SCL_PIN = 0;
_nop_();
_nop_();
_nop_();
}
if( j==(byte_cnt-1) ) SDA_PIN = 1;
else SDA_PIN = 0;
_nop_();
SCL_PIN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL_PIN = 0;
_nop_();
SDA_PIN = 1;
TrmBuf[j] = bval;
}
IIC_Stop();
no_ack = 0;
break;
}
return no_ack;
}
/**************************************************************************/
/**************************************************************************/
/*
static Bool IIC_SendByte(Byte bval)
{
Byte i;
Bool no_ack = 0;
for(i=8; i!=0; i--)
{
if( bval & 0x80 )
{
SDA_PIN = 1;
_nop_();
SCL_PIN = 1;
bval <<= 1;
SCL_PIN = 0;
}
else
{
SDA_PIN = 0;
_nop_();
SCL_PIN = 1;
bval <<= 1;
SCL_PIN = 0;
}
// bval <<= 1;
// glen SCL_PIN = 1;
// _nop_();
// _nop_();
// _nop_();
// glen bval <<= 1;
// glen SCL_PIN = 0;
// _nop_();
}
_nop_();
SDA_PIN = 1;
_nop_();
_nop_();
_nop_();
SCL_PIN = 1;
for(i=0; i<64; i++)
if( SDA_PIN==0 ) break;
if( i==64 ) no_ack = 1;
SCL_PIN = 0;
_nop_();
SDA_PIN = 0;
return no_ack;
}*/
/**************************************************************************/
/**************************************************************************/
static void IIC_Start(void)
{
SDA_PIN = 1;
_nop_();
SCL_PIN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA_PIN = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL_PIN = 0;
}
/**************************************************************************/
/**************************************************************************/
static void IIC_Stop(void)
{
SDA_PIN = 0;
_nop_();
SCL_PIN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA_PIN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
}
/**************************************************************************/
/**************************************************************************/
static void IIC_Delay(Byte count)
{
Byte i,j;
for(i=0; i<count; i++)
for(j=0; j<=142; j++)
_nop_();
}
/**************************************************************************/
/**************************************************************************/
// static void DdcIIC_Start(void)
// {
// DSDA_PIN = 1;
// _nop_();
// DSCL_PIN = 1;
// _nop_();
// _nop_();
// _nop_();
// _nop_();
// DSDA_PIN = 0;
// _nop_();
// _nop_();
// _nop_();
// _nop_();
// DSCL_PIN = 0;
// }
// static void DdcIIC_Stop(void)
// {
// DSDA_PIN = 0;
// _nop_();
// DSCL_PIN = 1;
// _nop_();
// _nop_();
// _nop_();
// _nop_();
// DSDA_PIN = 1;
// _nop_();
// _nop_();
// _nop_();
// _nop_();
// }
// static Bool DdcIIC_SendByte(Byte bval)
// {
// Byte i;
// Bool no_ack = 0;
//
// for(i=8; i!=0; i--)
// {
// if( bval & 0x80 ) DSDA_PIN = 1;
// else DSDA_PIN = 0;
// bval <<= 1;
//
// DSCL_PIN = 1;
// _nop_();
// _nop_();
// _nop_();
// DSCL_PIN = 0;
// _nop_();
// }
// DSDA_PIN = 1;
// _nop_();
// _nop_();
// _nop_();
// DSCL_PIN = 1;
// for(i=0; i<64; i++)
// if( DSDA_PIN==0 ) break;
// if( i==64 ) no_ack = 1;
//
// DSCL_PIN = 0;
// _nop_();
// DSDA_PIN = 0;
//
// return no_ack;
// }
// Bool ReadDdcI2CData(Byte base_addr,Byte byte_cnt)
// {
// Byte i,j,k,bval;
// Bool no_ack = 1;
//
// SlvAdr = 0xA0;
// for( i=0; i<10; i++) /* retry for 10 times */
// {
// DdcIIC_Start();
// if( DdcIIC_SendByte(SlvAdr) )
// {
// DdcIIC_Stop();
// continue;
// }
// if( DdcIIC_SendByte(base_addr) != SUCCESS )
// {
// DdcIIC_Stop();
// continue;
// }
// DdcIIC_Start();
// if( DdcIIC_SendByte(SlvAdr+1) )
// {
// DdcIIC_Stop();
// continue;
// }
//
// DSDA_PIN = 1;
// for(j=0; j<byte_cnt; j++)
// {
// bval = 0;
// for(k=0; k<8; k++)
// {
// DSCL_PIN = 1;
//
// bval = bval << 1;
// if( DSDA_PIN ) bval |= 0x01;
//
// DSCL_PIN = 0;
// _nop_();
// _nop_();
// _nop_();
// }
// if( j==(byte_cnt-1) ) DSDA_PIN = 1;
// else DSDA_PIN = 0;
// _nop_();
//
// DSCL_PIN = 1;
// _nop_();
// _nop_();
// _nop_();
// _nop_();
//
// DSCL_PIN = 0;
// _nop_();
// DSDA_PIN = 1;
//
// TrmBuf[j] = bval;
// }
// DdcIIC_Stop();
//
// no_ack = 0;
// break;
// }
// return no_ack;
// }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -