STM32上移植ds1307笔记
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笔记相关推荐
- stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享
原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...
- mavlink协议详解_MAVLink通讯协议在STM32上移植,并自定义协议
mavlink全称是(Micro Air Vehicle Message Marshalling Library),从名字可以看出,mavlink是主要面向飞控的一种开源通信协议.因此它默认定义了很多 ...
- JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用
json | json-c使用入门 这篇讲的也不错,抽空看下(网络传输json数据) https://www.bilibili.com/video/av669454528?p=3&spm_id ...
- stm32可以移植linux系统吗,如何在STM32上移植Linux?超详细的实操经验分享
使用initramfs最简单的方式,莫过于用已经做好的cpio.gz把kernel里面那个空的给换掉.这是2.6 kernel天生支持的,所以,你不用做什么特殊的设置. kernel的config o ...
- stm32 移植java_把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)
因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置. 前段时间还自己花时间去实现一个C语言解释器,看了一堆编译原理的东西,以及虚拟机等,头都搞大了,把基本功能实现了,但总是不 ...
- stm32 u8g2移植笔记
STM32 u8g2 移植笔记 前言 当初想写一个单色屏菜单时,曾移植过u8g2到STM32平台(这里用的是keil MDK),不过当时一直有一个问题没有搞懂:为什么u8g2用在flash为32k,r ...
- LwIP学习笔记——STM32 ENC28J60移植与入门
0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一详解个别 ...
- freertos心跳中断_FreeRTOS 在STM32上的移植 V1.0
FreeRTOS作为开源的轻量级实时性操作系统,不仅实现了基本的实时调度.信号量.队列和存储管理,而且在商业应用上不需要授权费. FreeRTOS的实现主要由list.c.queue.c.crouti ...
- USB应用开发笔记之一:STM32上实现USB主机读写U盘
在项目应用中,经常会有对外交换数据的需求.USB接口读写U盘无疑是一种颇为方便的选择.在这一篇中,我们就来讨论如何在STM32上实现USB主机读写U盘文件的方法. 1.应用概述 在我们的产品上 ...
最新文章
- Java编程思想——多态
- mysql锁3.常见问题
- 一文理清Mybatis中resultType与resultMap之间的关系和使用场景
- python的编程模式-Python 编程,应该养成哪些好的习惯?
- 使用 ExtJs Extender Controls 遇到的第一个错误
- linux中locate find 与 grep
- Qt Creator使用外部工具
- 初始JAVA--约定俗成的命名规则
- python多窗口传递信息,认识QT ----- 多窗口以及窗口之间的传值
- codevs1409 拦截导弹2
- word 2007导出pdf格式(含下载地址)
- sql-lab(ALL 1-65)
- selenium 如何使浏览器不加载图片和CSS???
- 只谈处理器 且看Apple A4到A5的进化
- 【.NET】IQueryable扩展方法实现复杂查询条件
- CentOS安装scp命令及其scp的使用
- tinyint(1)和int(1)的区别
- 1.2折半查找法的使用
- Thinking In Design Pattern——工厂模式演绎
- JAVA性能调试+JProfiler使用相关