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

📄 cat1025dlg.cpp

📁 对核心板DevicARM2410A上CAT1025中的E2PROM进行读写。
💻 CPP
字号:
// CAT1025Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "CAT1025.h"
#include "CAT1025Dlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CCAT1025Dlg dialog

CCAT1025Dlg::CCAT1025Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCAT1025Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCAT1025Dlg)
	m_strRecDisp = _T("");
	m_StartAddr = 0;
	m_EndAddr = 0;
	m_WriteByte = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCAT1025Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCAT1025Dlg)
	DDX_Text(pDX, IDC_REC_DISP, m_strRecDisp);
	DDX_Text(pDX, IDC_START_ADDR, m_StartAddr);
	DDX_Text(pDX, IDC_END_ADDR, m_EndAddr);
	DDX_Text(pDX, IDC_WRITE_BYTE, m_WriteByte);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCAT1025Dlg, CDialog)
	//{{AFX_MSG_MAP(CCAT1025Dlg)
	ON_BN_CLICKED(IDC_READ_CAT1025, OnReadCat1025)
	ON_BN_CLICKED(IDC_OPEN_IIC1, OnOpenIIC1)
	ON_BN_CLICKED(IDC_CLOSE_IIC1, OnCloseIIC1)
	ON_BN_CLICKED(IDC_WRITE_CAT1025, OnWriteCat1025)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCAT1025Dlg message handlers

BOOL CCAT1025Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here
	m_StartAddr = 0;			    // 起始地址
	m_EndAddr = 255;				// 结束地址
	m_WriteByte = "AA";				// 写入字节
	UpdateData(FALSE);				// 更新显示

	return TRUE;  // return TRUE  unless you set the focus to a control
}


/***************************************************

		实    验    代    码

****************************************************/


#include "I2C.h"						 /* 包含 I2C 命令代码头文件 */

#define I2C_ADDR			 0xA0		 /* CAT1025 的I2C地址 */
#define PAGE_SIZE_CAT1025	 16			 /* CAT1025 的页面大小:16字节 */

HANDLE hFile = INVALID_HANDLE_VALUE;	 /* 驱动程序设备句柄 */


// "打开驱动" 按键单击事件代码
void CCAT1025Dlg::OnOpenIIC1() 
{
	BYTE I2cSla = I2C_ADDR;
	BOOL ret;

	// 打开 IIC 驱动
	hFile = CreateFile(TEXT("IIC1:"), GENERIC_READ | GENERIC_WRITE, 0, 
							NULL, OPEN_EXISTING, 0, 0);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("打开 IIC 驱动失败!"));
		return;
	}
	else
		MessageBox(_T("打开 IIC 驱动成功!"));

	// 设置 I2C 从机器件地址
	ret = ::DeviceIoControl(hFile, IOCTL_SET_I2C_SLAVE, &I2cSla, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
	{
		OnCloseIIC1();
		MessageBox(_T("设置 I2C从机地址失败!"));
		return;
	}

	CButton *pOpenButton = (CButton*)GetDlgItem(IDC_OPEN_IIC1);		/* 取得控件指针 */
	CButton *pCloseButton = (CButton*)GetDlgItem(IDC_CLOSE_IIC1);  
	pOpenButton->EnableWindow(FALSE);								/* 禁止按键 */
	pCloseButton->EnableWindow(TRUE);								/* 使能按键 */
}


// "关闭驱动" 按键单击事件代码
void CCAT1025Dlg::OnCloseIIC1() 
{
	if (hFile != INVALID_HANDLE_VALUE)
	{
		CloseHandle(hFile);
		hFile = INVALID_HANDLE_VALUE;
	}	

	CButton *pOpenButton = (CButton*)GetDlgItem(IDC_OPEN_IIC1);		/* 取得控件指针 */
	CButton *pCloseButton = (CButton*)GetDlgItem(IDC_CLOSE_IIC1); 
	pOpenButton->EnableWindow(TRUE);								/* 使能按键 */
	pCloseButton->EnableWindow(FALSE);								/* 禁止按键 */
}

// 对话框关闭退出处理函数
void CCAT1025Dlg::OnDestroy() 
{
	CDialog::OnDestroy();
	OnCloseIIC1();
}


/*******************************************************************************************
函数名称: ReadCAT1025
描    述: 从 CAT1025 读取数据
输入参数: HANDLE hFile: 驱动程序文件句柄
		  DWORD offset: 从机子地址
		  DWORD len   : 要读取的字节长度
输出参数: recbuff : 接收缓冲区
返    回: < 0: 操作失败;   > 0: 成功读取的字节数  
********************************************************************************************/
int ReadCAT1025(HANDLE hFile, DWORD offset, DWORD len, BYTE *recbuff)
{
	DWORD actlen;
	BOOL ret;
	
	if ((len + offset) > 256)	return -1;				 /* 输入参数检查 */
		
	/* 先发送从机子地址 */
	ret = ::WriteFile(hFile, (BYTE *)&offset, 1, &actlen, NULL); 
	if ((actlen != 1) || (ret == FALSE)) return -1;
		

	ret = ::ReadFile(hFile, recbuff, len, &actlen, NULL); /* 读取数据 */
	if (ret == FALSE)  	return -1;

	return actlen;										  /* 返回实际读到的字节数 */
}


