打印

请熟悉IIC协议的和AVR单片机的高手进来~~~~~

[复制链接]
2748|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Nevea|  楼主 | 2007-10-9 17:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调试时钟芯片 PCF8563 与 ATMEGA128的IIC通讯。
使用的是模拟IIC.
附上 几个程序 并告知我的问题所在,希望有高手可以指点迷津:
void Start()

    SET_SDA;
    SET_SCL;
       __asm__ volatile("nop");
          __asm__ volatile("nop");
    CLR_SDA;
    __asm__ volatile("nop");
          __asm__ volatile("nop");
    CLR_SCL;
       
}
void Stop()
{
 
  CLR_SDA;
  SET_SCL;
     __asm__ volatile("nop");
        __asm__ volatile("nop");
  SET_SDA;
   __asm__ volatile("nop");
        __asm__ volatile("nop");
  CLR_SCL;
    
}
void WaitACK()
{  
    UCHAR errtime=20;
    UCHAR  tp=0;
   // SDA_IN;
   DDRD=DDRD&0xfd;
  
   PORTD=PORTD|0x02; ///0:禁止上拉;1:使能上拉
   PIND=PIND&0xfd;
   SET_SCL;
  // __asm__ volatile("nop");
      __asm__ volatile("nop");
   tp=PIND;
   while(tp&0x02)
   {
      if(errtime)
      errtime--;
      else 
      Stop();
      __asm__ volatile("nop");
      tp=PIND;
   }
   CLR_SCL;
  
 }

void writebyte(UCHAR wdata)
{
   UCHAR i;

    SDA_OUT;

   for(i=0;i<8;i++)
   {
       if(wdata&0x80)
       SET_SDA;
       else 
       CLR_SDA;
       
       SET_SCL;
          __asm__ volatile("nop");
            __asm__ volatile("nop");
       CLR_SCL;
       
         // __asm__ volatile("nop");
           //  __asm__ volatile("nop");
     wdata<<=1;
   }
   WaitACK();     //I2C器件或通讯出错,将会退出I2C通讯
}

void writeData(UCHAR address,UCHAR mdata)
{  
   cli();
   Start();
   writebyte(0xa2); //*写命令
   writebyte(address); //*写地址
   writebyte(mdata); //*写数据
   Stop();
}

这是几个子函数。时序方面我都对过了,不应该有什么错误。现在的问题 就是
WaitACK()函数里面的循环  
 while(tp&0x02)
   {
      if(errtime)
      errtime--;
      else 
      Stop();
      __asm__ volatile("nop");
      tp=PIND;
   }始终也跳不出来。
我这个函数是在写完一个字节给从机之后,检测从机是否返回一个低电平信号的。按照IIC协议上说,如果返回的是个低电平,则说明写成功;否则,则说明写失败。
我现在 无法跳出循环,就说明检测到的这个信号,始终为高电平。这是我一直困惑的。
想请同时 熟悉AVR的 朋友给看看,我的寄存器使用是否有错误,但是感觉上好像也应该就是这样的。谢谢大家~~~~~

相关帖子

沙发
Nevea|  楼主 | 2007-10-10 08:14 | 只看该作者

对,就是对方没释放总线~~~~~

不知何因,还请高手指教~~~

使用特权

评论回复
板凳
computer00| | 2007-10-10 09:14 | 只看该作者

可能还是时序不对...地址没写对,导致设备无应答。

使用特权

评论回复
地板
Nevea|  楼主 | 2007-10-10 09:23 | 只看该作者

地址肯定是对了,

时序??要是还有人说不对,我也是真的不知道如何做了?
时序 我都确认过好几次了,如果,还不对,实在不知道该从何入手了~~~~~~~~~~~~~

使用特权

评论回复
5
啊啊哈| | 2007-10-10 09:27 | 只看该作者

可能是延时时间太短

时钟频率不要超过100k

使用特权

评论回复
6
Nevea|  楼主 | 2007-10-10 10:20 | 只看该作者

100KHz??时钟芯片上说最大可以达到400KHz呢

使用特权

评论回复
7
ayb_ice| | 2007-10-10 10:55 | 只看该作者

随便说说

void WaitACK()
{  
    UCHAR errtime=20;
    UCHAR  tp=0;
   // SDA_IN;
   DDRD=DDRD&0xfd;
  
   PORTD=PORTD|0x02; ///0:禁止上拉;1:使能上拉
   PIND=PIND&0xfd;
   SET_SCL;
  // __asm__ volatile("nop");
      __asm__ volatile("nop");
   tp=PIND;
   while(tp&0x02)
   {
      if(errtime)
      errtime--;
      else {
         Stop();  // 停止后没有返回,仍在继续操作,函数应该返回一个值更好
//       return;
     }
      __asm__ volatile("nop");
      tp=PIND;
   }
   CLR_SCL;
  
}

使用特权

评论回复
8
Nevea|  楼主 | 2007-10-10 12:28 | 只看该作者

回楼上,我知道你意思,我也可以在这里加个返回值

但是,我真正的问题,不在这里呀~~

使用特权

评论回复
9
ayb_ice| | 2007-10-10 15:12 | 只看该作者

你的程序写法本来就退不出来(失败时)...

好象你发数据时IO没有设为输出吧...

使用特权

评论回复
10
Nevea|  楼主 | 2007-10-10 15:49 | 只看该作者

回复楼上

发数据时,我io方向设置为输出了。
失败时间超过 errtime=20,程序进入
void Stop()
{

  CLR_SDA;
  SET_SCL;
     __asm__ volatile("nop");
        __asm__ volatile("nop");
  SET_SDA;
   __asm__ volatile("nop");
        __asm__ volatile("nop");
  CLR_SCL;
    
}函数,也就是退出iic协议了。

现在是程序无论如何都没有“成功”的时候,永远“失败”。

使用特权

评论回复
11
ayb_ice| | 2007-10-10 16:47 | 只看该作者

网上下个看一下...

也许是你的从机操作不对...
A210接地时读写操作分别是0xA1,0xA0...

使用特权

评论回复
12
Nevea|  楼主 | 2007-10-11 08:11 | 只看该作者

re:

什么叫 从机操作不对呢??
我的PCF8563的写 读 地址 分别是0xa2,0xa3.
您指的 是什么呢 ?

使用特权

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

到老周的网站上下载I2C的资料看看吧

那里也有C51的I2C程序,,按照思路,很容易更改到mega上

使用特权

评论回复
14
Nevea|  楼主 | 2007-10-12 08:15 | 只看该作者

谢谢了。

主管说这部分可以先不调了

使用特权

评论回复
15
dadodo| | 2007-10-12 16:08 | 只看该作者

楼主没用AVR的TWI?

模拟I2C对于AVR来说,在时序正确的前提下,2个NOP是不够的。

使用特权

评论回复
16
Nevea|  楼主 | 2007-10-13 08:48 | 只看该作者

re:

2个NOP是不够的。那要多少个可以合适吗?

使用特权

评论回复
17
maychang| | 2007-10-13 10:40 | 只看该作者

直接用AVR单片机的IIC接口算了

何必这样麻烦?
51单片机没有IIC接口,只能用软件模拟,AVR多数有这个接口,为什么不用?

使用特权

评论回复
18
zusen| | 2007-10-14 09:28 | 只看该作者

谁说51单片机没有IIC接口

楼上没用过菲利普的吧???

使用特权

评论回复
19
hotpower| | 2007-10-14 09:46 | 只看该作者

彻底倒塌了~~~Stop()让俺发晕~~~看看给白沙的例程

使用特权

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

本版积分规则

16

主题

306

帖子

0

粉丝