主题 : Tiny6410的IIC读写失败问题。 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 47238
精华: 1
发帖: 43
金钱: 265 两
威望: 53 点
贡献值: 1 点
综合积分: 106 分
注册时间: 2011-05-20
最后登录: 2011-08-15
楼主  发表于: 2011-06-08 12:58

 Tiny6410的IIC读写失败问题。

从前面发帖的朋友那里获得的IIC读写源代码,怎么读写都失败呢?盼望高人指点,错在那里?

// IIC初始化
    h_I2C = CreateFile(L"IIC0:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
    if(h_I2C == INVALID_HANDLE_VALUE)
    {
        MessageBox(_T("打开IIC驱动失败!"));
    }

// I2C写操作:
void CMy6410Dlg::OnBnClickedBtnwri2c()
{
    // TODO: 在此添加控件通知处理程序代码
    unsigned short str_tmp, *str;
    int Ret;

    BYTE databuf[1024];
    int WriteNum = 0;
    int i;
    DWORD dwBytesWritten = 0;

    // TODO: Add your control notification handler code here
    if(h_I2C == INVALID_HANDLE_VALUE)
    {
        MessageBox(_T("IIC驱动未打开!"));
        return;
    }
    UpdateData(false);

    if(m_StartAddr > 0x3ff)
    {
        MessageBox(_T("起始地址错误!"));
        return;
    }

    WriteNum = m_strWrDisp.GetLength();
    memset(&IIC_AddressData, 0, sizeof(I2C_IO_DESC));

    str = (unsigned short*)m_strWrDisp.GetBuffer(WriteNum);

    for(i = 0; i < WriteNum; i++)
    {
        str_tmp = *(str + i);
        databuf = (BYTE)str_tmp;
    }

    IIC_AddressData.SlaveAddr=0xa0;
    IIC_AddressData.Data = databuf;
    IIC_AddressData.WordAddr = m_StartAddr;
    IIC_AddressData.Count = WriteNum;

    Ret = DeviceIoControl(h_I2C,IOCTL_I2C_WRITE, &IIC_AddressData, sizeof(I2C_IO_DESC), OutputBuf,WriteNum,&ReadBytes, NULL);
    if(Ret == true)
        MessageBox(_T("写AT24LC04成功!"));
    else
        MessageBox(_T("写AT24LC04失败!"));

    m_strWrDisp.ReleaseBuffer();
}

// I2C读操作:
void CMy6410Dlg::OnBnClickedBtnrdi2c()
{
    // TODO: 在此添加控件通知处理程序代码
    int Ret;
    int ReadNum = 0;
    int i;
    DWORD dwBytesRead = 0;
    CString tmp;
    BYTE databuf[1024];
    unsigned short buf;

    // TODO: Add your control notification handler code here
    if(h_I2C == INVALID_HANDLE_VALUE)
    {
        MessageBox(_T("IIC驱动未打开!"));
        return;
    }
    UpdateData(false);

    if(m_StartAddr > 0x3ff)
    {
        MessageBox(_T("起始地址错误!"));
        return;
    }

    ReadNum = m_ReadNum;    
    memset(&IIC_AddressData, 0, sizeof(I2C_IO_DESC));
    IIC_AddressData.SlaveAddr = 0xa1;            //READ
    IIC_AddressData.WordAddr = m_StartAddr;        //start addr
    IIC_AddressData.Data = databuf;
    IIC_AddressData.Count = ReadNum;

    Ret = DeviceIoControl(h_I2C,IOCTL_I2C_READ, &IIC_AddressData, sizeof(I2C_IO_DESC), OutputBuf, ReadNum,&ReadBytes, NULL);
    if (!ReadBytes)
    {
        MessageBox(TEXT("读AT24LC04失败!"));
    }
    else
    {
        m_strRdDisp=' ';
        for(i = 0; i < (int)ReadBytes; i++)
        {
            buf = (unsigned short)databuf;
            tmp.Format(_T("%c"), buf);
            if(buf < 0x10)
                tmp.Insert(0, _T("0"));

            m_strRdDisp =m_strRdDisp + tmp;
        }
        UpdateData(false);
    }
}


初始化都OK,就是读写都返回失败,请问怎么回事呢?
级别: 侠客
UID: 47238
精华: 1
发帖: 43
金钱: 265 两
威望: 53 点
贡献值: 1 点
综合积分: 106 分
注册时间: 2011-05-20
最后登录: 2011-08-15
1楼  发表于: 2011-06-08 16:06
// CAG-I2C初始化
    h_IIC = CreateFile(L"IIC0:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
    if(h_IIC == INVALID_HANDLE_VALUE)
    {
        MessageBox(_T("打开IIC驱动失败!"));
    }

// I2C写操作:
void CMy6410Dlg::OnBnClickedBtnwri2c()
{
    // TODO: 在此添加控件通知处理程序代码
    unsigned short str_tmp, *str;
    int Ret;

    BYTE databuf[1024];
    int WriteNum = 0;
    int i;
    DWORD dwBytesWritten = 0;

    // TODO: Add your control notification handler code here
    if(h_IIC == INVALID_HANDLE_VALUE)
    {
        MessageBox(_T("IIC驱动未打开!"));
        return;
    }
    UpdateData(false);

    if(m_StartAddr > 0x3ff)
    {
        MessageBox(_T("起始地址错误!"));
        return;
    }

    WriteNum = m_strWrDisp.GetLength();
    memset(&IIC_AddressData, 0, sizeof(IIC_IO_DESC));

    str = (unsigned short*)m_strWrDisp.GetBuffer(WriteNum);

    for(i = 0; i < WriteNum; i++)
    {
        str_tmp = *(str + i);
        databuf = (BYTE)str_tmp;
    }

    IIC_AddressData.SlaveAddress=0xa0;    // Write
    //IIC_AddressData.WordAddr = m_StartAddr;
    IIC_AddressData.Data = databuf;
    IIC_AddressData.Count = WriteNum;

    Ret = DeviceIoControl(h_IIC,IOCTL_IIC_WRITE, &IIC_AddressData, sizeof(IIC_IO_DESC), OutputBuf,WriteNum,&ReadBytes, NULL);
    if(Ret == true)
        MessageBox(_T("写AT24LC08成功!"));
    else
        MessageBox(_T("写AT24LC08失败!"));

    m_strWrDisp.ReleaseBuffer();
}

// I2C读操作:
void CMy6410Dlg::OnBnClickedBtnrdi2c()
{
    // TODO: 在此添加控件通知处理程序代码
    int Ret;
    int ReadNum = 0;
    int i;
    DWORD dwBytesRead = 0;
    CString tmp;
    BYTE databuf[1024];
    unsigned short buf;

    // TODO: Add your control notification handler code here
    if(h_IIC == INVALID_HANDLE_VALUE)
    {
        MessageBox(_T("IIC驱动未打开!"));
        return;
    }
    UpdateData(false);

    if(m_StartAddr > 0x3ff)
    {
        MessageBox(_T("起始地址错误!"));
        return;
    }

    ReadNum = m_ReadNum;    
    memset(&IIC_AddressData, 0, sizeof(IIC_IO_DESC));
    IIC_AddressData.SlaveAddress = 0xa1;    // Read
    //IIC_AddressData.WordAddr = m_StartAddr;
    IIC_AddressData.Data = databuf;
    IIC_AddressData.Count = ReadNum;

    Ret = DeviceIoControl(h_IIC,IOCTL_IIC_READ, &IIC_AddressData, sizeof(IIC_IO_DESC), OutputBuf, ReadNum,&ReadBytes, NULL);
    if (!ReadBytes)
    {
        MessageBox(TEXT("读AT24LC08失败!"));
    }
    else
    {
        m_strRdDisp=' ';
        for(i = 0; i < (int)ReadBytes; i++)
        {
            buf = (unsigned short)databuf;
            tmp.Format(_T("%c"), buf);
            if(buf < 0x10)
                tmp.Insert(0, _T("0"));

            m_strRdDisp =m_strRdDisp + tmp;
        }
        UpdateData(false);
    }
}


        更换了i2c.h为iic.h这个头文件后,读写函数做相应修改,现在程序走到"写AT24LC08成功!"
(其实也许写入还是错误的,因为更换为linux系统后读出的不是刚写入的,也许还有地址问题),但是读出还是失败。况且这样修改没有读写的地址了,难道只能从地址0开始读写吗?
    
    请求高手指点啊!