SD3078问题

2020-03-01 11:53发布

有人用过SD3078 IC做实时时钟吗?我这写了个程序,IIC读不到应答ACK,不知道是什么原因?求大神指教,有STM32F10x的例程就更好了,万分感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
jiekou001
1楼-- · 2020-03-02 06:18
  1. //************************************************************
  2. // 实时时钟SD30XX读写STM8参考程序
  3. // MCU: STM8S103F3
  4. // Last update:              2017/7/19
  5. //************************************************************

  6. #include "stm8s103f3p.h"

  7. #define uchar unsigned char
  8. #define SCL_H  PC_ODR |= 0X08
  9. #define SDA_H  PA_ODR |= 0X08
  10. #define SCL_L  PC_ODR &= 0XF7
  11. #define SDA_L  PA_ODR &= 0XF7
  12. #define SDAM  ((PA_IDR & 0X08) >> 3)
  13. #define SET_SCL_OUT()    {PC_DDR |= 0X08; PC_CR1 |= 0X08; PC_CR2 &= 0XF7;}//scl选择管脚为PC3
  14. #define SET_SDA_OUT()    {PA_DDR |= 0X08; PA_CR1 |= 0X08; PA_CR2 &= 0XF7;}//sda选择管脚为PA3
  15. #define SET_SDA_IN()     {PA_DDR &= 0XF7; PA_CR1 &= 0XF7; PA_CR2 &= 0XF7;}//浮空输入

  16. uchar s_data[7] = {0};

  17. void GPIO_I2c_Master_Init(void)
  18. {
  19.   I2C_CR1 &= 0xFE;      
  20.   SET_SCL_OUT();    //PC3 输出;推挽;2MHz时钟;
  21.   SET_SDA_OUT();    //PA3 输出;推挽;2MHz时钟;
  22. }

  23. void Delay_5us(void)
  24. {
  25.   uchar i = 10;    //fcpu 16MHz

  26.   for (; i > 0; i--);
  27. }

  28. void I2C_Start(void)//起始信号
  29. {
  30.   SDA_H;                    
  31.   SCL_H;                    
  32.   Delay_5us();               
  33.   SDA_L;                  
  34.   Delay_5us();               
  35.   SCL_L;                    
  36. }

  37. void I2C_Stop(void)//结束信号
  38. {
  39.   SDA_L;                  
  40.   SCL_H;                  
  41.   Delay_5us();               
  42.   SDA_H;                  
  43.   Delay_5us();               
  44. }

  45. void I2C_SendACK(uchar ack)//应答或者非应答信号
  46. {
  47.   if (ack == 0)
  48.   {
  49.     SDA_L;
  50.   }
  51.   else
  52.   {
  53.     SDA_H;
  54.   }
  55.   SCL_H;                  
  56.   Delay_5us();  
  57.   
  58.   SCL_L;                    
  59.   Delay_5us();     
  60. }

  61. uchar I2C_SendByte(uchar sendDAT)//发送字节
  62. {
  63.   uchar i = 0;
  64.   uchar revack = 0;

  65.   for (i= 0 ; i< 8; i++)         
  66.   {
  67.     SCL_L;               
  68.     Delay_5us();  
  69.   
  70.     if (sendDAT & 0x80)  
  71.     {
  72.       SDA_H;
  73.     }
  74.     else  
  75.     {      
  76.       SDA_L;
  77.     }
  78.     sendDAT <<=  1;
  79.     SCL_H;               
  80.     Delay_5us();     
  81.   }
  82.   SCL_L;               
  83.   Delay_5us();  
  84.   SET_SDA_IN();
  85.   SCL_H;   
  86.   _asm("nop");
  87.   _asm("nop");
  88.   revack = (uchar)SDAM;
  89.   Delay_5us();   
  90.   SCL_L;   
  91.   SET_SDA_OUT();
  92.   Delay_5us();  

  93.   return revack;
  94. }

  95. uchar I2C_RecvByte(void)//接收字节
  96. {
  97.   uchar i = 0;
  98.   uchar revDAT = 0;
  99.   
  100.   SDA_H;  
  101.   SET_SDA_IN();
  102.   for (i = 0; i < 8; i++)         
  103.   {
  104.      revDAT <<= 1;      
  105.      SCL_H;
  106.      _asm("nop");
  107.      _asm("nop");
  108.      if (SDAM)
  109.      {
  110.         revDAT |= 0x01;
  111.      }
  112.      else
  113.      {
  114.         revDAT &= 0xfe;
  115.      }

  116.      Delay_5us();
  117.      SCL_L;               
  118.      Delay_5us();  
  119.   }   
  120.   SET_SDA_OUT();
  121.   
  122.   return revDAT;
  123. }

  124. void WriteOn(void)//打开写保护
  125. {
  126.   I2C_Start();
  127.   I2C_SendByte(0x64);
  128.   I2C_SendByte(0x10);
  129.   I2C_SendByte(0x80);
  130.   I2C_Stop();
  131.   
  132.   I2C_Start();
  133.   I2C_SendByte(0x64);
  134.   I2C_SendByte(0x0f);
  135.   I2C_SendByte(0x84);
  136.   I2C_Stop();
  137. }

  138. void WriteOff(void)//关闭写保护
  139. {
  140.   I2C_Start();
  141.   I2C_SendByte(0x64);
  142.   I2C_SendByte(0x10);
  143.   I2C_SendByte(0x00);
  144.   I2C_Stop();
  145.   
  146.   I2C_Start();
  147.   I2C_SendByte(0x64);
  148.   I2C_SendByte(0x0f);
  149.   I2C_SendByte(0x00);
  150.   I2C_Stop();
  151. }

  152. void read_time_from_sd30xx(void)//从sd30xx读时间
  153. {
  154.   uchar n = 0;

  155.   I2C_Start();
  156.   if (I2C_SendByte(0x65))
  157.   {
  158.     I2C_Stop();

  159.     return;
  160.   }
  161.   for (n = 0; n < 7; n++)
  162.   {
  163.     s_data[n] = I2C_RecvByte();
  164.     if (n == 6)
  165.     {
  166.       I2C_SendACK(1);
  167.     }
  168.     I2C_SendACK(0);
  169.   }
  170.   I2C_Stop();
  171. }



  172. void write_time_to_sd30xx(void)//写时间到sd30xx
  173. {
  174.   uchar n = 0;

  175.   WriteOn();
  176.   
  177.   I2C_Start();
  178.   I2C_SendByte(0x64);
  179.   I2C_SendByte(0x00);
  180.   for (n = 0; n < 7; n++)
  181.   {
  182.     I2C_SendByte(s_data[n]);
  183.   }
  184.   I2C_Stop();
  185.   
  186.   WriteOff();
  187. }
复制代码
LianBinbing
2楼-- · 2020-03-02 11:09
 精彩回答 2  元偷偷看……
dsyq
3楼-- · 2020-03-02 13:19
请教楼上各位,这个芯片稳定不稳定啊
DENGXUEYING
4楼-- · 2020-03-02 19:05
有谁弄过STM32F030R8T6的的PCF8563实时时钟芯片的求分享代码
manufact
5楼-- · 2020-03-02 23:55
用过PCF8563,还不错,比较好用
KloppGuo
6楼-- · 2020-03-03 03:56
我现在是不明白 如何去调整时间?谁有这方面的历程可以参考下

一周热门 更多>