4775|4

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】请问有谁用过DS1302? [复制链接]

DS1302的数据输入输出线是共用的,我想问它如何与MSP430的SPI口相连,因为MSP430的数据线可是两根,另外我还接有FLASH,不过它也是有SI和SO。

最新回复

DS1302与430接口程序 -------------------------------------------------------------------------------- #include <msp430x14x.h> #include <math.h> #define uchar unsigned char #define uint unsigned int #define DS1302_CLK_High P2OUT |=BIT4 #define DS1302_CLK_Low P2OUT &=~BIT4 #define DS1302_IO_High P2OUT |= BIT3 #define DS1302_IO_Low P2OUT &= ~BIT3 #define DS1302_CE_High P2OUT |= BIT2 #define DS1302_CE_Low P2OUT &= ~BIT2 #define DS1302_IO_IN P2DIR &= ~BIT3 #define DS1302_IO_OUT P2DIR |= BIT3 #define SomeNOP() _NOP();_NOP();_NOP();_NOP();_NOP(); char cur_time[7]={0x45,0x18,0x16,0x28,0x03,0x02,0x10}; //sec,min, hour,date,month,week,year// /*get time from ds1302 related function*/ void spi_write(uchar byte1) { char count=8; do { DS1302_CLK_Low; if(byte1&0x01) DS1302_IO_High; else DS1302_IO_Low; DS1302_CLK_High; SomeNOP(); byte1>>=1; }while(--count); } uchar spi_read(void) { uchar count=8; uchar data=0; DS1302_IO_IN; do { data>>=1; DS1302_CLK_Low; SomeNOP(); if(P2IN&BIT3) data|=0x80; DS1302_CLK_High; SomeNOP(); }while(--count); return(data); } void set_time(uchar addr,uchar time) { uchar time1=0; DS1302_CE_High; spi_write(0x8e); spi_write(0x00); DS1302_CLK_Low; DS1302_CE_Low; _NOP(); DS1302_CE_High; _NOP(); spi_write(addr); spi_write(time); spi_write(0x8e); spi_write(0x80); DS1302_CLK_Low; DS1302_CE_Low; } void init_time(void)//burst write mode { uchar i=0; DS1302_CE_High; spi_write(0x8e); spi_write(0x00); DS1302_CLK_Low; DS1302_CE_Low; _NOP(); DS1302_CE_High; _NOP(); spi_write(0xbe); for(i=0;i<7;i++) spi_write(cur_time); spi_write(0x8e); spi_write(0x80); DS1302_CLK_Low; DS1302_CE_Low; } void get_time(void) { uchar i=0; DS1302_CE_High; SomeNOP(); spi_write(0xbf); for(i=0;i<7;i++) cur_time=spi_read(); DS1302_CLK_Low; DS1302_CE_Low; DS1302_IO_OUT; } void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P2DIR|=0x1c; P2OUT&=0xe3; init_time(); get_time(); set_time(0x8c,05); while(1) {get_time();} }  详情 回复 发表于 2005-5-27 18:07
 
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
引用:

DS1302的数据输入输出线是共用的,我想问它如何与MSP430的SPI口相连,因为MSP430的数据线可是两根,另外我还接有FLASH,不过它也是有SI和SO。
一般是用I/O口模拟
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
MSP430 MCU 是什么?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
你还是用MSP430 I/0口模拟吧!
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

5
 

DS1302程序

DS1302与430接口程序

--------------------------------------------------------------------------------

#include <msp430x14x.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define DS1302_CLK_High P2OUT |=BIT4
#define DS1302_CLK_Low P2OUT &=~BIT4
#define DS1302_IO_High P2OUT |= BIT3
#define DS1302_IO_Low P2OUT &= ~BIT3
#define DS1302_CE_High P2OUT |= BIT2
#define DS1302_CE_Low P2OUT &= ~BIT2
#define DS1302_IO_IN P2DIR &= ~BIT3
#define DS1302_IO_OUT P2DIR |= BIT3
#define SomeNOP() _NOP();_NOP();_NOP();_NOP();_NOP();
char cur_time[7]={0x45,0x18,0x16,0x28,0x03,0x02,0x10};
//sec,min, hour,date,month,week,year//
/*get time from ds1302 related function*/
void spi_write(uchar byte1)
{
char count=8;
do
{
DS1302_CLK_Low;
if(byte1&0x01)
DS1302_IO_High;
else
DS1302_IO_Low;
DS1302_CLK_High;
SomeNOP();
byte1>>=1;
}while(--count);
}
uchar spi_read(void)
{
uchar count=8;
uchar data=0;
DS1302_IO_IN;
do
{
data>>=1;
DS1302_CLK_Low;
SomeNOP();
if(P2IN&BIT3)
data|=0x80;
DS1302_CLK_High;
SomeNOP();
}while(--count);
return(data);
}
void set_time(uchar addr,uchar time)
{
uchar time1=0;
DS1302_CE_High;
spi_write(0x8e);
spi_write(0x00);
DS1302_CLK_Low;
DS1302_CE_Low;
_NOP();
DS1302_CE_High;
_NOP();
spi_write(addr);
spi_write(time);
spi_write(0x8e);
spi_write(0x80);
DS1302_CLK_Low;
DS1302_CE_Low;
}
void init_time(void)//burst write mode
{
uchar i=0;
DS1302_CE_High;
spi_write(0x8e);
spi_write(0x00);
DS1302_CLK_Low;
DS1302_CE_Low;
_NOP();
DS1302_CE_High;
_NOP();
spi_write(0xbe);
for(i=0;i<7;i++)
spi_write(cur_time[i]);
spi_write(0x8e);
spi_write(0x80);
DS1302_CLK_Low;
DS1302_CE_Low;
}
void get_time(void)
{
uchar i=0;
DS1302_CE_High;
SomeNOP();
spi_write(0xbf);
for(i=0;i<7;i++)
cur_time[i]=spi_read();
DS1302_CLK_Low;
DS1302_CE_Low;
DS1302_IO_OUT;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P2DIR|=0x1c;
P2OUT&=0xe3;
init_time();
get_time();
set_time(0x8c,05);
while(1)
{get_time();}
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表