📄 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 + -