标题: STC8A单片机硬件IIC驱动DS3231M芯片失败的问题 [打印本页]

作者: 624353765    时间: 2020-7-18 16:33
标题: STC8A单片机硬件IIC驱动DS3231M芯片失败的问题
这个项目在开发板上运行是没有问题的


使用的是DS3231的sop16封装的芯片,某宝上买的模块



功能测试通过后制作成小板



小板上用的是DS3231M的sop8芯片



调试了很多天STC8A单片机始终无法与DS3231M通讯,最多只能读取一秒的时间就卡死的IIC应答上







原理图



PCB正面



PCB反面



PCB上没有给IIC上拉电阻,但是在单片机内部上拉的4.7k的电阻,单片机寄存器初始化情况


DS3231驱动代码如下
  1. void Wait(){//I2C应答
  2. unsigned char a=0;
  3. while(!(I2CMSST&0x40)&&++a);
  4. I2CMSST&=~0x40;
  5. }
  6. void Start(){//发送START命令
  7. I2CMSCR=0x01;
  8. Wait();
  9. }
  10. void SendData(unsigned char dat){//发送数据
  11. I2CTXD=dat;
  12. I2CMSCR=0x02;
  13. Wait();
  14. }
  15. void RecvACK(){//接收ACK
  16. I2CMSCR=0x03;
  17. Wait();
  18. }
  19. void SendACK(){//设置ACK信号
  20. I2CMSST=0x00;
  21. I2CMSCR=0x05;
  22. Wait();
  23. }
  24. void SendNAK(){//设置NAK信号
  25. I2CMSST=0x01;
  26. I2CMSCR=0x05;
  27. Wait();
  28. }
  29. char RecvData(){//接收数据
  30. I2CMSCR=0x04;
  31. Wait();
  32. return I2CRXD;
  33. }
  34. void Stop(){//发送STOP命令
  35. I2CMSCR=0x06;
  36. Wait();
  37. }
  38. unsigned char DS3231_read(unsigned char site){//DS3231读取
  39. P_SW2|=B(1000,0000);
  40. Start();
  41. SendData(0xD0);
  42. RecvACK();
  43. SendData(site);
  44. RecvACK();
  45. Start();
  46. SendData(0xD1);
  47. RecvACK();
  48. site=RecvData();
  49. SendNAK();
  50. Stop();
  51. P_SW2&=B(0111,1111);
  52. return site;
  53. }
  54. void DS3231_wirte(unsigned char site,unsigned char dat){//DS3231写入
  55. P_SW2|=B(1000,0000);
  56. Start();
  57. SendData(0xD0);
  58. RecvACK();
  59. SendData(site);
  60. RecvACK();
  61. SendData(dat);
  62. RecvACK();
  63. Stop();
  64. P_SW2&=B(0111,1111);
  65. }
复制代码
搞定可以送个小红包

作者: angmall    时间: 2020-7-18 18:33
需要上拉电阻 4k7 在SDA和SCL  IIC接口

作者: Y_G_G    时间: 2020-7-19 13:34
在下载器那设定单片机的时钟为6MHZ试一下
作者: lovexulu    时间: 2020-7-19 18:04
当年51芯片确实内部有上拉电阻,STC8也有,不过好像记得在数据手册上看过需要打开上拉才可以,默认是高阻态。
作者: 民盛    时间: 2021-5-11 20:30
3231应该有上拉电阻。
作者: Lric_liao    时间: 2021-8-20 22:04
楼主解决了吗,看楼主代码上拉电阻是使能了的,问题出在哪呢。难道是内部上拉电阻只有4.1k造成的吗。
作者: 最后的sixgods    时间: 2021-12-21 08:54
有没有是因为驱动能力不足的原因
作者: lmn2005    时间: 2021-12-21 11:45
我一般用模拟IIC驱动,不用内部的IIC驱动。使用芯片内置IIC驱动需要设置什么寄存器吧。
作者: dsbk123    时间: 2025-1-19 20:17
Y_G_G 发表于 2020-7-19 13:34
在下载器那设定单片机的时钟为6MHZ试一下

师傅在上,请受我一拜!
我也遇到同样问题了,折腾了一个礼拜了没结果。
按师傅的方法烧录改为6M,直接成功。
作者: coody_sz    时间: 2025-1-19 23:11
dsbk123 发表于 2025-1-19 20:17
师傅在上,请受我一拜!
我也遇到同样问题了,折腾了一个礼拜了没结果。
按师傅的方法烧录改为6M,直接 ...

那就是I2C速度太快了。STC8系列的MCU速度很快的,操作IO值需要一个时钟。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1