?? ti2cmid.c.svn-base
字號:
/**
* This code and information is part of Trident DPTV API (TDAPI)
*
* Copyright (C) Trident Multimedia Technologies (Shanghai) Co., Ltd.
* 2001-2004 All rights reserved.
*
* This file contains Middle Level I2C Routines
*
* Revision:
* 08/01/2001 Created by Roger, Joy and Archie
*
*/
#include "tdefs.h"
#include "ti2c.h"
#include "C91Cx27U.h"
#include "ioctrl.h"
#define ACK 0
#ifdef _CPU_X86_
extern Bool s_bReadSDA;
extern Word s_wParaport;
#endif
//extern GByte s_ucActiveI2Bus;
#ifndef wait_6u
extern BYTE PortBuf;
extern GByte g_bI2CNoWaiting;
Void wait_6u(Void)
{
Word i;
//if(g_bI2CNoWaiting) return;
//if (s_ucActiveI2Bus) return;
//for (i = 0; i<40; i++) asm("nop");
//for (i = 0; i<40; i++) asm("nop");
//for (i = 0; i<240; i++) asm("nop");
}
Void tdI2CEnableSDAWrite(Void)
{
/* if(s_ucActiveI2Bus == 1)
P70C = 1;
else
*/
// P61C = 1;
HI2C_SDA_OUTMODE;
}
#endif
/**
* Sends 8 bits to the device via I2C bus.
*
* @param ucByte - The 8 bits to the device.
*
* @return _TRUE_ - Succeeded.
* _FALSE_ - Failed.
*
* @see tdI2CReceiveByte
*/
Bool tdI2CSendByte(Byte ucByte)
{
IByte ucData;
for(ucData = 0; ucData < 8; ucData++)
{
if(ucByte & 0x80)
tdI2CSDA(1);
else
tdI2CSDA(0);
tdI2CSCL(1);
// wait_6u();
asm("nop");
tdI2CSCL(0);
//wait_6u();
asm("nop");
ucByte <<= 1;
}
#ifdef _CPU_X86_
if (s_wParaport == 0x3d4 || s_wParaport == 0x3ce)
s_bReadSDA = _TRUE_;
#endif
tdI2CEnableSDARead();
// wait_6u();
asm("nop");
tdI2CSCL(1);
// wait_6u();
asm("nop");
/* if (tdI2CReadSCL() == 0)
{
return _FALSE_;
}*/
ucData = tdI2CReadSDA();
tdI2CSCL(0);
tdI2CEnableSDAWrite();
return ucData == ACK;
}
/**
* Receives 8 bits from the device via I2C bus.
*
* @param None.
*
* @return (Byte) The 8 bits from the device.
*
* @see tdI2CSendByte
*/
Byte tdI2CReceiveByte(Void)
{
IByte ucB2,ucData;
ucData = 0;
tdI2CEnableSDARead();
for(ucB2 = 0; ucB2 < 8; ucB2++)
{
#ifdef _CPU_X86_
if (s_wParaport == 0x3d4 || s_wParaport == 0x3ce)
s_bReadSDA = _TRUE_;
#endif
tdI2CSCL(1);
//wait_6u();
asm("nop");
ucData <<= 1;
if(tdI2CReadSDA())
ucData |= 1;
tdI2CSCL(0);
}
tdI2CEnableSDAWrite();
return ucData;
}
/**
* Sends Start signal to the device via I2C bus.
*
* @param None.
*
* @return None.
*
* @see tdStop
* @see tdACK
* @see tdNOACK
*/
Void tdStart(Void)
{
// tdI2CSCL(0);
tdI2CSDA(1);
//wait_6u();
asm("nop");
tdI2CSCL(1);
//wait_6u();
asm("nop");
tdI2CSDA(0);
//wait_6u();
asm("nop");
tdI2CSCL(0);
//wait_6u();
asm("nop");
}
/**
* Sends Stop signal to the device via I2C bus.
*
* @param None.
*
* @return None.
*
* @see tdStart
* @see tdACK
* @see tdNOACK
*/
Void tdStop(Void)
{
tdI2CSDA(0);
tdI2CSCL(1);
//wait_6u();
asm("nop");
tdI2CSDA(1);
//wait_6u();
asm("nop");
}
/**
* Sends ACK signal to the device via I2C bus.
*
* @param None.
*
* @return None.
*
* @see tdStart
* @see tdStop
* @see tdNOACK
*/
Void tdACK(Void)
{
tdI2CSDA(0);
//wait_6u();
asm("nop");
tdI2CSCL(1);
asm("nop");
//wait_6u();
tdI2CSCL(0);
asm("nop");
//wait_6u();
}
/**
* Sends NOACK signal to the device via I2C bus.
*
* @param None.
*
* @return None.
*
* @see tdStart
* @see tdStop
* @see tdACK
*/
Void tdNOACK(Void)
{
tdI2CSDA(1);
//wait_6u();
asm("nop");
tdI2CSCL(1);
asm("nop");
//wait_6u();
tdI2CSCL(0);
asm("nop");
//wait_6u();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -