程序如下:
#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() ;
}
原理连接图在下方
此帖出自
小平头技术问答
发送和接收的数据不一致
我的意思是你的这个判断发送和接受的数据不一致是靠显示数据来判断还是怎么样的方式呢
哦哦,你的意思是读取和接收的数据都是0 ?硬件电路有问题吗?
一周热门 更多>