打印

关于IIC总线器件X24C02读写的问题

[复制链接]
4297|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quanlai2|  楼主 | 2007-11-6 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在的一个项目中需要用DSP对X24C02进行读写,我在编写这个程序。现在碰到一个问题就是在对X24C02写的过程中,当发送完片选地址后DSP总收不到ACK信号。然后用示波器检测IIC总线波形发现从start信号到发送完地址的8个SCL周期内,SDL与SDA信号线上的时序配合是没有问题的,当到SCL第9个周期时,X24C02也产生了应答信号就是将SDA线电平拉低了,但是却没有拉到0,因此DSP没有收到。请问这是什么原因呢?和X24C02的SDA管脚的上拉电阻有关系么?谢谢了! 

相关帖子

沙发
农民讲习所| | 2007-11-6 15:27 | 只看该作者

ACK是作为硬件应答用的,软件模拟可以不检测ACK,空读就行

使用特权

评论回复
板凳
ayb_ice| | 2007-11-6 16:30 | 只看该作者

不检测不可靠吧

使用特权

评论回复
地板
农民讲习所| | 2007-11-6 16:33 | 只看该作者

出现不可靠的时候,你一点办法也没有,所以要默认可靠。

谁叫你不使用硬件I2C的,软I2C总是会付出一点点可以付得出的代价。

使用特权

评论回复
5
xwj| | 2007-11-6 16:37 | 只看该作者

LZ 的问题还是得检查硬件先。

使用特权

评论回复
6
lastnew| | 2007-11-6 18:18 | 只看该作者

有教育意义

有教育意义,这样的经验问题应该多了解了解

使用特权

评论回复
7
hotpower| | 2007-11-7 01:50 | 只看该作者

俺认为必须收ACK信号而与软硬件I2C无关

在收ACK信号时必须等待!!!因为从机也做处理(比较地址)后才返回ACK信号.
下面2个例程都是用模拟的I2C做的.


51例程(51读写铁电EEPROM):
//I2C收发一体化ACK读写函数
bit I2CAck(unsigned char val)
{
unsigned char i;
  SDA = val & 1;//写入1位ACK数据
  _nop_();_nop_();_nop_();_nop_();_nop_();//延时4.7uS
  SCL = 1;//拉高I2C时钟
  _nop_();_nop_();_nop_();_nop_();_nop_();//延时4.7uS
  CY = SDA;//读回1位ACK数据
  if (val <= 1) {//需要从机应答信号
    for (i = 255; i > 0; i --) {
      if (!(CY = SDA)) break;//收到从机应答信号立即退出
    }
  }
  SCL = 0;//拉低I2C时钟
  return CY;//返回读回ACK数据
}

LabWindows例程(打印机并口直接读写EEPROM):

void CVIFUNC I2C_WriteAck(unsigned char ack) 
{
    if (ack) {
        I2C_ClrSDA();//给从机ACK信号
    }
    else
    {
        I2C_SetSDA();//给从机nACK信号 
    }
    I2C_SetSCL();//拉高时钟信号,拉高时钟(必须在SDA=1时)
    I2C_ClrSCL();//拉低时钟信号,防止START信号产生
    I2C_ClrSDA();//给从机ACK信号
}


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///pwy(拉低SDA便于发送停止喜欢)
    return __result;//SDA=1,SCL=0
}

相关链接:https://bbs.21ic.com/club/bbs/showEssence.asp?id=8532

使用特权

评论回复
8
john_light| | 2007-11-7 08:47 | 只看该作者

肯定要检测ACK

没有拉到0,拉到多少伏?
上拉电阻值是多少?

使用特权

评论回复
9
isbit| | 2007-11-7 09:32 | 只看该作者

要检测ack吧!

  我的其他功能芯片,ack不是每次都响应,也有点头疼?
上拉为4k,51芯片没有输入口,输出口的设置有关不得而知。
   以前用可以设置输入输出的单片机,每次都可以响应,
我觉得和硬件关系很大。

使用特权

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

ACK可以不处理

拿hotpower的双机通信(双方都是软的)来说,只要简单的延时就可以达到hotpower的要求。一如异步串口。hotpower的代码里面不也有类似限制吗?

和硬件接口,不要ACK检测的好处远远大于要ACK的好处:IO输入、输入转换没那么严格要求。

LZ的问题根源很简单:就是IO的输入输出改变跟不上硬件ACK的变化速度,等IO的输入输出改变完成时有可能从机ACK已经消失。

使用特权

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

51容易检测到ACK,是因为51IO的特殊性

51容易检测到ACK,是因为51IO的特殊性,其它MCU处理起来是比较头疼麻烦的

而且这种检测还必须关中断,而且外部器件坏,会导致程序的崩溃(写的不好的话)。

所以俺是坚定的**空检测ACK的。

使用特权

评论回复
12
hotpower| | 2007-11-7 10:29 | 只看该作者

俺还是主张ACK检测,ACK无论什么方式都能检测到

ACK不检测,对一主多从很不利~~~

实际上ACK的读取并不一定按规则~~~

使用特权

评论回复
13
xwj| | 2007-11-7 10:41 | 只看该作者

我也主张检测ACK

一个好的IIC程序,不是光能读写就行的

使用特权

评论回复
14
hotpower| | 2007-11-7 10:57 | 只看该作者

俺给的例子都是主机软的,从机都是硬的

再来个硬的,从没出现过读不到ACK的问题.
相关链接:http://www.**/blog/hotpower/18019/message.aspx

使用特权

评论回复
15
ayb_ice| | 2007-11-7 11:34 | 只看该作者

我是一直检测ACK的

使用特权

评论回复
16
pheavecn| | 2007-11-7 11:42 | 只看该作者

当然要检测。

使用特权

评论回复
17
农民讲习所| | 2007-11-7 13:50 | 只看该作者

俺从来没测过

N多I2C控制

使用特权

评论回复
18
农民讲习所| | 2007-11-7 13:51 | 只看该作者

错了,是除了最开始阶段。

使用特权

评论回复
19
hotpower| | 2007-11-7 18:44 | 只看该作者

从机收到自己的地址必须发送ACK,否则...

使用特权

评论回复
20
isbit| | 2007-11-8 09:44 | 只看该作者

都要检测ack,超时退出。。。

这样要好些吧,还可以避免系统崩溃。

使用特权

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

本版积分规则

28

主题

38

帖子

0

粉丝