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

📄 i2c.cpp

📁 通过PC并口模拟I2C信号
💻 CPP
字号:
// i2c.cpp : 僀儞僾儕儊儞僥乕僔儑儞 僼傽僀儖
//

#include "stdafx.h"
#include "demo.h"
#include "i2c.h"

#include <stdio.h>
#include <conio.h>
#pragma intrinsic(inp,outp)

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// Ci2c 僟僀傾儘僌





Ci2c::Ci2c(CWnd* pParent /*=NULL*/)
	: CDialog(Ci2c::IDD, pParent)
{
	//{{AFX_DATA_INIT(Ci2c)
		// 儊儌 - ClassWizard 偼偙偺埵抲偵儅僢僺儞僌梡偺儅僋儘傪捛壛傑偨偼嶍彍偟傑偡丅
	//}}AFX_DATA_INIT
}


void Ci2c::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(Ci2c)
                // 儊儌 - ClassWizard 偼偙偺埵抲偵儅僢僺儞僌梡偺儅僋儘傪捛壛傑偨偼嶍彍偟傑偡丅
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(Ci2c, CDialog)
	//{{AFX_MSG_MAP(Ci2c)
		// 儊儌 - ClassWizard 偼偙偺埵抲偵儅僢僺儞僌梡偺儅僋儘傪捛壛傑偨偼嶍彍偟傑偡丅
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Ci2c 儊僢僙乕僕 僴儞僪儔

//#################
//# I2C interface #
//#################
void Ci2c::start_s()
{
	int i,nn,mm,ll;
	nn=I2C_SPEED*2; mm=nn; ll=nn;
	for (i=1 ; i<=nn ; i++) {outp_( PORT_ADDRESS ,0x00 |0XFC );}
	for (i=1 ; i<=mm ; i++) {outp_( PORT_ADDRESS ,0x02 |0XFC );}
	for (i=1 ; i<=ll ; i++) {outp_( PORT_ADDRESS ,0x03 |0XFC );}
}

void Ci2c::stop_s()
{
	int i,nn,mm,ll;
	nn=I2C_SPEED*2; mm=nn; ll=nn;
	for (i=1 ; i<=nn ; i++) {outp_( PORT_ADDRESS , 0x03 |0XFC);}
	for (i=1 ; i<=mm ; i++) {outp_( PORT_ADDRESS , 0x02 |0XFC);}
	for (i=1 ; i<=ll ; i++) {outp_( PORT_ADDRESS , 0x00 |0XFC);}

}

void Ci2c::data_s(int n)
{
	int    i,l,nn,mm,ll,x,bit,ml,nl,xx;
	bit = 8; ml = 0x01; nl = (int)n;
	nn=I2C_SPEED; mm=nn*2; ll=nn;
	for( l = 1 ; l <= bit ; l++)
	{
		x=0x0f;
		xx=(int)( (nl >> (bit-l)) & ml );
		if ( xx==1 ) x=0xFd;
		for (i=1 ; i<=nn ; i++) {outp_( PORT_ADDRESS , 0xFF&x);}
		for (i=1 ; i<=mm ; i++) {outp_( PORT_ADDRESS , 0xFE&x);}
		for (i=1 ; i<=ll ; i++) {outp_( PORT_ADDRESS , 0xFF&x);}
	}
}

int Ci2c::data_g()
{
	int bit,i,j,d,d1,da,n1,n2,n3;
	bit=8;
	n1=I2C_SPEED;n2=n1*2;n3=n1;
	da=0;
	for(i=1;i<=bit;i++)
	{
		for(j=1;j<=n1;j++) {outp_(PORT_ADDRESS,0x01 |0XFC);}
		for(j=1;j<=n2;j++) {outp_(PORT_ADDRESS,0x00 |0XFC);}
		d=inp_(PORT_ADDRESS+1);d1=(d>>5)&0x01 ^1;
		 for(j=1;j<=n3;j++) {outp_(PORT_ADDRESS,0x01 |0XFC);}
		da=da|d1 ;
		da=(da<<1);
	}
	da=da>>1;
	return(da);
}


int Ci2c::a_s()
{
	int i,nn,mm,ll, ii,sda,scl,n;
	int ack;
	nn=I2C_SPEED; mm=nn*2; ll=nn;
	ii=1;n=3;
	for (i=1 ; i<=nn ; i++) outp_( PORT_ADDRESS , 0x01 |0XFC);
	for (i=1 ; i<=mm ; i++) outp_( PORT_ADDRESS , 0x00 |0XFC);
		ack=1;
	do	{
			ac_get(PORT_ADDRESS+1, &sda, &scl);
			if (ii>n){sda=0;scl=0; ack=0;}	//check "n" times
			ii=ii++;
		} while( ( !(sda==0)&&(scl==0) ) );
	for (i=1 ; i<=ll ; i++) {outp_( PORT_ADDRESS , 0x01 |0XFC);}
	return(ack);
}

