PS:网上关于ds1307的资料最多还是基于51等单片机的,和stm32上还是略有差别,代码是参考了http://www.openedv.com/posts/list/20167.htm 但是他的代码有一定错误,在我的设备上读不了数据,更别谈写数据了。

说明:此程序是控制IO口模拟i2c控制ds1307

关于ds1302的资料这里就不多说了,主要分析下代码。让各位入门的新手参考一下,附上代码的下载链接:http://download.csdn.net/detail/u012062785/8966015   为什么是csdn的下载链接呢?前段时间由于校园网的问题,好像把csdn给墙掉了,不得已搬家到博客园,虽然csdn好用一些,但是还是不准备再搬回去了,麻烦。。。额,废话太多了,下面进入正题

配置:

1 #define SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
2 #define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
3
4
5 #define IIC_SCL    PBout(10) //SCL
6 #define IIC_SDA    PBout(11) //SDA
7 #define READ_SDA   PBin(11)  //ÊäÈëSDA 

所以SCL线连接到stm32上的PB10,SDA线连接到stm32上的PB11上。注意上拉电阻什么的,这个请看ds1307的数据手册

读ds1307:

 1 u8 ds1307_Read(u8 ReadAddr)
 2 {
 3         u8 temp,dat;
 4         int k;
 5         IIC_Start();
 6         IIC_Send_Byte(0xd0);
 7         IIC_Send_Byte(ReadAddr);
 8         IIC_Stop();                      //这里一定要重启IIC总线,否则会读错误
 9
10         IIC_Start();
11         IIC_Send_Byte(0xd1);
12         if (IIC_Wait_Ack())
13                 return 0xff;
14
15     temp = IIC_Read_Byte();
16     IIC_NAck();
17     IIC_Stop();
18
19         return temp;
20 }

读寄存器:

 1 u8 IIC_Read_Byte()
 2 {
 3         unsigned char i,receive=0;
 4         SDA_IN();
 5     for(i=0;i<7;i++)        //这里修改为7次,不然秒时针会一次递增2个单位
 6         {
 7       IIC_SCL=0;
 8       delay_us(2);
 9             IIC_SCL=1;
10       receive = receive<<1;
11       if(READ_SDA){
12                 receive++;
13             }
14             delay_us(1);
15     }
16     return (receive);
17 }

写ds1307

 1 void ds1307_Write(u8 WriteAddr,u8 Data)
 2 {
 3     u8 temp;
 4
 5     temp=(Data/10*16)+(Data%10); //16进制转BCD
 6
 7     IIC_Start();
 8     IIC_Send_Byte(0xd0);                9     //IIC_Wait_Ack();
10     IIC_Send_Byte(WriteAddr);        11     //IIC_Wait_Ack();
12     IIC_Send_Byte(temp);            13     //IIC_Wait_Ack();
14     IIC_Stop();
15     delay_us(10);
16
17 }

PS:这里理论上是需要加上应答位的,但是我加上就会超时得不到应答,如果不要,反而成功了!!这个问题有大神知道的话,希望您能给我留言,不甚感激

写寄存器:
 1 u8 IIC_Send_Byte(u8 txd)
 2 {
 3     u8 t;
 4         SDA_OUT();
 5     for(t=0;t<8;t++)
 6     {
 7             if((txd&0x80)>>7)
 8                 IIC_SDA=1;
 9             else
10                 IIC_SDA=0;
11             txd<<=1;
12             delay_us(2);
13             IIC_SCL=1;
14             delay_us(4);
15             IIC_SCL=0;
16     }
17
18
19         SDA_IN();
20         delay_us(4);
21         IIC_SDA=1;
22         //delay_us(2);
23         IIC_SCL=1;
24         delay_us(2);
25         if (READ_SDA==1)
26         {
27             IIC_SCL=0;
28             return 1;
29         }
30         else
31         {
32             IIC_SCL=0;
33             return 0;
34         }
35 }         

主要代码就差不多是这些了,如果还不太懂原理,可以下载完整源码参考。有大神觉得哪些写的不对的地方,还希望指导一下,谢谢~

总结:模拟i2c总线控制ds1307总的来说就是要注意ds1307的时序,这个也可以拓展到几乎所有字符设备吧,首先要理解设备的控制协议,然后开始一步一步操控。

转载于:https://www.cnblogs.com/pngcui/p/4707113.html

STM32上移植ds1307笔记相关推荐

  1. stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享

    原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...

  2. mavlink协议详解_MAVLink通讯协议在STM32上移植,并自定义协议

    mavlink全称是(Micro Air Vehicle Message Marshalling Library),从名字可以看出,mavlink是主要面向飞控的一种开源通信协议.因此它默认定义了很多 ...

  3. JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用

    json | json-c使用入门 这篇讲的也不错,抽空看下(网络传输json数据) https://www.bilibili.com/video/av669454528?p=3&spm_id ...

  4. stm32可以移植linux系统吗,如何在STM32上移植Linux?超详细的实操经验分享

    使用initramfs最简单的方式,莫过于用已经做好的cpio.gz把kernel里面那个空的给换掉.这是2.6 kernel天生支持的,所以,你不用做什么特殊的设置. kernel的config o ...

  5. stm32 移植java_把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)

    因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置. 前段时间还自己花时间去实现一个C语言解释器,看了一堆编译原理的东西,以及虚拟机等,头都搞大了,把基本功能实现了,但总是不 ...

  6. stm32 u8g2移植笔记

    STM32 u8g2 移植笔记 前言 当初想写一个单色屏菜单时,曾移植过u8g2到STM32平台(这里用的是keil MDK),不过当时一直有一个问题没有搞懂:为什么u8g2用在flash为32k,r ...

  7. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一详解个别 ...

  8. freertos心跳中断_FreeRTOS 在STM32上的移植 V1.0

    FreeRTOS作为开源的轻量级实时性操作系统,不仅实现了基本的实时调度.信号量.队列和存储管理,而且在商业应用上不需要授权费. FreeRTOS的实现主要由list.c.queue.c.crouti ...

  9. USB应用开发笔记之一:STM32上实现USB主机读写U盘

      在项目应用中,经常会有对外交换数据的需求.USB接口读写U盘无疑是一种颇为方便的选择.在这一篇中,我们就来讨论如何在STM32上实现USB主机读写U盘文件的方法. 1.应用概述   在我们的产品上 ...

最新文章

  1. Java编程思想——多态
  2. mysql锁3.常见问题
  3. 一文理清Mybatis中resultType与resultMap之间的关系和使用场景
  4. python的编程模式-Python 编程,应该养成哪些好的习惯?
  5. 使用 ExtJs Extender Controls 遇到的第一个错误
  6. linux中locate find 与 grep
  7. Qt Creator使用外部工具
  8. 初始JAVA--约定俗成的命名规则
  9. python多窗口传递信息,认识QT ----- 多窗口以及窗口之间的传值
  10. codevs1409 拦截导弹2
  11. word 2007导出pdf格式(含下载地址)
  12. sql-lab(ALL 1-65)
  13. selenium 如何使浏览器不加载图片和CSS???
  14. 只谈处理器 且看Apple A4到A5的进化
  15. 【.NET】IQueryable扩展方法实现复杂查询条件
  16. CentOS安装scp命令及其scp的使用
  17. tinyint(1)和int(1)的区别
  18. 1.2折半查找法的使用
  19. Thinking In Design Pattern——工厂模式演绎
  20. JAVA性能调试+JProfiler使用相关

热门文章

  1. 面向集团客户的云计算运营平台概述——之云计算运营平台方案(一)
  2. JS实例、静态的属性和方法
  3. 性能测试跑分软件,AE Benchmark(AE性能测试跑分工具) V1.0 免费版
  4. 钉钉签到后可以删除吗?钉钉签到考勤破解
  5. 如何在arduino上使用315 mhz的发射模块和接收模块P1
  6. R语言_R中的帮助函数
  7. 海思Hi3559AV100 SDK完整编译流程
  8. 实时操作系统UCOS学习笔记5----UCOSIII移植
  9. 科学计算机弧度,在线计算器
  10. 超硬核:Linux系统内存知识