野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15509|回复: 8

急求时钟芯片SD2403API的相关参考程序、资料

[复制链接]
发表于 2017-9-5 11:06:02 | 显示全部楼层 |阅读模式
1火花
有哪位用过时钟芯片SD2403API吗?网上都找不到相关的程序,急求相关参考程序、资料,谢谢了
回复

使用道具 举报

发表于 2017-9-5 11:06:03 | 显示全部楼层
SD2403API.rar (2.85 KB, 下载次数: 143)
回复

使用道具 举报

发表于 2017-9-5 11:20:02 | 显示全部楼层
没有用过,帮顶
回复

使用道具 举报

发表于 2017-9-5 11:27:42 | 显示全部楼层
本帖最后由 wqy_1000 于 2017-9-5 11:29 编辑
  1. //************************************************************
  2. //实时时钟SD2403读写iicavr atmega1280程序
  3. //硬件IIC程序  
  4. //***********************************************************
  5. #include "SD2403API.h"

  6. //*********变量及IO 口定义******************************************************
  7. unsigned char iic_state;
  8. //extern unsigned char iic_error_count;
  9. unsigned char iic_error_count;
  10. /*date[2]=hour,date[1]=minute,date[0]=second
  11. date[6]=year,date[5]=month,date[4]=day,date[3]=week*/
  12. //extern static
  13. //unsigned char date[7]; //日期数组
  14. unsigned char real_times_set[7]={0X00,0X00,0X15,0X01,0X31,0X12,0X8},real_time_read[7];//时间处理
  15. unsigned char real_times_set_init[7],real_time_read_init[7];//用于初始化
  16. //******************************************************************************
  17. /*********I2C 延时***********/
  18. void I2CWait(unsigned int num)
  19. {
  20.     //自己实现
  21. }
  22. /**********初始化iic*************/
  23. //TWI initialize
  24. // bit rate:1
  25. void iic_init(void)
  26. {
  27.     //自己实现
  28. }
  29. /********开启SD2403的I2C 总线********/
  30. void I2CStart(void)
  31. {
  32.         //自己实现
  33. }

  34. /********关闭SD2403的I2C 总线*******/
  35. void I2C_Stop(void)
  36. {
  37.     //自己实现
  38. }

  39. /************MCU 向SD2403发送写地址*************/
  40. void I2C_Send_w_Add(void)
  41. {
  42.     //自己实现
  43. }
  44. /************MCU 向SD2403发送读地址*************/
  45. void I2C_Send_r_Add(void)
  46. {
  47.     //自己实现
  48. }

  49. void I2C_Send_wr_Add(unsigned char wr_add)
  50. {
  51.     //自己实现
  52. }
  53. /************MCU 向SD2403发送一个字节*************/
  54. void I2CSendByte(unsigned char tx_data)                  
  55. {
  56.     TWDR = tx_data;                                                                //将SLA_W 载入到TWDR 寄存器
  57.         TWCR = (1<<TWINT) | (1<<TWEN);                           //TWINT 位清零,启动发送数据
  58.         while (!(TWCR & (1<<TWINT)))                           //等待TWINT 置位, TWINT 置位表示总线数据 DATA 已发送,及收到应答信号ACK/NACK
  59.         ;
  60.         //if ((TWSR & 0xF8) != MT_DATA_ACK)                   //检验TWI 状态寄存器,屏蔽预分频位,如果状态字不是MT_DATA_ACK 转出错处理
  61.         if ((TWSR & 0xF8) != 0x28)
  62.             iic_state=false;
  63.         else
  64.                 iic_state=true;
  65. }
  66. /*********MCU 从SD2403读入一字节*********/
  67. unsigned char I2CReceiveByte(void)
  68. {
  69.     unsigned char iic_rx_temp_data=0;
  70.         TWCR=(0<<TWSTA)|(0<<TWSTO)|(1<<TWEA)|(1<<TWINT)|(1<<TWEN);
  71.         while (!(TWCR & (1<<TWINT)))                                //等待TWINT 置位, TWINT 置位表示总线数据 DATA 已收到,及收到应答信号ACK/NACK
  72.         ;           
  73.           if((TWSR&0xF8)!=0x50)                                                //检验TWI 状态寄存器
  74.         {
  75.                    iic_state = false;
  76.         }                                                
  77.            else
  78.         {
  79.                   iic_rx_temp_data=TWDR;
  80.                  iic_state = true;
  81.     }
  82.         return iic_rx_temp_data;
  83. }
  84. /******读SD2403实时数据寄存器******/
  85. void I2CReadDate(unsigned char *p_date)
  86. {
  87.     unsigned char n;
  88.         I2CStart();
  89.         I2C_Send_w_Add();
  90.     //I2CSendByte(0x64);
  91.     //I2CWaitAck();
  92.         I2C_Send_wr_Add(0x00);//设置写起始地址
  93.         I2C_Stop();
  94.         I2CWait(200);
  95.         I2CStart();
  96.     I2C_Send_r_Add();
  97.         for(n=0;n<7;n++)
  98.         {
  99.                  WDR();
  100.                 if(iic_state)
  101.                 {
  102.                          *p_date = I2CReceiveByte();
  103.                         if(n==2)
  104.                         {
  105.                           *p_date -= 0x80;
  106.                         }
  107.                         p_date++;
  108.                         iic_error_count=0;
  109.                 }
  110.                 else
  111.                 {
  112.                    if(iic_error_count++>3)
  113.                    {
  114.                                    PORTD |= (1<<7);                                        //BB
  115.                                 for(;;);//启动复位处理错误处理
  116.                    }
  117.                 }
  118.         }
  119.     I2C_Stop();
  120.         I2CWait(2);
  121. }
  122. void alarm_set(void)
  123. {
  124.         WriteTimeOn();
  125.         I2CWait(200);
  126.         I2CStart();
  127.         I2C_Send_w_Add();
  128.         I2C_Send_wr_Add(0x10);//设置写起始地址
  129.         I2CSendByte(0x92);//设置报警中断和报警中断输出???报警
  130.         I2C_Stop();
  131.         I2CWait(200);
  132.         I2CStart();
  133.         I2C_Send_w_Add();
  134.         I2C_Send_wr_Add(0x0E);//设置写起始地址
  135.         I2CSendByte(0x02);//允许分时中断(每小时报警一次零分)
  136.         //I2CSendByte(0x06);//允许分时中断(每天报警一次零点)
  137.         I2C_Stop();        
  138.         I2CWait(200);
  139.         I2CStart();
  140.         I2C_Send_w_Add();
  141.         I2C_Send_wr_Add(0x08);//设置写起始地址
  142.         I2CSendByte(0x00);//设置分中断报警(每小时报警一次零分)
  143.         //I2CSendByte(0x00);//设置分中断报警(每天报警一次零点)
  144.         //I2CSendByte(0x00);//设置时中断报警(每天报警一次零点)
  145.         I2C_Stop();
  146.         I2CWait(200);
  147.         WriteTimeOff();
  148.         I2CWait(200);
  149. }
  150. /******写SD2403实时数据寄存器******/
  151. void I2CWriteDate(unsigned char *p_date_set)
  152. {
  153.         unsigned char n;
  154.         WriteTimeOn();
  155.         I2CWait(200);
  156.     I2CStart();
  157.         I2C_Send_w_Add();
  158.         I2C_Send_wr_Add(0x00);//设置写起始地址
  159.         for(n=0;n<7;n++)
  160.         {
  161.                  WDR();
  162.                 I2CSendByte(*p_date_set);
  163.                 p_date_set++;
  164.         }
  165.     /*I2CSendByte(0X30);// second
  166.     I2CSendByte(0X17);//minute
  167.     I2CSendByte(0X95);//hour ,二十四小时制
  168.     I2CSendByte(0X05);//week
  169.     I2CSendByte(0X28);//day
  170.     I2CSendByte(0X11);//month
  171.     I2CSendByte(0X08);//year*/
  172.     I2C_Stop();
  173.         I2CWait(200);
  174.     I2CStart();
  175.         I2C_Send_w_Add();
  176.         I2C_Send_wr_Add(0x12);//设置写起始地址
  177.         //I2CSendByte(0x00);//清零CTR3寄存器
  178.     I2CSendByte(0x00);//清零数字调整寄存器
  179.         //I2CSendByte(0x00);//清零倒计时定时器寄存器
  180.     I2C_Stop();
  181.         I2CWait(200);
  182.         //alarm_set();//报警
  183.         //I2CWait(200);
  184.     WriteTimeOff();
  185.         I2CWait(200);
  186. }
  187. /******写SD2403允许程序******/
  188. void WriteTimeOn(void)
  189. {
  190.         I2CStart();
  191.         I2C_Send_w_Add();
  192.         I2C_Send_wr_Add(0x10);//设置写地址10H
  193.         I2CSendByte(0x80);//置WRTC1=1
  194.     I2C_Stop();
  195.         I2CWait(200);
  196.     I2CStart();
  197.         I2C_Send_w_Add();
  198.         I2C_Send_wr_Add(0x0f);//设置写地址0FH
  199.         I2CSendByte(0x84);//置WRTC2,WRTC3=1
  200.     I2C_Stop();
  201.         I2CWait(2);
  202. }
  203. /******写SD2403禁止程序******/
  204. void WriteTimeOff(void)
  205. {
  206.         I2CStart();
  207.         I2C_Send_w_Add();
  208.         I2C_Send_wr_Add(0x0f);//设置写地址0FH
  209.         I2CSendByte(0x00);//置WRTC2,WRTC3=0
  210.         I2CSendByte(0X12);//置WRTC1=0(10H 地址)????报警
  211.         //I2CSendByte(0X00);//置WRTC1=0(10H 地址)????报警
  212.     I2C_Stop();
  213.         I2CWait(2);
  214. }
  215. void clear_alarm(void)
  216. {
  217.          WriteTimeOn();
  218.         I2CWait(200);
  219.     I2CStart();
  220.         I2C_Send_w_Add();
  221.         I2C_Send_wr_Add(0x0F);//设置写起始地址
  222.     I2CSendByte(0XA4);//清除报警标记?????报警
  223.         I2C_Stop();
  224.         I2CWait(200);
  225.         WriteTimeOff();
  226.         I2CWait(2);
  227. }
  228. //******************************************************************************

  229. //将二位的字符转换成BDC码"59"-59h
  230. unsigned char atobdc(unsigned char *p_a)
  231. {
  232.     unsigned char n,temp;
  233.         p_a++;
  234.         temp = *p_a-0x30;
  235.         p_a--;
  236.         temp += (*p_a-0x30)<<4;
  237.         return temp;
  238. }

  239. void bdctochar(unsigned char *p_str)
  240. {
  241.     unsigned int y,v=6;
  242.         unsigned char bdc,temp;
  243.     for(y=0;y<7;y++)
  244.         {
  245.             WDR();
  246.                 bdc=real_time_read[v--];
  247.                 temp= bdc & 0xf0;
  248.                 if(y == 3)//星期只显示一位
  249.                 {
  250.                    *p_str = (bdc & 0x0f)+0x30;
  251.                     p_str++;
  252.                 }
  253.                 else
  254.                 {
  255.                     *p_str = (temp>>4)+0x30;
  256.                     p_str++;
  257.                     *p_str = (bdc & 0x0f)+0x30;
  258.                     p_str++;
  259.                 }
  260.         }        
  261. }

  262. //重设时间
  263. /*DateTime format: 59592301311209 */
  264. void SetDateTime(unsigned char *Datetime)
  265. {
  266.      int i;
  267.          unsigned char temp_string[3];
  268.          for(i=0;i<7;i++)
  269.          {
  270.                   temp_string[0] = *Datetime++;
  271.             temp_string[1] = *Datetime++;
  272.             temp_string[2] = ' ';
  273.             //real_times_set[i] = atoi(temp_str);//十进制数
  274.             real_times_set[i] = atobdc(temp_string);//BDC码
  275.             if(i==2)
  276.              {
  277.                    real_times_set[i] += 0x80;
  278.              }
  279.      }
  280.       I2CWriteDate(real_times_set);
  281. }

  282. //翻译按键的值
  283. unsigned char keytoa(unsigned char key)
  284. {
  285.     switch(key)
  286.          {
  287.           case 0:  return '1'; break;
  288.           case 1:  return '2'; break;
  289.           case 2:  return '3'; break;
  290.           case 3:  return 'A'; break;
  291.           case 4:  return '4'; break;
  292.           case 5:  return '5'; break;
  293.           case 6:  return '6'; break;
  294.           case 7:  return 'B'; break;
  295.           case 8:  return '7'; break;
  296.           case 9:  return '8'; break;
  297.           case 10:  return '9'; break;
  298.           case 11:  return 'C'; break;
  299.           case 12:  return '*'; break;
  300.           case 13:  return '0'; break;
  301.           case 14:  return '#'; break;
  302.           case 15:  return 'D'; break;
  303.          }
  304. }