/*******************************************************************************************
函数名称: WriteCAT1025
描    述: 向 CAT1025 写入数据
输入参数: HANDLE hFile  : 驱动程序文件句柄
		  DWORD offset  : 从机子地址
		  DWORD len     : 要写入的字节长度
		  BYTE *sendbuff: 发送缓冲区
输出参数: 无
返    回: < 0: 操作失败;   > 0: 成功写入的字节数  
********************************************************************************************/
int WriteCAT1025(HANDLE hFile, DWORD offset, DWORD len, BYTE *sendbuff)
{
	DWORD align;
 	DWORD ret = 0, actlen = 0, writelen;
	unsigned char buff[PAGE_SIZE_CAT1025 + 1];			 /* 写操作缓冲区 */
	
	if ((len + offset) > 256) return -1;				 /* 参数检查 */
	
	while(1)
	{
		if (len > 0)
		{
			align = offset % PAGE_SIZE_CAT1025;
			if (align == 0)								 /* 当前地址与页对齐 */
			{
				if (len >= PAGE_SIZE_CAT1025)			 /* 写入长度大于一页 */
					writelen = PAGE_SIZE_CAT1025;		 
				else
					writelen = len;						 
			}
			else
			{
				if (len > (PAGE_SIZE_CAT1025 - align))	 /* 写入长度大于可写空间 */
					writelen = PAGE_SIZE_CAT1025 - align;
				else
					writelen = len;
			}

			buff[0] = (BYTE)offset;					     /* buff[0]为从机子地址 */
			memcpy(&buff[1], sendbuff, writelen);		 /* 复制写入数据到写操作缓冲区 */

			/* 执行写 CAT1025 操作 */
			::WriteFile(hFile, buff, writelen + 1, &actlen, NULL);
			if (actlen < 1) return -1;
			
			Sleep(6);			  			   			  /* 延时6ms以执行内部写操作 */
   			sendbuff += writelen;							
	   		offset  += writelen;
			actlen = actlen - 1;
			ret += actlen;		  						  /* 记录已成功写入的字节数 */
			len = len - actlen;
		}
		else
			break;
	}
	
	return ret;											  /* 返回实际写入的字节数 */
}


// "写" 按键单击事件代码: 写 CAT1025
void CCAT1025Dlg::OnWriteCat1025() 
{
	BYTE sendbuff[256], writebyte;
	int tmp, writelen;

	if (hFile == INVALID_HANDLE_VALUE)							/* 检查驱动是否已打开 */
	{
		MessageBox(_T("IIC驱动未打开!"));
		return;
	}

	UpdateData(TRUE);
	if ((m_WriteByte.GetLength() != 2) ||
		(_stscanf(m_WriteByte, _T("%x"), &tmp) != 1))		    /* 检查输入参数是否正确 */
	{
		MessageBox(_T("写入字节必须是1个字节的16进制数!"));
		return;
	}

	if ((m_StartAddr > 255) || (m_EndAddr > 255))				/* 检查输入地址是否正确*/
	{
		MessageBox(_T("起始地址或结束地址错误!"));
		return;
	}
	writebyte = (BYTE)tmp;
	
	writelen = m_EndAddr - m_StartAddr + 1;					    /* 计算要写入的长度 */
	memset(sendbuff, writebyte, writelen);						/* 填充发送缓冲区 */
	tmp = WriteCAT1025(hFile, m_StartAddr, writelen, sendbuff); /* 将数据写入 CAT1025 */

	if (tmp == writelen)
		MessageBox(_T("写 CAT1025 成功!"));
	else
		MessageBox(_T("写 CAT1025 失败!"));
}


// "读" 按键单击事件代码: 读 CAT1025
void CCAT1025Dlg::OnReadCat1025() 
{
	DWORD i, len;
	BYTE recbuf[256];
	CString tmp;

	if (hFile == INVALID_HANDLE_VALUE)					/* 检查驱动是否已打开 */
	{
		MessageBox(_T("IIC驱动未打开!"));
		return;
	}
	
	UpdateData(TRUE);
	if ((m_StartAddr > 255) || (m_EndAddr > 255))		/* 检查输入参数是否正确 */
	{
		MessageBox(_T("起始地址或结束地址错误!"));
		return;
	}
	len = m_EndAddr - m_StartAddr + 1;					/* 计算要读取的字节数 */

	m_strRecDisp = "";
	i = ReadCAT1025(hFile, m_StartAddr, len, recbuf);	/* 从 CAT1025 读出数据 */
	if (i != len)
	{
		MessageBox(_T("读CAT1025失败!"));
		return;
	}

	for (i = 0; i < len; i++)
	{
		tmp.Format(_T("%x"), recbuf[i]);				/* 格式化读取到的数据为字符串 */
		if (recbuf[i] < 0x10)
			tmp.Insert(0, _T("0"));						/* 加上前缀'0'  */

		m_strRecDisp += tmp + " ";
	}

	UpdateData(FALSE);									/* 更新显示 */
}

⌨️ 快捷键说明

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