⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2cdll.cpp

📁 通过并口控制I2C总线的动态库源码
💻 CPP
字号:
// 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++)			// 为避免数据传送时受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++)			// 为避免数据传送时受IIC总线上大电容(100-1000P)的影响,以及适应某些反应速度慢的IC在做出反应前拉低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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -