?? i2c_sim.~cpp
字號(hào):
//---------------------------------------------------------------------------
#pragma hdrstop
#include "PPORT_LIB.h"
#include "I2C_Sim.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
BYTE nDVDD=0x08;
BYTE nSDA=0x04;
BYTE nSDL=0x02;
BYTE I2C_DEFAULT=0x88;
BYTE I2C_LOW=0x8B;
WORD inAddr=0x0379;
BYTE temp;
PPORT_HANDLE hPPORT ;//= NULL;
BYTE BIT_MASK[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//---------------------------------------------------------------------------
I2C_Sim::I2C_Sim()
{
if (!PPORT_Open(&hPPORT)){
MessageBox(NULL,"Error while opening EPP driver","Warning",MB_OK|MB_TOPMOST);
return;
}
PPORT_Writedata(hPPORT,I2C_DEFAULT);
PPORT_ReadPort(hPPORT,inAddr);
sysver=2;//0;
NegtiveLogic=TRUE;
SCL=0X01;
SDO=0X02;
SDI=0X08;
DVDD=0X04;
Addr=0x0378;
UpTime=50;
DownTime=50;
HighTime=500;
LowTime=50;
sysver=SystemVersion();
}
I2C_Sim::~I2C_Sim()
{
PPORT_Close(hPPORT);
}
void I2C_Sim::Start()
{
//TODO: Add your source code here
// -__ SDA
// --_ SDL
/*啟動(dòng)I2C總線的函數(shù),當(dāng)SCL為高電平時(shí)使SDA產(chǎn)生一個(gè)負(fù)跳變*/
short data;
if(!NegtiveLogic)
{
data|=SCL;
Out32(hPPORT,Addr,data);
Delay(UpTime);
data|=SDO;
Out32(hPPORT,Addr,data);
Delay(HighTime);
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(DownTime);
data&=~SCL;
Out32(hPPORT,Addr,data);
}
else
{
data&=~SCL;
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(UpTime);
data|=SDO;
Out32(hPPORT,Addr,data);
Delay(HighTime);
// data|=SCL;
// Out32(hPPORT,Addr,data);
}
}
void I2C_Sim::Stop()
{
//TODO: Add your source code here
// _- SDA
// -- SDL
short data;
if(!NegtiveLogic)
{
data|=SCL;
Out32(hPPORT,Addr,data);
Delay(UpTime);
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(HighTime);
data|=SDO;
Out32(hPPORT,Addr,data);
Delay(DownTime);
data&=~SCL;
Out32(hPPORT,Addr,data);
}
else
{
data|=SDO;
Out32(hPPORT,Addr,data);
Delay(HighTime);
data&=~SCL;
Out32(hPPORT,Addr,data);
Delay(UpTime);
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(DownTime);
data|=SCL;
Out32(hPPORT,Addr,data);
}
}
void I2C_Sim::WriteByte(BYTE data)
{
//TODO: Add your source code here
for(int i=7;i>=0;i--) {
if((data&BIT_MASK[i]))
WriteBit(0x80);
else
WriteBit(0x00);
//WriteBit(data>>i);
}
/* if(data&BIT_MASK[i]) {
My_Sleep(true);
temp=I2C_LOW-nSDA;
PPORT_Writedata(hPPORT,temp);
PPORT_ReadPort(hPPORT,inAddr);
My_Sleep(true);
temp=I2C_DEFAULT;
PPORT_Writedata(hPPORT,temp);
PPORT_ReadPort(hPPORT,inAddr);
My_Sleep();
My_Sleep();
temp=I2C_LOW-nSDA;
PPORT_Writedata(hPPORT,temp);
PPORT_ReadPort(hPPORT,inAddr);
}
else {
My_Sleep(true);
PPORT_Writedata(hPPORT,I2C_LOW);
PPORT_ReadPort(hPPORT,inAddr);
temp=I2C_LOW-nSDL;
My_Sleep(true);
PPORT_Writedata(hPPORT,temp);
PPORT_ReadPort(hPPORT,inAddr);
My_Sleep();
My_Sleep();
PPORT_Writedata(hPPORT,I2C_LOW);
PPORT_ReadPort(hPPORT,inAddr);
}
}
My_Sleep();
PPORT_Writedata(hPPORT,I2C_LOW-nSDA);
PPORT_ReadPort(hPPORT,inAddr); */
}
BYTE I2C_Sim::ReadByte()
{
//TODO: Add your source code here
BYTE rslt=0;
BYTE temp=0x00;
for(int i=7;i>=0;i--) {
if( ReadBit())
temp|=BIT_MASK[i];
//temp|=(ReadBit()<<(7-i));
/*
My_Sleep(true);
PPORT_Writedata(hPPORT,I2C_LOW);
PPORT_ReadPort(hPPORT,inAddr);
temp=I2C_LOW-nSDL;
My_Sleep(true);
PPORT_Writedata(hPPORT,temp);
PPORT_ReadPort(hPPORT,inAddr);
My_Sleep();
My_Sleep();
temp=PPORT_ReadPort(hPPORT,inAddr);
PPORT_Writedata(hPPORT,I2C_LOW);
PPORT_ReadPort(hPPORT,inAddr);
if(temp&BIT_MASK[7])
rlst=rlst+BIT_MASK[i];
} */
}
rslt=temp;
return rslt;
}
bool I2C_Sim::WaitACK()
{
//TODO: Add your source code here
// --- SDA
// _-_ SDL
/* temp=I2C_LOW-nSDA;
PPORT_Writedata(hPPORT,temp); // 1.
PPORT_ReadPort(hPPORT,inAddr);
My_Sleep(true);
temp=I2C_DEFAULT;
PPORT_Writedata(hPPORT,temp); // 2.
PPORT_ReadPort(hPPORT,inAddr);
My_Sleep();
My_Sleep();
temp=PPORT_ReadPort(hPPORT,inAddr);
My_Sleep(true);
PPORT_Writedata(hPPORT,I2C_LOW-nSDA); // 3.
PPORT_ReadPort(hPPORT,inAddr);
My_Sleep();
*/
short data,Data;
data=0x00;
Data=0x00;
if(!NegtiveLogic)
{
data|=SCL;
data|=DVDD;
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(UpTime);
Data=In32(hPPORT,Addr+1);
Delay(HighTime);
data&=~SCL;
data|=DVDD;//&=~DVDD;
Out32(hPPORT,Addr,data);
Delay(DownTime);
if((SDI&Data))
return false;
else
return true;
}
else
{
data|=DVDD;
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(UpTime);
data&=~SCL;
Out32(hPPORT,Addr,data);
Delay(UpTime);
Data=In32(hPPORT,Addr+1);
Delay(HighTime);
data|=SCL;
data|=DVDD;//&=~DVDD;
Out32(hPPORT,Addr,data);
Delay(DownTime);
if((SDI&Data))
return true;
return false;
}
}
void I2C_Sim::My_Sleep(bool half)
{
//TODO: Add your source code here
int loop=5000;
if(half)
loop=loop/2;
else
loop=loop;
for(int i=0;i<loop;i++)
;
}
void I2C_Sim::Mem_Reset()
{
//TODO: Add your source code here
for(int i=0;i<9;i++) {
My_Sleep();
My_Sleep();
My_Sleep();
PPORT_Writedata(hPPORT,I2C_DEFAULT);
PPORT_ReadPort(hPPORT,inAddr);
My_Sleep();
My_Sleep();
My_Sleep();
PPORT_Writedata(hPPORT,I2C_LOW-nSDA);
PPORT_ReadPort(hPPORT,inAddr);
}
My_Sleep();
My_Sleep();
}
void I2C_Sim::Delay(int time)
{
while(time!=0)
time--;
}
void I2C_Sim::SetPortBit(BYTE scl, BYTE sdi, BYTE sdo)
{
//TODO: Add your source code here
SCL=scl;
SDI=sdi;
SDO=sdo;
}
void I2C_Sim::WriteBit(BYTE data)
{
//TODO: Add your source code here
unsigned char Data;
Data=In32(hPPORT,Addr);
if(!NegtiveLogic)
{
data|=SCL;
Out32(hPPORT,Addr,data);
Delay(UpTime);
if((data&0x80))
data|=SDO;
else
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(HighTime);
data&=~SCL;
Out32(hPPORT,Addr,data);
Delay(DownTime);
}
else
{
data|=SCL;
if((data&0x80))
data&=~SDO;
else
data|=SDO;
Out32(hPPORT,Addr,data);
Delay(UpTime);
data&=~SCL;
Out32(hPPORT,Addr,data);
Delay(HighTime);
data|=SCL;
Out32(hPPORT,Addr,data);
Delay(DownTime);
// data&=~SDO;
// Out32(hPPORT,Addr,data);
}
}
BYTE I2C_Sim::ReadBit(void)
{
//TODO: Add your source code here
short data,Data;
data=0x00;
Data=0x00;
if(!NegtiveLogic)
{
data&=~SCL;
data|=DVDD;
Out32(hPPORT,Addr,data);
data|=SCL;
Out32(hPPORT,Addr,data);
Delay(HighTime);
Data=In32(hPPORT,Addr+1);
Delay(HighTime);
data&=~SCL;
data|=DVDD;//&=~DVDD;
Out32(hPPORT,Addr,data);
Delay(DownTime);
if((SDI&Data))
return 0x01;
else
return 0x00;
}
else
{
data|=SCL;
data&=~SDO;
data|=DVDD;
Out32(hPPORT,Addr,data);
Delay(UpTime);
data&=~SCL;
Out32(hPPORT,Addr,data);
Delay(HighTime);
Data=In32(hPPORT,Addr+1);
data|=SCL;
data|=DVDD;//&=~DVDD;
Out32(hPPORT,Addr,data);
Delay(DownTime);
if((SDI&Data))
return 0x00;
else
return 0x01;
}
}
void I2C_Sim::NoACK(void)
{
//TODO: Add your source code here
short data,Data;
data=0x00;
Data=0x00;
if(!NegtiveLogic)
{
data|=SCL;
data|=DVDD;
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(UpTime);
Data=In32(hPPORT,Addr+1);
Delay(HighTime);
data&=~SCL;
data|=DVDD;//&=~DVDD;
Out32(hPPORT,Addr,data);
Delay(DownTime);
}
else
{
data|=DVDD;
data&=~SDO;
Out32(hPPORT,Addr,data);
Delay(UpTime);
data&=~SCL;
Out32(hPPORT,Addr,data);
Delay(UpTime);
Data=In32(hPPORT,Addr+1);
Delay(HighTime);
data|=SCL;
data|=DVDD;//&=~DVDD;
Out32(hPPORT,Addr,data);
Delay(DownTime);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -