📄 e2p.cpp
字号:
// e2p.cpp: implementation of the Ce2p class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "E2PRW.h"
#include "e2p.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
UINT ShowTime5_1_Proc(LPVOID lParam); //声明定时器函数v
#pragma comment(lib, "winmm.lib")
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Ce2p::Ce2p()
{
js=0;
m_pWriteBuf=new BYTE[0x20000]; //申明一个数组大小为1000
m_pReadBuf=(BYTE*)GlobalAlloc(GMEM_FIXED,0x20000);//建立缓冲2
//m_pWriteBuf=(BYTE*)GlobalAlloc(GMEM_FIXED,0x20000);//建立缓冲1
memset(m_pReadBuf,0xff,0x20000);//格式 化缓冲区
//memset(m_pWriteBuf,0xff,0x20000);//格式化缓冲区
}
Ce2p::~Ce2p()
{
}
void Ce2p::InitPro()//CWnd* pWnd为对话框指针,在对话框初始化时就用THIS传输来了
{
if(!CParallelPort::InitPort())//初始化并口
{
AfxMessageBox("初始化并口失败!");
}
}
/*=================================================
i2c_write(地址,数据),写一个字节
=================================================*/
void Ce2p::i2c_write(int Address,unsigned char Data)
{
do{
i2c_start();
dealy(10);
i2c_send8bit(0xA6);
// dealy(10);
}while(i2c_ack());
i2c_send8bit(Address/256);
i2c_ack();
i2c_send8bit(Address%256);
i2c_ack();
i2c_send8bit(Data);
i2c_ack();
i2c_stop();
return;
}
/*=================================================
i2c_read(地址,数据,数量),写一个页面
=================================================*/
void Ce2p::i2c_pagewrite(unsigned char Address,unsigned char Data,int no)
{
unsigned char i;
do{
i2c_start();
dealy(10);
i2c_send8bit(0xA6);
dealy(10);
}while(i2c_ack());
i2c_send8bit(Address/256);
i2c_ack();
i2c_send8bit(Address%256);
i2c_ack();
for(i=0;i<page;i++)
{
i2c_send8bit(m_pWriteBuf[i]);
i2c_ack();
}
i2c_stop();
return;
}
/*=================================================
i2c_read(地址,数据),写一个字节
=================================================*/
unsigned char Ce2p::i2c_read(int Address)
{
unsigned char c;
do {
i2c_start();
i2c_send8bit(0xA6);
}while(i2c_ack()); //=1,表示无确认,再次发送
i2c_send8bit(Address/256);
i2c_ack(); //=1,表示无确认,再次发送
i2c_send8bit(Address%256);
i2c_ack(); //=1,表示无确认,再次发送
i2c_start();
i2c_send8bit(0xA7);
i2c_ack();
c=i2c_receive8bit();
i2c_ack(); //=1,表示无确认,再次发送
i2c_stop();
return(c);
}
//=================================================
//发送开始信号
void Ce2p::i2c_start(void)
{
CParallelPort::SetPinH(3);//SDA = 1;
// dealy(5);
CParallelPort::SetPinH(2);//SCL = 1;
// dealy(5);
CParallelPort::SetPinL(3);//SDA = 0;
// dealy(5);
CParallelPort::SetPinL(2);//SCL = 0;
// dealy(5);
return;
}
//发送结束信号
void Ce2p::i2c_stop(void)
{
CParallelPort::SetPinL(3);//SDA = 0;
// dealy(5);
CParallelPort::SetPinH(2);//SCL = 1;
// dealy(5);
CParallelPort::SetPinH(3);//SDA = 1;
// dealy(5);
return;
}
//发送接收确认信号
BYTE Ce2p::i2c_ack(void)
{
BYTE ack;
CParallelPort::SetPinH(3);//SDA = 1;
// dealy(5);
CParallelPort::SetPinH(2);//SCL = 1;
// dealy(5);
if(CParallelPort::GetPinLogic(15))//if (SDA==1)
ack = 1;
else
ack = 0;
CParallelPort::SetPinL(2);//SCL = 0;
return (ack);
}
//发送接收非确认信号
void Ce2p::i2c_noack(void)
{
CParallelPort::SetPinH(SDAO);
// dealy(10);
CParallelPort::SetPinH(SCL);
// dealy(10);
CParallelPort::SetPinL(SCL);
}
//送八位数据
void Ce2p::i2c_send8bit(unsigned char b)
{
byte a1;
unsigned char a;
for(a=0;a<8;a++)
{
a1=b<<a;
a1=a1 & 0x80;
if (a1==0x80)
{
CParallelPort::SetPinH(3);//SDA = 1;
}
else
{
CParallelPort::SetPinL(3);//SDA = 0;
}
CParallelPort::SetPinH(2);//SCL = 1;
CParallelPort::SetPinL(2);//SCL = 0;
}
return;
}
//接收八位数据
unsigned char Ce2p::i2c_receive8bit(void)
{
unsigned char a;
unsigned char b=0;
for(a=0;a<8;a++)
{
CParallelPort::SetPinH(2);//SCL = 1;
b=b<<1;
if(CParallelPort::GetPinLogic(15))//if (SDA==1)
b=b|0x01; //按位或
CParallelPort::SetPinL(2);//SCL = 0;
}
return (b);
}
//连续读数据
byte Ce2p::i2c_read(void)
{
unsigned char c; int i;
//do{
i2c_start();
i2c_send8bit(0xA6);
//}while(i2c_ack()); //=1,表示无确认,再次发送
i2c_send8bit(0x00);
i2c_ack();
i2c_send8bit(0x00);
i2c_ack();
//do{
i2c_start();
i2c_send8bit(0xA7);
//}while(i2c_ack());
for(i=0;i<size;i++)
{
m_pWriteBuf[i]=i2c_receive8bit();
i2c_ack();
}
i2c_stop();
return(c);
}
//////////////////////////////
void Ce2p::dealy(int time)
{
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart; // 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart; // 获得初始值
do{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;// 获得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒
}while(dfTim<(0.000000001* time));//0.000001
}
void Ce2p::open()
{
CParallelPort::SetPinH(4);
CParallelPort::SetPinH(5);
CParallelPort::SetPinH(6);
CParallelPort::SetPinH(7);
}
void Ce2p::close()
{
CParallelPort::SetPinL(4);
CParallelPort::SetPinL(5);
CParallelPort::SetPinL(6);
CParallelPort::SetPinL(7);
}
byte Ce2p::Read_8bit()
{
BYTE rdata=0;
int i=8;
CParallelPort::SetPinH(SDAO);
dealy(5);
while(i--)
{
rdata<<=1;
CParallelPort::SetPinL(SCL);
dealy(1);
CParallelPort::SetPinH(SCL);
if(GetPinLogic(SDAI))
rdata|=0x01;
else
rdata=rdata&0xFE;
}
return rdata;
}
BYTE Ce2p::check()
{
//dealy(5);
if(Ack==0)
{
// AfxMessageBox("出错!");
return 1;
}
else return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -