msp430F149与实时时钟(RTC)芯片DS1390的spi通信 读取和接收数据不对

2019-03-24 10:06发布

程序如下:
#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() ;
}


原理连接图在下方












此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
huaiqiao
2019-03-24 19:05
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章