📄 dlgcat1025.cpp
字号:
// DLGCAT1025.cpp : implementation file
//
#include "stdafx.h"
#include "Magic2410.h"
#include "DLGCAT1025.h"
#include "I2C.h"
#define I2C_ADDR_1025 0xA0 /* CAT1025 的I2C地址 */
#define PAGE_SIZE_CAT1025 16 /* CAT1025 的页面大小:16字节 */
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CRITICAL_SECTION critical_section_iic;
HANDLE hFileIIC;
HANDLE m_hFileGpio;
/////////////////////////////////////////////////////////////////////////////
// DLGCAT1025 dialog
DLGCAT1025::DLGCAT1025(CWnd* pParent /*=NULL*/)
: CDialog(DLGCAT1025::IDD, pParent)
{
//{{AFX_DATA_INIT(DLGCAT1025)
m_WriteByte = _T("");
m_strRecDisp = _T("");
m_StartAddr = 0;
m_EndAddr = 0;
//}}AFX_DATA_INIT
}
void DLGCAT1025::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DLGCAT1025)
DDX_Text(pDX, IDC_WRITE_BYTE, m_WriteByte);
DDX_Text(pDX, IDC_REC_DISP, m_strRecDisp);
DDX_Text(pDX, IDC_START_ADDR, m_StartAddr);
DDX_Text(pDX, IDC_END_ADDR, m_EndAddr);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DLGCAT1025, CDialog)
//{{AFX_MSG_MAP(DLGCAT1025)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_READ_CAT1025, OnReadCat1025)
ON_BN_CLICKED(IDC_WRITE_CAT1025, OnWriteCat1025)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DLGCAT1025 message handlers
void DLGCAT1025::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
if (hFileIIC != NULL)
{
CloseHandle(hFileIIC);
hFileIIC = NULL;
}
}
/*******************************************************************************************
函数名称: ReadCAT1025
描 述: 从 CAT1025 读取数据
输入参数: HANDLE hFile: 驱动程序文件句柄
DWORD offset: 从机子地址
DWORD len : 要读取的字节长度
输出参数: recbuff : 接收缓冲区
返 回: < 0: 操作失败; > 0: 成功读取的字节数
********************************************************************************************/
int DLGCAT1025::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 DLGCAT1025::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 DLGCAT1025::OnReadCat1025()
{
// TODO: Add your control notification handler code here
DWORD i, len;
BYTE recbuf[256];
BYTE I2cSla = I2C_ADDR_1025;
CString tmp;
BOOL ret;
if (hFileIIC == NULL) /* 检查驱动是否已打开 */
{
MessageBox(_T("IIC驱动未打开!"));
return;
}
// 设置 I2C 从机器件地址
EnterCriticalSection(&critical_section_iic);
ret = ::DeviceIoControl(hFileIIC, IOCTL_SET_I2C_SLAVE, &I2cSla, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
{
CloseHandle(hFileIIC);
hFileIIC = NULL;
MessageBox(_T("Set I2C slave address fail!"));
return;
}
UpdateData(TRUE);
if ((m_StartAddr > 255) || (m_EndAddr > 255)) /* 检查输入参数是否正确 */
{
MessageBox(_T("起始地址或结束地址错误!"));
return;
}
len = m_EndAddr - m_StartAddr + 1; /* 计算要读取的字节数 */
m_strRecDisp = "";
i = ReadCAT1025(hFileIIC, m_StartAddr, len, recbuf); /* 从 CAT1025 读出数据 */
LeaveCriticalSection(&critical_section_iic);
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); /* 更新显示 */
}
// "写" 按键单击事件代码: 写 CAT1025
void DLGCAT1025::OnWriteCat1025()
{
// TODO: Add your control notification handler code here
BYTE sendbuff[256], writebyte;
int tmp, writelen;
BYTE I2cSla = I2C_ADDR_1025;
BOOL ret;
if (hFileIIC == NULL) /* 检查驱动是否已打开 */
{
MessageBox(_T("IIC驱动未打开!"));
return;
}
// 设置 I2C 从机器件地址
EnterCriticalSection(&critical_section_iic);
ret = ::DeviceIoControl(hFileIIC, IOCTL_SET_I2C_SLAVE, &I2cSla, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
{
CloseHandle(hFileIIC);
hFileIIC = NULL;
MessageBox(_T("Set I2C slave address fail!"));
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(hFileIIC, m_StartAddr, writelen, sendbuff); /* 将数据写入 CAT1025 */
LeaveCriticalSection(&critical_section_iic);
if (tmp == writelen)
MessageBox(_T("写 CAT1025 成功!"));
else
MessageBox(_T("写 CAT1025 失败!"));
}
BOOL DLGCAT1025::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_StartAddr = 0; // 起始地址
m_EndAddr = 255; // 结束地址
m_WriteByte = "AA"; // 写入字节
UpdateData(FALSE); // 更新显示
BYTE I2cSla = I2C_ADDR_1025;
// 打开 IIC 驱动
hFileIIC = CreateFile(TEXT("IIC1:"), GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, 0);
if (hFileIIC == INVALID_HANDLE_VALUE)
{
MessageBox(_T("Cannot Open IIC1!"));
return FALSE;
}
//MessageBox(_T("Open IIC1 sucessed!"));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -