您的位置:首页 > 其它

STM32上移植ds1307笔记

2015-08-06 09:41 218 查看
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好用一些,但是还是不准备再搬回去了,麻烦。。。额,废话太多了,下面进入正题

配置:

#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的时序,这个也可以拓展到几乎所有字符设备吧,首先要理解设备的控制协议,然后开始一步一步操控。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: