当前位置:   article > 正文

STM32与DS1302的接口电路_ds1302与stm32单片机的连接

ds1302与stm32单片机的连接
  1. 作者在某STM32的应用中外接了一块DS1302,借鉴原来写过的PIC代码,很快移植成功。在这里与大家分享一下。
  2. 1)硬件 CLK---PA4, DAT--- PA5, RST--- PA6
  3. 2)硬件初始化 CLK与RST均为输出,而DAT是开漏型的输出。因为在这种方式下,IO口的读仍然存在,因此是真正的双向IO模式。
  4. /*DSCK -PA4 DAT PA5 RST DAT*/
  5. #define ds1302Clk GPIO_Pin_4 //与时钟线相连的芯片的管脚
  6. #define ds1302Dat GPIO_Pin_5 //与数据线相连的芯片的管脚
  7. #define ds1302Rst GPIO_Pin_6 //与复位端相连的芯片的管脚
  8. /* PA 4,6,为输出*/
  9. GPIO_InitStructure.GPIO_Pin = ds1302Clk | ds1302Rst ;
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12. GPIO_Init(GPIOA, &GPIO_InitStructure);
  13. //PA5配置为开漏模式,此模式下可以实现真下的双向IO
  14. GPIO_InitStructure.GPIO_Pin = ds1302Dat;
  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  16. GPIO_Init(GPIOA, &GPIO_InitStructure);
  17. 3)配置完毕,然后实现的代码就很简单了,从现成的代码移植过来。
  18. #define WrEnDisCmd 0x8e //写允许/禁止指令代码
  19. #define WrEnDat 0x00 //写允许数据
  20. #define WrDisDat 0x80 //写禁止数据
  21. #define OscEnDisCmd 0x80 //振荡器允许/禁止指令代码
  22. #define OscEnDat 0x00 //振荡器允许数据
  23. #define OscDisDat 0x80 //振荡器禁止数据
  24. #define WrMulti 0xbe //写入多个字节的指令代码
  25. #define WrSingle 0x84 //写入单个字节的指令代码
  26. #define RdMulti 0xbf //读出多个字节的指令代码
  27. 以上这些#define均放在一个ds1302.h文件中。
  28. void SendDat_1302(u8 Dat)
  29. { u8 i;
  30. u8 cTmp;
  31. for(i=0;i<8;i++)
  32. {
  33. cTmp=Dat&LSB; //数据端等于tmp数据的末位值
  34. if(cTmp) //1
  35. GPIO_SetBits(GPIOA,ds1302Dat);
  36. else
  37. GPIO_ResetBits(GPIOA,ds1302Dat);
  38. Dat>>=1;
  39. GPIO_SetBits(GPIOA,ds1302Clk);
  40. uDelay(1);
  41. GPIO_ResetBits(GPIOA,ds1302Clk);
  42. }
  43. }
  44. /*写入1个或者多个字节,第1个参数是相关命令
  45. #define WrMulti 0xbe //写入多个字节的指令代码
  46. #define WrSingle 0x84 //写入单个字节的指令代码
  47. 第2个参数是待写入的值
  48. 第3个参数是待写入数组的指针
  49. */
  50. void WriteByte_1302(u8 CmdDat,u8 Num,u8 *pSend)
  51. {
  52. u8 i=0;
  53. GPIO_ResetBits(GPIOA,ds1302Rst);
  54. uDelay(1);
  55. GPIO_SetBits(GPIOA,ds1302Rst);
  56. SendDat_1302(CmdDat);
  57. for(i=0;i<Num;i++)
  58. { SendDat_1302(*(pSend+i));
  59. }
  60. GPIO_ResetBits(GPIOA,ds1302Rst);
  61. }
  62. /*读出字节,第一个参数是命令
  63. #define RdMulti 0xbf //读出多个字节的指令代码
  64. 第2个参数是读出的字节数,第3个是指收数据数组指针
  65. */
  66. void RecByte_1302(u8 CmdDat,u8 Num,u8 *pRec)
  67. {
  68. u8 i,j,tmp,cTmp;
  69. GPIO_ResetBits(GPIOA,ds1302Rst);//复位引脚为低电平
  70. uDelay(1);
  71. GPIO_ResetBits(GPIOA,ds1302Clk);
  72. uDelay(1);
  73. GPIO_SetBits(GPIOA,ds1302Rst);
  74. SendDat_1302(CmdDat); //发送命令
  75. for(i=0;i<Num;i++)
  76. { for(j=0;j<8;j++)
  77. { tmp>>=1;
  78. cTmp=GPIO_ReadInputDataBit(GPIOA,ds1302Dat);
  79. if(cTmp)
  80. tmp|=0x80;
  81. GPIO_SetBits(GPIOA,ds1302Clk);
  82. uDelay(1);
  83. GPIO_ResetBits(GPIOA,ds1302Clk);
  84. }
  85. *(pRec+i)=tmp;
  86. }
  87. uDelay(1);
  88. GPIO_ResetBits(GPIOA,ds1302Rst);//复位引脚为低电平
  89. }
  90. /*
  91. 当写保护寄存器的最高位为0时,允许数据写入寄存器。
  92. 写保护寄存器可以通过命令字节8E、8F来规定禁止写入/读出。写保护位不能在多字节传送模式下写入。
  93. 当写保护寄存器的最高位为1时,禁止数据写入寄存器。
  94. 时钟停止位操作:当把秒寄存器的第7位时钟停止位设置为0时起动时钟开始
  95. 当把秒寄存器的第7位时钟停止位设置为1时,时钟振荡器停止。
  96. 根据传入的参数决定相关命令,
  97. 第一个参数:命令字,第2个参数:写入的数据
  98. 写允许命令;8EH,00H
  99. 写禁止命令;8EH,80H
  100. 振荡器允许命令;80H,00H
  101. 振荡器禁止命令;80H,80H
  102. */
  103. void WrCmd(u8 CmdDat,u8 CmdWord)
  104. { u8 CmdBuf[2];
  105. CmdBuf[0]=CmdWord;
  106. WriteByte_1302(CmdDat,1,CmdBuf);
  107. }
  108. main函数中调用如下:
  109. u8 Ds1302SendBuf[8]={0x30,0x32,0x01,0x10,0x01,0x01,0x08,33}; //发送数据缓冲区
  110. u8 Ds1302RecBuf[8]; //接收数据缓冲区
  111. WrCmd(WrEnDisCmd,WrEnDat); //写允许
  112. WrCmd(OscEnDisCmd,OscEnDat); //振荡器允许
  113. WriteByte(WrMulti,8,Ds1302SendBuf);//将时间值送到DS1302中
  114. RecByte(RdMulti,8,Ds1302RecBuf); // 读出来看看

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/460793
推荐阅读
相关标签
  

闽ICP备14008679号