程序如下:
#include "SPI.h"
#include "io430.h"
unsigned char rmsec=0, rmin=1,rsec=2,rhr=3, rdow=4, rdate=5,rmon=6,ryr=7;
/*
函数名:SPI1_Init
功能:
MSP430的SPI1模块初始化
变量:
无
返回值:
无
*/
void SPI1_Init(void)
{
P5SEL |= 0x0E; // P5.1,2,3 设置为SPI引脚
P5DIR |= (0x02 + 0x08+0x10+0x20+0x40+0x80); //P5.1 = SIMO1 和 P5.3 = UCLK1 为输出
P5OUT |= 0x02; //P5.1 = SIMO1 默认输出为高;
P5DIR &= ~0x04; //P5.2 = SOMI1 为输入
P5OUT_bit.P4=1; //p5.4,p5.5默认输出为高
P5OUT_bit.P5=1;
P5OUT_bit.P6=1; //p5.6,p5.7默认输出为高
P5OUT_bit.P7=1;
P6DIR &= ~0x01;
U1CTL|=SWRST;
U1CTL |= CHAR + SYNC + MM; // 8位 主机
U1TCTL |= CKPH+CKPL + SSEL1+SSEL0 + STC; // CKPH = 1, CKPl = 1, SMCLK, 3线SPI
U1BR0 = 0x08; // SPICLK = SMCLK/8
U1BR1 = 0x06;
U1MCTL = 0x00; //SPI模式下该寄存器必须赋值为0
ME2 |= USPIE1; // 模块使能
U1CTL &= ~SWRST; // SPI 使能
/片选DS1390,禁止25LC256。。。。。。。。。。。。。。。。。。。。。。。。。。。
void CSDS1390_Enable(void)
{ P5OUT_bit.P4=1;
P5OUT_bit.P5=0;
delay_spi(600);
}
// 延时程序操作。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
void delay_spi(unsigned int time)
{
unsigned int i;
i=time;
while (i--);
}
// 读数据操作。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
unsigned char Read_DATA(void)
{ while((IFG2&URXIFG1)==0) ;
return(U1RXBUF);
}
// 发送数据操作。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
void SendDATA(unsigned char pWDAT)
{
while((IFG2&UTXIFG1)==0) ;
U1TXBUF=pWDAT;
}
//DS1390设置校准时间函数.........................................................
void SetTime(void)
{
unsigned char msec=0x01, min=0x26,sec=0x00,hr=0x17, dow=0x04, date=0x26,mon=0x12,yr=0x04;
CSDS1390_Enable( );
SendDATA(0x8e); //写入读地址
SendDATA(0x5f);
SendDATA(0x00);
while((IFG2&UTXIFG1)==0);
P5OUT_bit.P5=1;
CSDS1390_Enable( );
SendDATA(0x80); //写地址
SendDATA(msec); //写入十分一、百分之一秒,0
SendDATA(sec); //写入秒 0秒
SendDATA(min); //写入分钟 26分
SendDATA(hr); //写入小时
SendDATA(dow); //写入 一周的第几日 :
SendDATA(date); //写入 一个月的第几日 及26日
SendDATA(mon); //写入月份
SendDATA(yr); //写入年份
while((IFG2&UTXIFG1)==0);
P5OUT_bit.P5=1;
}
//DS1390读取时间函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。
void DS1390Communication(void)
{// unsigned char rmsec=0, rmin=0,rsec=0,rhr=0, rdow=0, rdate=0,rmon=0,ryr=0;
CSDS1390_Enable( );
SendDATA(0x00); //发送读地址
delay_spi(600);
SendDATA(1);
rmsec = Read_DATA(); //读取时间
SendDATA(1);
rsec = Read_DATA();
SendDATA(1);
rmin = Read_DATA();
SendDATA(1);
rhr = Read_DATA();
SendDATA(1);
rdow = Read_DATA();
SendDATA(1);
rdate = Read_DATA();
SendDATA(1);
rmon = Read_DATA();
SendDATA(1);
ryr = Read_DATA();
while((IFG2&URXIFG1)==0);
//delay_spi(600);
P5OUT_bit.P5=1;
}
// 时钟模块初始化配置
#include "HardWare.h"
/*******************************************************************************
* 系统时钟的初始化
*******************************************************************************/
void InitClock(void)
{
unsigned int i;
BCSCTL1 &= ~(XT2OFF + XTS); //启动XT2晶振,LFXT1选择低频模式
BCSCTL1 |= DIVA_0; //ACLK 不分频
do //等待时钟源转换完成
{
IFG1 &= ~OFIFG; //清OSCFault标志
for(i=100;i>0;i--);
}while((IFG1 & OFIFG)!=0); //查OSCFault,为0时转换完成
//BCSCTL2 |= SELM_2 + SELS + DIVS_3; //MCLK为XT2不分频; SMCLK为XT2,8分频
BCSCTL2 |= SELM_2 + SELS; ////MCLK为XT2不分频; SMCLK为XT2,不分频,8MHz
}
/*******************************************************************************
* GPIO的初始化
*******************************************************************************/
void InitGPIO(void)
{
//1-wire器件对应的IO
P2SEL = 0X00; //P2口全部设为普通IO
P2DIR = 0XFF; //P2为输出
P2OUT = 0XFF; //P2输出为1
P4SEL &= ~0X20; //报警口设置
P4DIR |= 0X20;
P4OUT_bit.P5 = 1;
P1SEL_bit.P1 = 0; //作为普通IO口
P1DIR_bit.P1 = 0; //input
//P1OUT_bit.P1 = 1;
}
main函数
#include "HardWare.h"
#include "io430.h"
#include "SPI.h"
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
InitClock();
InitGPIO();
SPI1_Init();
__enable_interrupt();
SetTime() ;
delay_spi(600);
DS1390Communication() ;
}
原理连接图在下方
此帖出自
小平头技术问答
我也没看出来他咋判断的
一周热门 更多>