在同一个项目中,也遇到了时种异常停滞的现象(最近怎么这么背,怪问题一起找上门来),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批次问题等等,路过的高手帮忙分析一下,可能是什么原因?
用户377235 2014-4-14 09:23