原创 PCF8563时钟异常停滞

2008-8-7 15:46 3562 5 6 分类: MCU/ 嵌入式

    在同一个项目中,也遇到了时种异常停滞的现象(最近怎么这么背,怪问题一起找上门来),PCF8563和MEGA88V同用5V电源,用TWI两线串口对8563通信,没有挂其它I2C器件,外部上拉电阻10K,32.768KHz晶体,15P电容,8563设置为日报警模式,测试样板数62块,经过大量测试,发现部分板8563时钟在一个小时内会慢几分到十几分钟,而且偏差呈扩大趋势,少部分出现I2C通信不正常,带电更换晶体后,部分会正常,部分故障依就,有的换了晶体后一段时间内走时正常,经过一两个小时候时间又开始变慢,甚至I2C通信不正常,而且带电更换晶体后,I2C通信恢复后读出的时钟是出现故障时刻的时间,但出现故障的板测试晶体引脚振荡波形是很正常的,有时用探针碰到晶体引脚后I2C通信就恢复了,有时虽然振荡波形正常但I2C通信就是不通,对故障明显的板更换了8563芯片,晶体,15P电容后依然会现原来的问题。单片机晶振4M,TWI分频系数TWBR=16,程序绝对没问题,代码如下:


uint8_t time[6];


uint8_t TWI_read_byte();


uint8_t TWI_sta();


unsigned char TIME_CODE_SHEL[8] __attribute__((section(".eeprom")))={0x7F,0x7F,0x3F,0x3F,0x07,0x1F,0xFF,0xFF};


void TWI_read_time( )
{
 register uint8_t i,tmp;
 uint8_t tmp_arry[7];
 cli();
  ee_read_block(tmp_arry,TIME_CODE_SHEL,7);
    for(i=5;i>0;i--)
   if(TWI_sta())break;
 if(i==0)return;
 TWI_write_byte(0xa2);
 TWI_write_byte(2);
 TWI_sta();
    TWI_write_byte(0xa3);
    i="0";
 do{
  tmp_arry&=TWI_read_byte();
 }while(++i<7);
  TWI_nack();
 TWI_sto();
    tmp_arry[4]=tmp_arry[5];
 tmp_arry[5]=tmp_arry[6];
    i="0";
 do{
  bcd_toi(tmp_arry+i,1,time+i,1);  时钟数据转换成16进制后存入time数组。
 }while(++i<6); 
}

void TWI_write_block(uint8_t addr,uint8_t byte,uint8_t *pd)
{
    register uint8_t i;
 cli();
 if(TWI_sta())
 {
     TWI_write_byte(0xa2);
     TWI_write_byte(addr);
  i=0;
  do{ 
   TWI_write_byte(*pd);
   pd++;
  }while(++i<byte);
  TWI_sto();
 }
}
 
uint8_t TWI_sta()
{
 register uint8_t i;
 TWCR=_BV(TWSTA)|_BV(TWINT)|_BV(TWEN);
 for(i=255;i>0;i--)
 { 
  asm("wdr");
  asm("nop");
  if(TWCR&_BV(TWINT)){mtcsr1&=~_BV(PCFO);return 1;}
 }
    mtcsr1|=_BV(PCFO);
 return 0;
}
uint8_t TWI_read_byte()
{
 register uint8_t i;
 TWCR=_BV(TWINT)|_BV(TWEN)|_BV(TWEA);
 for(i=255;i>0;i--)
     if(TWCR&_BV(TWINT))
  {
   i=TWDR;
   return i;
  }
    mtcsr1|=_BV(PCFO);
 return 0;
}
void TWI_write_byte(uint8_t data)
{
 register uint8_t i;
 TWDR=data;
 TWCR=_BV(TWINT)|_BV(TWEN);
 for(i=255;i>0;i--)
  if(TWCR&_BV(TWINT))return;
    mtcsr1|=_BV(PCFO);
}
void TWI_nack(void)
{
 register uint8_t i;
 TWCR=_BV(TWINT)|_BV(TWEN);
 for(i=255;i>0;i--)
  if(TWCR&_BV(TWINT))return;
}


void TWI_sto()
{
 TWCR=_BV(TWINT)|_BV(TWEN)|_BV(TWSTO);
}


除了上面提到的原因,就是PCB板漏电,布线不合理,485通信对32K晶体干扰,8563批次问题等等,路过的高手帮忙分析一下,可能是什么原因?

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2014-4-14 09:23

8563批次问题
相关推荐阅读
用户155570 2008-07-30 10:01
ATmega88V怪异死机
        最近做一个远程抄表系统,我用的是M88V,电源5V,启用串口,串口与485芯片相连(如图),用于远程通信,上电时485芯片处于襟用状态,RXD引脚电平处于三态(不定),但却先使能了RX...
EE直播间
更多
我要评论
1
5
关闭 站长推荐上一条 /3 下一条