原创 STM32与DS1302接口

2011-4-24 22:24 6692 10 13 分类: MCU/ 嵌入式

      作者在某STM32的应用中外接了一块DS1302,借鉴原来写过的PIC代码,很快移植成功。在这里与大家分享一下。

(1)硬件 CLK PA4  DAT PA5 RST PA6

(2)硬件初始化 CLK与RST均为输出,而DAT是开漏型的输出。因为在这种方式下,IO口的读仍然存在,因此是真正的双向IO模式。

/*DSCK -PA4 DAT PA5 RST DAT*/
#define ds1302Clk GPIO_Pin_4   //与时钟线相连的芯片的管脚
#define ds1302Dat GPIO_Pin_5   //与数据线相连的芯片的管脚
#define ds1302Rst GPIO_Pin_6   //与复位端相连的芯片的管脚

/* PA 4,6,为输出*/
 GPIO_InitStructure.GPIO_Pin =  ds1302Clk | ds1302Rst ;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

//PA5配置为开漏模式,此模式下可以实现真下的双向IO
 GPIO_InitStructure.GPIO_Pin =  ds1302Dat;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

(3)配置完毕,然后实现的代码就很简单了,从现成的代码移植过来。

#define WrEnDisCmd  0x8e  //写允许/禁止指令代码
#define WrEnDat     0x00 //写允许数据
#define WrDisDat    0x80 //写禁止数据
#define OscEnDisCmd 0x80 //振荡器允许/禁止指令代码
#define OscEnDat    0x00 //振荡器允许数据
#define OscDisDat   0x80 //振荡器禁止数据
#define WrMulti     0xbe //写入多个字节的指令代码
#define WrSingle    0x84 //写入单个字节的指令代码
#define RdMulti  0xbf //读出多个字节的指令代码

////以上这些#define均放在一个ds1302.h文件中。

void SendDat_1302(u8 Dat)
{ u8 i;
 u8 cTmp;
 for(i=0;i<8;i++)
 { 
   cTmp=Dat&LSB; //数据端等于tmp数据的末位值
  if(cTmp)    //1
      GPIO_SetBits(GPIOA,ds1302Dat);
  else
   GPIO_ResetBits(GPIOA,ds1302Dat); 
  Dat>>=1;
  GPIO_SetBits(GPIOA,ds1302Clk);
  uDelay(1);
  GPIO_ResetBits(GPIOA,ds1302Clk);
 }
}
/*写入1个或者多个字节,第1个参数是相关命令
#define WrMulti     0xbe //写入多个字节的指令代码
#define WrSingle    0x84 //写入单个字节的指令代码
第2个参数是待写入的值
第3个参数是待写入数组的指针
*/
void WriteByte_1302(u8 CmdDat,u8 Num,u8 *pSend)

 u8 i=0;
 GPIO_ResetBits(GPIOA,ds1302Rst);
 uDelay(1);
 GPIO_SetBits(GPIOA,ds1302Rst);
 SendDat_1302(CmdDat);
 for(i=0;i<Num;i++)
 { SendDat_1302(*(pSend+i));
 }
 GPIO_ResetBits(GPIOA,ds1302Rst);
}
/*读出字节,第一个参数是命令
 #define RdMulti  0xbf //读出多个字节的指令代码
 第2个参数是读出的字节数,第3个是指收数据数组指针
 */
void RecByte_1302(u8 CmdDat,u8 Num,u8 *pRec)

 u8 i,j,tmp,cTmp;
 GPIO_ResetBits(GPIOA,ds1302Rst);//复位引脚为低电平
 uDelay(1);
 GPIO_ResetBits(GPIOA,ds1302Clk);
 uDelay(1);
 GPIO_SetBits(GPIOA,ds1302Rst);
 SendDat_1302(CmdDat); //发送命令
 for(i=0;i<Num;i++)
 { for(j=0;j<8;j++)
  { tmp>>=1;
   cTmp=GPIO_ReadInputDataBit(GPIOA,ds1302Dat);
   if(cTmp)
    tmp|=0x80;
   GPIO_SetBits(GPIOA,ds1302Clk);
   uDelay(1);
   GPIO_ResetBits(GPIOA,ds1302Clk);       
  }
  *(pRec+i)=tmp;
 }
 uDelay(1);
 GPIO_ResetBits(GPIOA,ds1302Rst);//复位引脚为低电平
}
/*
当写保护寄存器的最高位为0时,允许数据写入寄存器。
写保护寄存器可以通过命令字节8E、8F来规定禁止写入/读出。写保护位不能在多字节传送模式下写入。
当写保护寄存器的最高位为1时,禁止数据写入寄存器。

时钟停止位操作:当把秒寄存器的第7位时钟停止位设置为0时起动时钟开始
当把秒寄存器的第7位时钟停止位设置为1时,时钟振荡器停止。
  
    根据传入的参数决定相关命令,
 第一个参数:命令字,第2个参数:写入的数据
 写允许命令;8EH,00H
 写禁止命令;8EH,80H
 振荡器允许命令;80H,00H
 振荡器禁止命令;80H,80H
*/
void WrCmd(u8 CmdDat,u8 CmdWord)
{ u8 CmdBuf[2];
 CmdBuf[0]=CmdWord;
 WriteByte_1302(CmdDat,1,CmdBuf);
}

main函数中调用如下:

 u8 Ds1302SendBuf[8]={0x30,0x32,0x01,0x10,0x01,0x01,0x08,33};  //发送数据缓冲区
 u8 Ds1302RecBuf[8];    //接收数据缓冲区
 WrCmd(WrEnDisCmd,WrEnDat);  //写允许
 WrCmd(OscEnDisCmd,OscEnDat); //振荡器允许
 WriteByte(WrMulti,8,Ds1302SendBuf);//将时间值送到DS1302中
 RecByte(RdMulti,8,Ds1302RecBuf); // 读出来看看,

......

 

 

文章评论3条评论)

登录后参与讨论

用户1851996 2015-8-28 13:47

评论是对思考最好的总结…

用户377235 2013-3-6 11:13

博主知不知道用寄存器怎么写?

zhanghaokm_428385128 2011-5-4 08:06

看看。。。。。。。
相关推荐阅读
teach51_109853927 2015-10-25 22:37
带“锁定输出”的数控稳压电源(二)
3.控制程序编写        硬件电路设计完成后,就要编写软件了。软件基本上可以分为键盘驱动,PWM生成,功能实现等部分。 3.1 键盘处理程序        STC单片机的引脚可以...
teach51_109853927 2014-03-02 12:17
带“锁定输出”的数控稳压电源(一)
本文是探索“开源培训”思想的作品。 所谓“开源培训”是指在某个社区,各志愿者提供有一定实用价值和教学价值的作品,同时详细说明制作过程,并提供制作所需的各类资源,帮助入门者快速找到适合自己的项目...
teach51_109853927 2014-02-22 21:15
《单片机项目教程》、《单片机项目教程C语言版》电子课件
《单片机项目教程》电子课件 http://pan.baidu.com/s/1kT2Yb6f 《单片机项目教程C语言版》电子课件 http://pan.baidu.com/s/1gd5O...
teach51_109853927 2014-02-22 21:05
《单片机应用与接口技术》相关资源
单片机应用与接口技术    机械工业出版社出版,江苏省教育厅推荐教材 《单片机应用与接口技术》课件 http://pan.baidu.com/s/1c0kpzUg 《单片机应用与接...
teach51_109853927 2014-02-22 15:25
便携式无线抢答器
本产品专门为开展活动时需要用到抢答器的场合设计,已制作成品,读者可以参考作为练手之用。 如图1所示左边为信号接收装置(主持人用),右边两个为发射装置(比赛选手用)。都只需要使用干电池供电即可。...
teach51_109853927 2014-02-22 15:22
Modbus通讯协议
Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协...
我要评论
3
10
关闭 站长推荐上一条 /2 下一条