?? i2cdll.cpp
字號(hào):
// I2Cdll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "io.h"
#include <stdio.h>
//#include "io_supp.h"
#define TRY_NUM 5
#define EEP_WRITE_TIME 10
unsigned char f_I2C_Error;
IICaddress SDA_Out;
IICaddress SDA_In;
IICaddress SCL_Out;
IICaddress SCL_In;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
/*
void WINAPI SetI2CBus(IICaddress *SdaOut,IICaddress *SdaIn,IICaddress *SclOut,IICaddress *SclIn)
{
SDA_Out.LPTaddress=SdaOut->LPTaddress;
SDA_Out.NoBit=SdaOut->NoBit;
SDA_Out.CPLflag=SdaOut->CPLflag;
//--------------------------------------
SDA_In.LPTaddress=SdaIn->LPTaddress;
SDA_In.NoBit=SdaIn->NoBit;
SDA_In.CPLflag=SdaIn->CPLflag;
//--------------------------------------
SCL_Out.LPTaddress=SclOut->LPTaddress;
SCL_Out.NoBit=SclOut->NoBit;
SCL_Out.CPLflag=SclOut->CPLflag;
//--------------------------------------
SCL_In.LPTaddress=SclIn->LPTaddress;
SCL_In.NoBit=SclIn->NoBit;
SCL_In.CPLflag=SclIn->CPLflag;
}*/
void WINAPI Set_SDA_Out(short int LPTaddress,unsigned char NoBit,unsigned char CPLflag)
{
SDA_Out.LPTaddress=LPTaddress;
SDA_Out.NoBit=NoBit;
SDA_Out.CPLflag=CPLflag;
}
void WINAPI Set_SDA_In(short int LPTaddress,unsigned char NoBit,unsigned char CPLflag)
{
SDA_In.LPTaddress=LPTaddress;
SDA_In.NoBit=NoBit;
SDA_In.CPLflag=CPLflag;
}
void WINAPI Set_SCL_Out(short int LPTaddress,unsigned char NoBit,unsigned char CPLflag)
{
SCL_Out.LPTaddress=LPTaddress;
SCL_Out.NoBit=NoBit;
SCL_Out.CPLflag=CPLflag;
}
void WINAPI Set_SCL_In(short int LPTaddress,unsigned char NoBit,unsigned char CPLflag)
{
SCL_In.LPTaddress=LPTaddress;
SCL_In.NoBit=NoBit;
SCL_In.CPLflag=CPLflag;
}
unsigned char WINAPI GetI2CStatus(void)
{
return(f_I2C_Error);
}
void WINAPI SetI2CStatus(unsigned char flag)
{
f_I2C_Error=flag;
}
void DoEvents()
{
MSG msg;
if(GetMessage(&msg,(HWND)GetCurrentProcessId(),0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
void WINAPI LPT_WriteByte( short int address, char data)
{
PortOut(address,data);
}
char WINAPI LPT_ReadByte( short int address)
{
return(PortIn(address));
}
void WINAPI LPT_SetBit(short int address,unsigned char Bit)
{
SetPortBit(address,Bit);
}
void WINAPI LPT_ClrBit(short int address,unsigned char Bit)
{
ClrPortBit(address,Bit);
}
short int WINAPI LPT_GetBit(short int address,unsigned char Bit)
{
return(GetPortBit(address,Bit));
}
void WINAPI LPT_NotBit(short int address,unsigned char Bit)
{
NotPortBit(address,Bit);
}
void WINAPI SDA_WriteOne(void)
{
//*******************************************************************************
//-------------------------------------------------------------------------------
if (SDA_Out.CPLflag)
ClrPortBit(SDA_Out.LPTaddress,SDA_Out.NoBit);
else
SetPortBit(SDA_Out.LPTaddress,SDA_Out.NoBit);
//-------------------------------------------------------------------------------
//********************************************************************************
}
void WINAPI SDA_WriteZero(void)
{
if(SDA_Out.CPLflag)
SetPortBit(SDA_Out.LPTaddress,SDA_Out.NoBit);
else
ClrPortBit(SDA_Out.LPTaddress,SDA_Out.NoBit);
}
unsigned char WINAPI SDA_Read(void)
{
if(SDA_In.CPLflag)
{
if(GetPortBit(SDA_In.LPTaddress,SDA_In.NoBit))
return 0;
else
return 1;
}
else
{
if(GetPortBit(SDA_In.LPTaddress,SDA_In.NoBit))
return 1;
else
return 0;
}
}
void WINAPI SCL_WriteOne(void)
{
if(SCL_Out.CPLflag)
ClrPortBit(SCL_Out.LPTaddress,SCL_Out.NoBit);
else
SetPortBit(SCL_Out.LPTaddress,SCL_Out.NoBit);
}
void WINAPI SCL_WriteZero(void)
{
if(SCL_Out.CPLflag)
SetPortBit(SCL_Out.LPTaddress,SCL_Out.NoBit);
else
ClrPortBit(SCL_Out.LPTaddress,SCL_Out.NoBit);
}
unsigned char WINAPI SCL_Read(void)
{
if(SCL_In.CPLflag)
{
if(GetPortBit(SCL_In.LPTaddress,SCL_In.NoBit))
return 0;
else
return 1;
}
else
{
if(GetPortBit(SCL_In.LPTaddress,SCL_In.NoBit))
return 1;
else
return 0;
}
}
//----------------------------------------------------
void IicBusDelay( void )
{
}
void WINAPI SetSDA(void)
{
unsigned char chr1;
SDA_WriteOne();
IicBusDelay();
if(SDA_Read())
return ;
for(chr1=0; chr1<20; chr1++) // 為避免數(shù)據(jù)傳送時(shí)受IIC總線上大電容(100-1000P)的影響
if(SDA_Read())
break ;
}
void WINAPI SetSCL(void)
{
unsigned int chr1;
SCL_WriteOne();
IicBusDelay();
if( SCL_Read())
return ;
for(chr1=0; chr1<20000; chr1++) // 為避免數(shù)據(jù)傳送時(shí)受IIC總線上大電容(100-1000P)的影響,以及適應(yīng)某些反應(yīng)速度慢的IC在做出反應(yīng)前拉低SCL的做法
if( SCL_Read())
break ;
}
void WINAPI ClrSDA(void)
{
SDA_WriteZero();
IicBusDelay();
}
void WINAPI ClrSCL(void)
{
SCL_WriteZero();
IicBusDelay();
}
void WINAPI IicCheckAck(void)
{
SetSDA();
SetSCL();
if( SDA_Read())
{
f_I2C_Error =1 ;
}
ClrSCL();
}
void WINAPI IicSendByte( unsigned char chr1 )
{
unsigned char chr2;
for(chr2=0; chr2<8; chr2++)
{
if( chr1 & 0x80 )
SetSDA();
else
ClrSDA();
chr1 = chr1 << 1;
SetSCL();
ClrSCL();
}
IicCheckAck() ;
}
void WINAPI IicStart( unsigned char SlaveAddress )
{
SetSDA();
SetSCL();
if( SDA_Read()==FALSE)
{
f_I2C_Error = 1 ;
return ;
}
if( SCL_Read()==FALSE )
{
f_I2C_Error = 1 ;
return ;
}
ClrSDA();
ClrSCL();
IicSendByte(SlaveAddress);
}
void WINAPI IicStop( void )
{
ClrSCL();
ClrSDA();
SetSCL();
SetSDA();
}
unsigned char WINAPI IicReceiveByte( void )
{
unsigned char chr1, chr2;
SetSDA();
for( chr2 = 0; chr2 < 8; chr2++ )
{
SetSCL();
chr1 = chr1 << 1;
if( SDA_Read()==TRUE )
chr1++;
ClrSCL();
}
SetSCL();
ClrSCL(); // Send No-ACK
IicStop() ;
return chr1 ;
}
//---------------------------------------------
void WINAPI IicAckTest( unsigned char SlaveAddr )
{
unsigned char BusTryCnt = TRY_NUM ;
f_I2C_Error = 0 ;
do {
IicStart( SlaveAddr ) ;
IicStop() ;
if( f_I2C_Error==0 )
return ;
} while( --BusTryCnt ) ;
}
void WINAPI IicWriteByte( unsigned char SlaveAddr, unsigned char RegAddr, unsigned char RegData )
{
unsigned char BusTryCnt = TRY_NUM ;
f_I2C_Error = 0 ;
do {
IicStart( SlaveAddr ) ;
IicSendByte( RegAddr ) ;
IicSendByte( RegData ) ;
IicStop() ;
if( f_I2C_Error==0 )
return ;
} while( --BusTryCnt ) ;
}
unsigned char WINAPI IicReadByte( unsigned char SlaveAddr, unsigned char RegAddr )
{
unsigned char r, BusTryCnt = TRY_NUM ;
f_I2C_Error = 0 ;
do {
IicStart( SlaveAddr ) ;
IicSendByte( RegAddr ) ;
IicStart( SlaveAddr | 0x01 ) ;
r = IicReceiveByte() ;
if( f_I2C_Error==0 )
return r ;
} while( --BusTryCnt ) ;
return r ;
}
void WINAPI EndI2C(HINSTANCE hinst)
{
//IO_DllMain(hinst, DLL_PROCESS_DETACH, NULL);
UnloadIODLL();
}
//===================================================================
unsigned char IicToolTest()
{
unsigned char i;
unsigned char j;
unsigned char SCLFindOut=0;
unsigned char SDAFindOut=0;
//=================================================================================
for(i=0;i<=7;i++)
{
//-------------------------------------------------------
for(j=0;j<=7;j++)
{
SetPortBit(888,i);
if(GetPortBit(889,j))
{
//--------------------------------------
ClrPortBit(888,i);
if(!GetPortBit(889,j))
{
if(!SDAFindOut)
{
SDA_Out.NoBit = i;
SDA_In.NoBit = j;
SDAFindOut =1;
}
else
{
SCL_Out.NoBit = i;
SCL_In.NoBit = j;
SCLFindOut = 1;
}
break;
}
//--------------------------------------
}
else
{
//-------------------------------
ClrPortBit(888,i);
if(GetPortBit(889, j))
{
if(!SDAFindOut)
{
SDA_Out.NoBit = i;
SDA_In.NoBit = j;
SDAFindOut = 1;
}
else
{
SCL_Out.NoBit = i;
SCL_In.NoBit = j;
SCLFindOut = 1;
}
break;
}
//-------------------------------
}
}
//--------------------------------------------------------
if(SDAFindOut==1 && SCLFindOut==1)
break;
}
//==============================================================================
SDA_In.LPTaddress = 889;
SDA_Out.LPTaddress = 888;
SCL_In.LPTaddress = 889;
SCL_Out.LPTaddress = 888;
if(SDAFindOut==1 && SCLFindOut==1)
return(1);
else
return(0);
}
//================================================================================
unsigned char IicBusTest(unsigned char Address, unsigned char temp_SDA_In_CPLflag, unsigned char temp_SDA_Out_CPLflag,unsigned char temp_SCL_In_CPLflag,unsigned char temp_SCL_Out_CPLflag)
{
unsigned char tempIn;
unsigned char tempOut;
DoEvents();
SDA_In.CPLflag = temp_SDA_In_CPLflag;
SDA_Out.CPLflag = temp_SDA_Out_CPLflag;
SCL_In.CPLflag = temp_SCL_In_CPLflag;
SCL_Out.CPLflag = temp_SCL_Out_CPLflag;
f_I2C_Error =0;
//IicStart(Address);
IicAckTest(Address);
if(!f_I2C_Error)
return(1);
//----------------------------
tempIn = SDA_In.NoBit; //SCL,SDA互換
tempOut = SDA_Out.NoBit;
SDA_In.NoBit = SCL_In.NoBit;
SDA_Out.NoBit = SCL_Out.NoBit;
SCL_In.NoBit = tempIn;
SCL_Out.NoBit = tempOut;
//---------------------------
f_I2C_Error = 0;
//IicStart(Address);
IicAckTest(Address);
if(!f_I2C_Error)
return(1);
return(0);
}
//=================================================================================
unsigned char IicBusSearch(unsigned char deviceAddress)
{
if(!IicToolTest())
{
//printf("IicTool not finded !!!");
return(0);
}
if(IicBusTest(deviceAddress, 0, 0, 0, 0)) //0
return 1;
else if(IicBusTest(deviceAddress, 0, 0, 0, 1)) //1
return 1;
else if(IicBusTest(deviceAddress, 0, 0, 1, 0)) //2
return 1;
else if(IicBusTest(deviceAddress, 0, 0, 1, 1)) //3
return 1;
else if(IicBusTest(deviceAddress, 0, 1, 0, 0)) //4
return 1;
else if(IicBusTest(deviceAddress, 0, 1, 0, 1)) //5
return 1;
else if(IicBusTest(deviceAddress, 0, 1, 1, 0)) //6
return 1;
else if(IicBusTest(deviceAddress, 0, 1, 1, 1)) //7
return 1;
else if(IicBusTest(deviceAddress, 1, 0, 0, 0)) //8
return 1;
else if(IicBusTest(deviceAddress, 1, 0, 0, 1)) //9
return 1;
else if(IicBusTest(deviceAddress, 1, 0, 1, 0)) //10
return 1;
else if(IicBusTest(deviceAddress, 1, 0, 1, 1)) //11
return 1;
else if(IicBusTest(deviceAddress, 1, 1, 0, 0)) //12
return 1;
else if(IicBusTest(deviceAddress, 1, 1, 0, 1)) //13
return 1;
else if(IicBusTest(deviceAddress, 1, 1, 1, 0)) //14
return 1;
else if(IicBusTest(deviceAddress, 1, 1, 1, 1)) //15
return 1;
return 0;
}
unsigned char WINAPI InitI2C(HINSTANCE hinst,unsigned char address)
{
//if(LoadLibrary("io")==NULL)
// return 0;
//IO_DllMain(hinst, DLL_PROCESS_ATTACH, NULL);
LoadIODLL();
/*
SDA_In.LPTaddress=0x379;
SDA_In.NoBit=7;
SDA_In.CPLflag=0;
SDA_Out.LPTaddress=0x378;
SDA_Out.NoBit=0;
SDA_Out.CPLflag=1;
SCL_In.LPTaddress=0x379;
SCL_In.NoBit=6;
SCL_In.CPLflag=1;
SCL_Out.LPTaddress=0x378;
SCL_Out.NoBit=1;
SCL_Out.CPLflag=1;
*/
return(IicBusSearch(address));
}
void WINAPI InitLPT(HINSTANCE hinst)
{
//LoadLibrary("io");
//IO_DllMain(hinst, DLL_PROCESS_ATTACH, NULL);
LoadIODLL();
}
void WINAPI EndLPT(HINSTANCE hinst)
{
//IO_DllMain(hinst, DLL_PROCESS_DETACH, NULL);
UnloadIODLL();
}
//extern void UnloadIODLL();
//extern int LoadIODLL(HINSTANCE hInstance);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -