STM32上移植ds1307笔记
2015-08-06 09:41
288 查看
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好用一些,但是还是不准备再搬回去了,麻烦。。。额,废话太多了,下面进入正题
配置:
所以SCL线连接到stm32上的PB10,SDA线连接到stm32上的PB11上。注意上拉电阻什么的,这个请看ds1307的数据手册
读ds1307:
读寄存器:
写ds1307
主要代码就差不多是这些了,如果还不太懂原理,可以下载完整源码参考。有大神觉得哪些写的不对的地方,还希望指导一下,谢谢~
总结:模拟i2c总线控制ds1307总的来说就是要注意ds1307的时序,这个也可以拓展到几乎所有字符设备吧,首先要理解设备的控制协议,然后开始一步一步操控。
说明:此程序是控制IO口模拟i2c控制ds1307
关于ds1302的资料这里就不多说了,主要分析下代码。让各位入门的新手参考一下,附上代码的下载链接:http://download.csdn.net/detail/u012062785/8966015 为什么是csdn的下载链接呢?前段时间由于校园网的问题,好像把csdn给墙掉了,不得已搬家到博客园,虽然csdn好用一些,但是还是不准备再搬回去了,麻烦。。。额,废话太多了,下面进入正题
配置:
#define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;} #define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;} #define IIC_SCL PBout(10) //SCL #define IIC_SDA PBout(11) //SDA #define READ_SDA PBin(11) //ÊäÈëSDA
所以SCL线连接到stm32上的PB10,SDA线连接到stm32上的PB11上。注意上拉电阻什么的,这个请看ds1307的数据手册
读ds1307:
u8 ds1307_Read(u8 ReadAddr) { u8 temp,dat; int k; IIC_Start(); IIC_Send_Byte(0xd0); IIC_Send_Byte(ReadAddr); IIC_Stop(); //这里一定要重启IIC总线,否则会读错误 IIC_Start(); IIC_Send_Byte(0xd1); if (IIC_Wait_Ack()) return 0xff; temp = IIC_Read_Byte(); IIC_NAck(); IIC_Stop(); return temp; }
读寄存器:
u8 IIC_Read_Byte() { unsigned char i,receive=0; SDA_IN(); for(i=0;i<7;i++) //这里修改为7次,不然秒时针会一次递增2个单位 { IIC_SCL=0; delay_us(2); IIC_SCL=1; receive = receive<<1; if(READ_SDA){ receive++; } delay_us(1); } return (receive); }
写ds1307
void ds1307_Write(u8 WriteAddr,u8 Data) { u8 temp; temp=(Data/10*16)+(Data%10); //16进制转BCD IIC_Start(); IIC_Send_Byte(0xd0); //IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr); //IIC_Wait_Ack(); IIC_Send_Byte(temp); //IIC_Wait_Ack(); IIC_Stop(); delay_us(10); }
PS:这里理论上是需要加上应答位的,但是我加上就会超时得不到应答,如果不要,反而成功了!!这个问题有大神知道的话,希望您能给我留言,不甚感激 写寄存器:
u8 IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); for(t=0;t<8;t++) { if((txd&0x80)>>7) IIC_SDA=1; else IIC_SDA=0; txd<<=1; delay_us(2); IIC_SCL=1; delay_us(4); IIC_SCL=0; } SDA_IN(); delay_us(4); IIC_SDA=1; //delay_us(2); IIC_SCL=1; delay_us(2); if (READ_SDA==1) { IIC_SCL=0; return 1; } else { IIC_SCL=0; return 0; } }
主要代码就差不多是这些了,如果还不太懂原理,可以下载完整源码参考。有大神觉得哪些写的不对的地方,还希望指导一下,谢谢~
总结:模拟i2c总线控制ds1307总的来说就是要注意ds1307的时序,这个也可以拓展到几乎所有字符设备吧,首先要理解设备的控制协议,然后开始一步一步操控。
相关文章推荐
- STL的使用。。备忘
- Linux系统文件颜色表示
- “稳定军心”对网站建设公司很重要
- 上午、下午的时间表示与NLS_DATE_LANGUAGE的关系
- Android ViewGroup点击效果(背景色)
- iOS开发:开发中如何更改项目名
- ios页面间传递参数四种方式
- Hardware-javaaplication.
- python偏函数
- 关于select多选返回值的问题
- HDU 5074 Hatsune Miku DP
- 【集合类型的并发】Collections.synchronizedList
- 南邮 OJ 1584 连通 OR 不连通
- eclipse里怎么查看变量(包括类)和方法的调用位置
- DPC定时器
- android学习笔记之SharePreferences简单使用
- 模式化窗口.html
- 通过JSON实现NSString,NSDictionary(NSArray)相互转化
- 南邮 OJ 1583 机器人搬重物
- android 仿易讯客户端loading效果