大家好!我的小板上用的是DS3231M的sop8芯片,调试了很多天STC8A单片机始终无法与DS3231M通讯,最多只能读取一秒的时间就卡死的IIC应答上。但奇怪的是,某宝上买的模块DS3231(sop16封装的IC之前测试是OK能用的)
不知道问题出在哪里?
原理图和源码如下:
void Wait(){//I2C应答
unsigned char a=0;
while(!(I2CMSST&0x40)&&++a);
I2CMSST&=~0x40;
}
void Start(){//发送START命令
I2CMSCR=0x01;
Wait();
}
void SendData(unsigned char dat){//发送数据
I2CTXD=dat;
I2CMSCR=0x02;
Wait();
}
void RecvACK(){//接收ACK
I2CMSCR=0x03;
Wait();
}
void SendACK(){//设置ACK信号
I2CMSST=0x00;
I2CMSCR=0x05;
Wait();
}
void SendNAK(){//设置NAK信号
I2CMSST=0x01;
I2CMSCR=0x05;
Wait();
}
char RecvData(){//接收数据
I2CMSCR=0x04;
Wait();
return I2CRXD;
}
void Stop(){//发送STOP命令
I2CMSCR=0x06;
Wait();
}
unsigned char DS3231_read(unsigned char site){//DS3231读取
P_SW2|=B(1000,0000);
Start();
SendData(0xD0);
RecvACK();
SendData(site);
RecvACK();
Start();
SendData(0xD1);
RecvACK();
site=RecvData();
SendNAK();
Stop();
P_SW2&=B(0111,1111);
return site;
}
void DS3231_wirte(unsigned char site,unsigned char dat){//DS3231写入
P_SW2|=B(1000,0000);
Start();
SendData(0xD0);
RecvACK();
SendData(site);
RecvACK();
SendData(dat);
RecvACK();
Stop();
P_SW2&=B(0111,1111);
}