IIC读写EEPROM问题

gongqinxia1987 2010-10-17 02:05:36
IIC读写不成功!!!

Wince 5.0+IIC驱动读写AT24c08
驱动是用开发板自带的IIC驱动(有drv.c i2c.c drv.h三个代码文件)

在EVC下部分的应用代码如下:
typedef struct _I2C_IO_DESC {
DWORD SlaveAddr; // Target Slave Address
UCHAR WordAddr; // Starting Slave Word Address
PUCHAR Data; // pBuffer
DWORD Count; // nBytes to read/write
} I2C_IO_DESC, *PI2C_IO_DESC;

#define IOCTL_I2C_READ 1
#define IOCTL_I2C_WRITE 2

void CAsDlg::OnButton1()
{
// TODO: Add your control notification handler code here
hFile=CreateFile(_T("I2C0:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(_T("IIC驱动打开失败!"));
return;
}
else
MessageBox(_T("IIC驱动打开成功!"));
}

void CAsDlg::OnWrite()
{
// TODO: Add your control notification handler code here
DWORD RetBytes;
BYTE pBuffin[2]={0};
I2C_IO_DESC inputBuffer;

inputBuffer.SlaveAddr=I2C_ADDR;
inputBuffer.WordAddr=0;
inputBuffer.Data=pBuffin;
inputBuffer.Count=1;

if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(_T("IIC驱动未打开!"));
return;
}
BOOL ret=::DeviceIoControl(hFile,IOCTL_I2C_WRITE,&inputBuffer,sizeof(I2C_IO_DESC),NULL,0,&RetBytes,NULL);
//Sleep(1);
if(ret!=TRUE)
{
MessageBox(_T("写AT24C08失败!!!"));
return;
}
else
MessageBox(_T("写AT24C08成功!"));

}
void CAsDlg::OnRead()
{
// TODO: Add your control notification handler code here
BYTE pBuffout[1];
DWORD actlen;
CString strTmp;
I2C_IO_DESC outputBuffer;

outputBuffer.SlaveAddr=I2C_ADDR|0x01;
outputBuffer.WordAddr=0;
outputBuffer.Data=pBuffout;
outputBuffer.Count=2;

BOOL ret=::DeviceIoControl(hFile,IOCTL_I2C_READ,&outputBuffer,sizeof(I2C_IO_DESC),&pBuffout,2,&actlen,NULL);
//Sleep(1);
if(ret!=TRUE)
{
MessageBox(_T("读AT24C08失败!"));
return;
}
else
MessageBox(_T("读AT24C08成功!"));

strTmp.Format(_T("%x"),pBuffout);
CEdit *pDispEdit=(CEdit *)GetDlgItem(IDC_READ_DISP);
pDispEdit->SetWindowText(strTmp);
UpdateData(FALSE);
}
读写都不成功,恳请做过的高人请指点一下,是那出了问题?
...全文
598 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰满 2010-11-01
  • 打赏
  • 举报
回复
嗯,学习一下,顶
yalan425 2010-10-31
  • 打赏
  • 举报
回复
我一开始也遇到了你这个问题,我用的是6410,后来终于找到了原因,是因为deviceiocontrol的控制码不对。我驱动里面的控制码是CTL_CODE(FILE_DEVICE_IIC, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)函数,我跟串口打印发现它并不是单纯的0,而是一个比较大的数。不知道你是不是也是因为这个原因。
loongembedded 2010-10-24
  • 打赏
  • 举报
回复
楼主可以参考下面这个链接
http://topic.csdn.net/u/20101013/17/71d1aedd-3b2d-492b-8b95-67ad7c1a868a.html
coding码场 2010-10-17
  • 打赏
  • 举报
回复
还是先把IIC的协议搞清楚吧!EEPORM现在用得都很少了,主要它有片的概念。 最简单的就是下个IO模拟的IIC程序来测试一下,移植进去也很容易。
gongqinxia1987 2010-10-17
  • 打赏
  • 举报
回复
焦急苦闷中……
gongqinxia1987 2010-10-17
  • 打赏
  • 举报
回复
大家难道都没有遇到过怎样的问题吗?
gongqinxia1987 2010-10-17
  • 打赏
  • 举报
回复
自己顶起,没有人做过吗?大家帮忙看看呀。
loongembedded 2010-10-17
  • 打赏
  • 举报
回复
我比较了你的IIC驱动和我的IIC驱动,就是你的IIC驱动中的函数InitRegs中没有初始化GPE14和GPE15,你一定要在你的这个函数中加入如下代码
pI2C->pIOPReg->GPEUDP &= ~(0xf<<28);
pI2C->pIOPReg->GPEUDP |= (0x5<<28); // Pull-up-down Disable
pI2C->pIOPReg->GPECON &= ~(0xf<<28);
pI2C->pIOPReg->GPECON |= (0xa<<28); // GPE15:IICSDA, GPE14:IICSCL
而且要保证对GPE14和GPE15的配置不会被后面加载的驱动修改掉,我之前说的源代码查看与编辑工具是Source Insight 3.5和beyond compare代码比较工具,我周一也参考你的应用程序用我的设备验证一下。

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