打印

如何解决这样的问题? IIC模块的怪现象

[复制链接]
2147|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongshan|  楼主 | 2008-1-16 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的是AW32,外部晶振9.8304MHz,FBE模式,总线频率4.9152MHz,IIC模块配置如下:
  IIC1C=0x80;
  IIC1F=0x50; 

与at24c64通信,写子程序如下:

tagAdr  sAdr;
#define gAdr   sAdr.EepromAdr
#define gAdrH  sAdr.adr16.AdrH
#define gAdrL  sAdr.adr16.AdrL

void IICWriteByte(word adr, byte dt){
    gAdr=adr;
    IIC1C_TXAK=0;
    IIC1C|=0x30;            //MST=1 TX=1  and generate STARTcondition
    IIC1D=IIC_SLAVE_ADR;
    while(!IIC1S_IICIF);    //wait untill TX completed
    IIC1S_IICIF=1;          //clear IICIF
    while(IIC1S_RXAK);      //check for slave ack
    
    IIC1D=gAdrH;
    while(!IIC1S_IICIF);    
    IIC1S_IICIF=1;
    while(IIC1S_RXAK);  
    IIC1D = gAdrL;
    while(!IIC1S_IICIF);    
    IIC1S_IICIF=1;
    while(IIC1S_RXAK); 
    
    IIC1D=dt;
    while(!IIC1S_IICIF);    
    IIC1S_IICIF=1;
    while(IIC1S_RXAK);
    
    IIC1S_IICIF=1;
    IIC1C_MST=0;
}

void IICWriteN(word adr,byte *dt,byte n){  //此函数全速执行不正常,单步执行则正常!

    byte i;
    for(i=0;i<n;++i) {
      IICWriteByte(adr+i,dt);  
    }
}
奇怪的是在调用IICWriteN时,如果全速执行,则会在while(IIC1S_RXAK);一直执行,即没收到从机的ACK,但是单片跳进IICWriteN函数执行则正常。为什么? 

相关帖子

沙发
张明峰| | 2008-1-16 16:50 | 只看该作者

看波形

瞎猜不行。用示波器捕捉一次IIC通讯过程,看一下SDA和SCL波型和对应的时序关系,就一清二楚了。

使用特权

评论回复
板凳
dongshan|  楼主 | 2008-1-16 19:05 | 只看该作者

不是瞎猜

单步执行是写进去了。全速则不行。
有个示波器,表笔不见了一个。

使用特权

评论回复
地板
xuhuadong| | 2008-1-17 09:28 | 只看该作者

能否在启动iic使能后延时一下

  单步时硬件模块有延时,所以24c能收到地址码,
  连续时,没有延时。
IIC1C|=0x30;            //MST=1 TX=1  and generate STARTcondition
  delay(2ms);试试


    IIC1D=IIC_SLAVE_ADR;

  

使用特权

评论回复
5
dongshan|  楼主 | 2008-1-17 14:56 | 只看该作者

谢谢徐兄。

是延时的问题,加在这儿就可以了。

void IICWriteByte(word adr, byte dt){
    gAdr=adr;
    Delay();               //延时加在这,就可以读写了。

    IIC1C_TXAK=0;
    IIC1C|=0x30;            //MST=1 TX=1  and generate STARTcondition
    IIC1D=IIC_SLAVE_ADR;
    while(!IIC1S_IICIF);    //wait untill TX completed
    IIC1S_IICIF=1;          //clear IICIF
    while(IIC1S_RXAK);      //check for slave ack
   。。。。

}

读函数也一样,在函数首部加了一个延时,则全速就正常了。但不知为什么会这样。

使用特权

评论回复
6
luxinsun| | 2008-1-17 19:59 | 只看该作者

没什么理由,它就这毛病。我当初也是这样的。

没什么理由,它就这毛病。我当初也是这样的。

使用特权

评论回复
7
yellowland| | 2008-2-23 18:09 | 只看该作者

回复主题:如何解决这样的问题? IIC模块的怪现象

需要仔细check你的延时是否符合eeprom的spec.
否则你在这个行了,到那个上又不行了

使用特权

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

本版积分规则

79

主题

1143

帖子

7

粉丝