void Ci2c::ac_get(int port, int *sdaa, int *scla)
{
	int d,ml,sda,scl;
	ml=0x01;
	d=inp_(port);
	sda=(d>>5)&ml ^1;
	scl=(d>>7)&ml ^1;
	*sdaa=sda;*scla=scl;
}

int Ci2c::check_i2c()
{
	int ack=-1,sda,scl,error=0;
	ac_get(PORT_ADDRESS+1, &sda, &scl);	
	//interface
	if ( (sda==1)&&(scl==0) )	error=0;	//I2C interface OK
	else	error=1;						//I2C interface error
	//communication
	start_s();
	data_s(LINK_IC_ADDRESS);	ack=a_s();		
	stop_s();
	if(ack!=1)	error=2;					//I2C communication error
											//return no ack
 	return(error);
}

//###################
//# LINK IC control #
//###################
void Ci2c::link_setdata(int address, int data)
{
	int temp[4],i;
	start_s();
	temp[0]=LINK_IC_ADDRESS; temp[1]=address; temp[2]=data;
	for(i=0;i<3;i++){
		data_s(temp[i]);a_s();
	}
	stop_s();
}

int Ci2c::link_getdata(int address)
{
	int gdata;
	//V0.0 for MT312
	//start_s();data_s(LINK_IC_ADDRESS);a_s();data_s(address);a_s();stop_s();
	start_s();data_s(LINK_IC_ADDRESS);a_s();data_s(address);a_s();
	start_s();data_s(LINK_IC_ADDRESS | 0x01);a_s();gdata=data_g();a_s();
	stop_s();
	return(gdata);
}

//##################
//# PLL IC control #
//##################
void Ci2c::pll_setdata(int byte1, int byte2, int byte3, int byte4, int byte5)
{
	start_s();
	data_s(byte1);a_s();
	data_s(byte2);a_s();
	data_s(byte3);a_s();
	data_s(byte4);a_s();
	data_s(byte5);a_s();
	stop_s();
}

int Ci2c::pll_getdata(int byte1)
{
	int gdata;
	start_s();
	data_s(byte1|0x01);a_s();
	gdata=data_g();	 a_s();
	stop_s();
	return(gdata);
}

//===========================================================================
int Ci2c::outp_(int port, int data)
{
	if(DLL)
	{
		bool bRet = m_wio.WritePort(data ,port);
		return bRet;
//		return 0;
	}
	else
	{
		return outp(port,data);
	}
}

int Ci2c::inp_(int port)
{
	if(DLL)
	{
		BYTE byteData = 0;
		bool bRet = m_wio.ReadPort( byteData ,port);
		return byteData;
	}
	else
	{
		return inp(port);
	}
}

//
int Ci2c::Init()
{
	return m_wio.Init();
}

void Ci2c::End()
{
	m_wio.End();
}

int Ci2c::GetLptPort()
{
	return m_wio.GetLptPort();
}

void Ci2c::SetLptPort(WORD wPort, BOOL bSetOnly)
{
	m_wio.SetLptPort(wPort,bSetOnly);
}

//==================================================
void Ci2c::i2c_write(int *data,int num)
{
	int i;
	start_s();
	for(i=0;i<num;i++)
	{
		data_s(*(data+i)); a_s();
	}
	stop_s();
}

//----------------------------------
void Ci2c::test()
{
	CString t; 
//	t.Format("%.2X",m_wio.GetLptPort()); 
	t.Format("%.2X",m_wio.WritePort(0x00)); 
//	t.Format("%.2X",m_wio.Init()); 
	MessageBox(t);
}


//---


//BOOL Ci2c::i2c_read_write(BOOL mode, unsigned char ChipAddress, unsigned char *Data, int NbData)
BOOL Ci2c::i2c_read_write(BOOL mode, int ChipAddress, int *Data, int NbData)
{
	BOOL flag=1;
	int i;
	if(mode==1){//write:mode=1
		start_s();
		data_s(ChipAddress); a_s();
		for(i=0;i<NbData;i++)
		{
			data_s(*(Data+i)); a_s();
		}
		stop_s();
		return flag;
	}
	else{//read:mode=0
		start_s();
		data_s(ChipAddress|=0x01); a_s();
		for(i=0;i<NbData;i++)
		{
			*(Data+i)=data_g(); a_s();
		}
		stop_s();
		return flag;
	}
}

⌨️ 快捷键说明

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