天嵌 ARM开发社区

 找回密码
 注册
查看: 3981|回复: 7

I2C出错问题

[复制链接]
raycmort 发表于 2010-9-19 16:28:34 | 显示全部楼层 |阅读模式
你好,
1.我在使用I2C的时候会出现:I2CRead ERROR: 1460 请问是什么原因?
2.以下错误是什么原因引起的?
Exception 'Raised Exception' (-1): Thread-Id=050c0016(pth=830ed9a0), Proc-Id=00400002(pprc=82008308) 'NK.EXE', VM-active=050b0016(pprc=830ed79c) 'MT9D111_Test.exe'
PC=c007bbd0(k.coredll.dll+0x0005bbd0) RA=8023a4c8(kernel.dll+0x000064c8) SP=d3edf99c, BVA=00000000
Exception 'Raised Exception' (-1): Thread-Id=050c0016(pth=830ed9a0), Proc-Id=00400002(pprc=82008308) 'NK.EXE', VM-active=050b0016(pprc=830ed79c) 'MT9D111_Test.exe'
PC=c003bc40(k.coredll.dll+0x0001bc40) RA=8023a4c8(kernel.dll+0x000064c8) SP=d3edf23c, BVA=ffffffff
天嵌_support1 发表于 2010-9-19 17:01:48 | 显示全部楼层
看不懂什么问题,怎么个用法?
 楼主| raycmort 发表于 2010-9-19 22:04:55 | 显示全部楼层
我是用MT9D111摄像头代替OV9650,OV的寄存器数组格式是{0x65,0x01},而MT9D111的寄存器我对应OV改为{0xf0,0x00,0x01},因为MT9D111是一个地址有两个字节的内容。
而将OV对应的HW_WriteRegisters(pCIS, &OV9650[i][1], OV9650[i][0], 1); 就改为HW_WriteRegisters(pCIS, &MT9D111Reg[i][1], MT9D111Reg[i][0], 2);
结果可以写入,写入也有效果。但就是有时会出现I2CWrite ERROR :1460 和I2CRead ERROR :1460错误,从而导致功能不正确。
天嵌_support1 发表于 2010-9-20 10:29:29 | 显示全部楼层
3# raycmort


1460  这个是你的slave 在总线上的地址吧?
嗯........会不会是读写过程出现你的摄像头
一直处于忙状态导致I2C时序上有误引起呢?
你确定MT9D111的驱动没有问题?
 楼主| raycmort 发表于 2010-9-20 15:58:29 | 显示全部楼层
I2C时序啊,我觉得有可能,但I2C的底层驱动我看得不是很懂。
而MT9D111的寄存器格式是
ADDR      Register Description       Default
0x00       Reserved                       0x1519
0x01       Row Start                      0x001C
那请问应该怎样编写代码才能让TQ2440正确地将寄存器设置写进MT9D111里面,而不出现1460错误呢?
天嵌_support1 发表于 2010-9-20 16:40:02 | 显示全部楼层
不了解 MT9D111芯片。
你拿工具测试一下I2C检测一下 SCL 这个引脚的变化
 楼主| raycmort 发表于 2010-9-27 17:01:25 | 显示全部楼层
I2C 1460 错误的原因是 ERROR_TIMEOUT ,是超时的原因。
是在主从机的同步函数那里
__inline
DWORD
SyncIst(   
    PI2C_CONTEXT pI2C,
    DWORD dwTimeout
    )
{
    DWORD w;
    if (pI2C->Mode == INTERRUPT) {
        w = WaitForSingleObject(pI2C->DoneEvent, dwTimeout);
        if (WAIT_OBJECT_0 != w) {
            pI2C->State = IO_ABANDONED;
            if (pI2C->LastError == ERROR_SUCCESS)
                pI2C->LastError = ERROR_TIMEOUT;
        }     
        return pI2C->LastError;  
    } else {
        while(pI2C->DataCount != INVALID_DATA_COUNT) {
            // poll INT pending bit
            if (pI2C->Mode == POLLING && (rIICCON & 0x10))
                I2C_IST(pI2C);
        }
    }
    return ERROR_SUCCESS;
}
但很奇怪,我用一根导线去触碰SDA引脚,它就不会出现这个错误了。版主知不知道是什么原因?
天嵌_support1 发表于 2010-9-27 17:22:53 | 显示全部楼层
7# raycmort


缩短一下你那个从设备和主设备之间的连线。
有时候线过长,也会引起时序问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-21 14:59 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表