打印

大家在用I2C串行器件时有没出现过问题?请进来聊聊

[复制链接]
2315|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
newnewnew|  楼主 | 2007-6-29 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我以前用AT24C02时发现芯片无应答信号(ACK),电路连接都正常,但始终收不到应答.后把CLOCK,DATA两线重布,情况才正常.
现在又有类似的问题,调试很好的板子一放进电控箱就不行,老是收不到PCF8563的应答(ACK).
这种问题一直搞不清为什么,请有经验的高手指点!  

相关帖子

沙发
dai_weis| | 2007-6-29 14:38 | 只看该作者

你使用的上拉电阻多大?信号是否符合要求?

使用特权

评论回复
板凳
HQGBOY| | 2007-6-29 15:19 | 只看该作者

发现偶尔读出来00...

使用特权

评论回复
地板
pian_zhou| | 2007-6-29 18:28 | 只看该作者

可以考虑用我们提供USB-I2C适配器

使用特权

评论回复
5
gyt| | 2007-6-29 18:59 | 只看该作者

放慢速度试试

使用特权

评论回复
6
HotPower| | 2007-6-29 20:40 | 只看该作者

对头~~~放慢速度试试,或SDA/SCL上加100P以内的电容.

如果时序是模拟出来的,那么SCL的跳变时机很重要~~~

"芯片无应答信号(ACK)"好象这样的问题很常见,我用PC的并口模拟I2C时
也发现了此问题. 主要是第9个脉冲的问题.
一般要多延时测试多次才能得到ACK信号.
因为从设备可能在验证数据的真伪,验证完正确后才送出ACK信号.

这是我的PC端源码:
HRESULT CVIFUNC I2C_GetAck(void)
{
    HRESULT __result = S_FALSE;
    int i;
    for (i = 0; i < I2C_waitAckDelay; i ++)
    {
        if (I2C_GetSDA() == 0) //释放数据总线读数据总线
        {
            __result = S_OK;
            break;
        }
    }
    I2C_SetSCL();//拉高时钟(必须在SDA=1时)???
    I2C_ClrSCL();//拉低时钟
    I2C_ClrSDA();//保证SDA=SCL=0///(拉低SDA便于发送停止位)
    return __result;//SDA=1,SCL=0
}
unsigned char CVIFUNC I2C_GetSDA (void)
{
    unsigned char data;
    HotTimer_Start ();//在XP下启动由菜农同志封装的uS级定时器
    data = inp (Hot_I2CISPDataPortAddress);//读数据口地址的内容
    data |= (1 << I2C_wrSDA);//SDA=1
    outp (Hot_I2CISPDataPortAddress, data);//写数据口1个字节 
    do
    {
        data = inp (Hot_I2CISPDataPortAddress + I2C_rdAddrOff);//读状态口地址的内容
        data &= (1 << I2C_rdSDA);//只取出SDA位!!!!注意没~号
    }
    while ((data == 0) && HotTimer_GetTime () < 0.000014);//最多测试14uS 
    return  (unsigned char)data;
}

使用特权

评论回复
7
jimoom| | 2007-6-30 08:25 | 只看该作者

可以在一定时间内,多检测几次。

可以在一定时间内,多检测几次。

使用特权

评论回复
8
newnewnew|  楼主 | 2007-6-30 16:25 | 只看该作者

上拉电阻5.1K

操作速度减慢些可能会好些,下次试试!
按照I2C标准,ACK应答应该在第9个脉冲SCL变高前就出现(因为SCL为高时SDA是不应许变化的),所以在第9个脉冲SCL变高后就可测试ACK信号,此时,有就是有,没有也就不会再有了.

使用特权

评论回复
9
ayb_ice| | 2007-6-30 16:48 | 只看该作者

还是建议去看IIC协议...

使用特权

评论回复
10
农民讲习所| | 2007-7-1 07:40 | 只看该作者

空读ACK,没必要一定检测到ACK有效

ACK是硬件级别响应的,软件模拟I2C时完全不用管它。为什么一定要识别ACK?换个角度想想,是完全没必要的。

使用特权

评论回复
11
newnewnew|  楼主 | 2007-7-4 11:00 | 只看该作者

农民讲习所说的有道理

我现在就在程序中去除了ACK检测,反正不成功下次再操作一次就是了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

38

帖子

1

粉丝