这个项目在开发板上运行是没有问题的
使用的是DS3231的sop16封装的芯片,某宝上买的模块
功能测试通过后制作成小板
小板上用的是DS3231M的sop8芯片
调试了很多天STC8A单片机始终无法与DS3231M通讯,最多只能读取一秒的时间就卡死的IIC应答上
原理图
PCB正面
PCB反面
PCB上没有给IIC上拉电阻,但是在单片机内部上拉的4.7k的电阻,单片机寄存器初始化情况
DS3231驱动代码如下
- 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);
- }
复制代码 搞定可以送个小红包
|