复制代码

  1. #ifndef _iic_h

  2. #define _iic_h
  3. //*************************** ***************************************************
  4. #include <iom1280v.h>
  5. #include <macros.h>

  6. //******************************************************************************
  7. #define true 1
  8. #define false 0

  9. //******************************************************************************
  10. void iic_init(void);
  11. void I2CStart(void);
  12. void I2C_Stop(void);
  13. void I2C_Send_w_Add(void);
  14. void I2C_Send_r_Add(void);
  15. void I2C_Send_wr_Add(unsigned char wr_add);
  16. void I2CSendByte(unsigned char tx_data);
  17. unsigned char I2CReceiveByte(void);
  18. void I2CReadDate(unsigned char *p_date);
  19. void I2CWriteDate(unsigned char *p_date_set);
  20. void WriteTimeOn(void);
  21. void WriteTimeOff(void);
  22. void clear_alarm(void);
  23. void alarm_set(void);

  24. //******************************************************************************

  25. #endif
复制代码


回复

使用道具 举报

 楼主| 发表于 2017-9-5 11:35:44 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2017-9-5 11:51:54 | 显示全部楼层

请问能否把一些宏的定义也发出来看一下,例如:TWCR、TWBR、TWSR、TWAR、TWINT、TWSTA、TWEN...
回复

使用道具 举报

发表于 2017-9-5 11:54:19 | 显示全部楼层
这个是我MCU I2C的寄存器的东西,你可以用自已的I2C驱动或者参考火哥的I2C驱动
回复

使用道具 举报

发表于 2017-9-5 11:55:07 | 显示全部楼层
panxing 发表于 2017-9-5 11:51
请问能否把一些宏的定义也发出来看一下,例如:TWCR、TWBR、TWSR、TWAR、TWINT、TWSTA、TWEN...

这个是我MCU I2C的寄存器的东西,你可以用自已的I2C驱动或者参考火哥的I2C驱动
回复

使用道具 举报

 楼主| 发表于 2017-9-5 12:02:58 | 显示全部楼层
wqy_1000 发表于 2017-9-5 11:55
这个是我MCU I2C的寄存器的东西,你可以用自已的I2C驱动或者参考火哥的I2C驱动

好的,太谢谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-4 07:35 , Processed in 0.042062 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表