打印

msp430f149读写ds1302遇到的问题

[复制链接]
2483|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小菜小菜|  楼主 | 2013-1-1 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小菜小菜 于 2013-1-2 12:19 编辑

小弟刚接触msp430很多地方不懂,望高手指点
msp430f149读写ds1302程序如下:
#include <msp430f149.h>
typedef unsigned char uchar;
typedef unsigned int  uint;

/**************宏定义***************/
#define DS_SCL  BIT0       //DS_SCL = P2.0
#define DS_SDA  BIT1      //DS_SDA = P2.1
#define DS_RST  BIT2        //DS_RST = P2.2
#define DS_RST_IN P2DIR &= ~DS_RST
#define DS_RST_OUT P2DIR |= DS_RST
#define DS_RST0 P2OUT &= ~DS_RST
#define DS_RST1 P2OUT |= DS_RST
#define DS_SCL_IN P2DIR &= ~DS_SCL
#define DS_SCL_OUT P2DIR |= DS_SCL
#define DS_SCL0 P2OUT &= ~DS_SCL
#define DS_SCL1 P2OUT |= DS_SCL
#define DS_SDA_IN P2DIR &= ~DS_SDA
#define DS_SDA_OUT P2DIR |= DS_SDA
#define DS_SDA0 P2OUT &= ~DS_SDA
#define DS_SDA1 P2OUT |= DS_SDA
#define DS_SDA_BIT P2IN & DS_SDA
void delay(unsigned int time);
void Reset_DS1302(void);
void Write1Byte(unsigned char wdata);
unsigned char Read1Byte(void);
void W_Data(unsigned char addr, unsigned char wdata);
unsigned char R_Data(unsigned char addr);
void Set_DS1302(unsigned char *ptr);
void Get_DS1302(unsigned char *ptr);



/*******************************************
函数名称:delay
功    能:延时一段时间
参    数:time--延时长度
返回值  :无
********************************************/
void delay(uint time)
{
    uint i;
    for(i = 0;i < time;i++)     _NOP();
}
/*******************************************
函数名称:Reset_DS1302
功    能:对DS1302进行复位操作
参    数:无
返回值  :无
********************************************/
void Reset_DS1302(void)
{
    DS_RST_OUT;  //RST对应的IO设置为输出状态
    DS_SCL_OUT;  //SCLK对应的IO设置为输出状态
    DS_SCL0;     //SCLK=0
    DS_RST0;     //RST=0
    delay(10);
    DS_SCL1;    //SCLK=1
}
/*******************************************
函数名称:Write1Byte
功    能:对DS1302写入1个字节的数据
参    数:wdata--写入的数据
返回值  :无
********************************************/
void Write1Byte(uchar wdata)
{
    uchar i;

    DS_SDA_OUT;     //SDA对应的IO设置为输出状态
    DS_RST1;        //REST=1;

    for(i = 8; i > 0; i--)
    {
        if(wdata&0x01)  DS_SDA1;
        else            DS_SDA0;
        DS_SCL0;
      
        delay(10);
        DS_SCL1;
        
        delay(10);
        wdata >>= 1;
    }
}
/*******************************************
函数名称:Read1Byte
功    能:从DS1302读出1个字节的数据
参    数:无
返回值  :读出的一个字节数据
********************************************/
uchar Read1Byte(void)
{
    uchar i;
    uchar rdata = 0X00;

    DS_SDA_IN;  //SDA对应的IO设置为输入状态
    DS_RST1;    //REST=1;

    for(i = 8; i > 0; i--)
    {
        DS_SCL1;
        delay(10);
      
        DS_SCL0;
      
         delay(10);
        rdata >>= 1;
        if(DS_SDA_BIT)  rdata |= 0x80;
    }
   
    return(rdata);
}
/*******************************************
函数名称:W_Data
功    能:向某个寄存器写入一个字节数据
参    数:addr--寄存器地址
          wdata--写入的数据
返回值  :无
********************************************/
void W_Data(uchar addr, uchar wdata)
{
    DS_RST0;
    DS_SCL0;   
    _NOP();
    DS_RST1;
    Write1Byte(addr);   //写入地址
    Write1Byte(wdata);  //写入数据
    DS_SCL1;
    DS_RST0;
}
/*******************************************
函数名称:R_Data
功    能:从某个寄存器读出一个字节数据
参    数:addr--寄存器地址
返回值  :读出的数据
********************************************/
uchar R_Data(uchar addr)
{
    uchar rdata;
   
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(addr);    //写入地址
    rdata = Read1Byte();  //读出数据
    DS_SCL1;
    DS_RST0;
   
    return(rdata);
}
/*******************************************
函数名称:BurstWrite1302
功    能:以burst方式向DS1302写入批量时间数据
参    数:ptr--指向时间数据存放地址的指针
返回值  :读出的数据
说    明:时间数据的存放格式是:
          秒,分,时,日,月,星期,年,控制
            【7个数据(BCD格式)+1个控制】
********************************************/
void BurstWrite1302(uchar *ptr)
{
    uchar i;
   
    W_Data(0x8e,0x00);      //允许写入     
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(0xbe);       // 0xbe:时钟多字节写入命令
    for (i = 8; i > 0; i--)
    {
        Write1Byte(*ptr++);
    }
    DS_SCL1;
    DS_RST0;
    W_Data(0x8e,0x80);      // 禁止写入
}
/*******************************************
函数名称:BurstRead1302
功    能:以burst方式从DS1302读出批量时间数据
参    数:ptr--指向存放时间数据地址的指针
返回值  :无
说    明:时间数据的存放格式是:
          秒,分,时,日,月,星期,年,控制
            【7个数据(BCD格式)+1个控制】
********************************************/
void BurstRead1302(uchar *ptr)
{
    uchar i;
  
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(0xbf);             //0xbf:时钟多字节读命令
    for (i = 8; i > 0; i--)
    {
       *ptr++ = Read1Byte();
    }
    DS_SCL1;
    DS_RST0;
}
/*******************************************
函数名称:BurstWriteRAM
功    能:以burst方式向DS1302的RAM中写入批量数据
参    数:ptr--指向存放数据地址的指针
返回值  :无
说明    :共写入31个字节的数据
********************************************/
void BurstWriteRAM(uchar *ptr)
{
    uchar i;
   
    W_Data(0x8e,0x00);         //允许写入
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(0xfe);          //0xfe:RAM多字节写命令
    for (i = 31; i>0; i--)     //RAM共有31个字节
    {
        Write1Byte(*ptr++);
    }
    DS_SCL1;
    DS_RST0;
    W_Data(0x8e,0x80);          //禁止写入
}
/*******************************************
函数名称:BurstReadRAM
功    能:以burst方式从DS1302的RAM中读出批量数据
参    数:ptr--指向数据存放地址的指针
返回值  :无
说明    :共读出31个字节的数据
********************************************/
void BurstReadRAM(uchar *ptr)
{
    uchar i;
  
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(0xff);             //0xff:RAM的多字节读命令
    for (i = 31; i > 0; i--)
    {
        
       *ptr++ = Read1Byte();   
      
    }
    DS_SCL1;
    DS_RST0;
}
/*******************************************
函数名称:Set_DS1302
功    能:设置DS1302内部的时间
参    数:ptr--指向存放数据地址的指针
返回值  :无
说明    :写入数据的格式:
            秒 分 时 日 月 星期 年  【共7个字节】
********************************************/
void Set_DS1302(uchar *ptr)
{
    uchar i;
    uchar addr = 0x80;
   
    W_Data(0x8e,0x00);    //允许写入
   
    for(i = 7;i > 0;i--)
    {
        W_Data(addr,*ptr++);
        addr += 2;
    }
    W_Data(0x8e,0x80);      //禁止
}
/********************************************************************
*
* 名称: Get_DS1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: R_Data(uchar addr)
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*******************************************
函数名称:Get_DS1302
功    能:读取DS1302内部的时间
参    数:ptr--指向数据存放地址的指针
返回值  :无
说明    :读出数据的格式:
            秒 分 时 日 月 星期 年  【共7个字节】
********************************************/
void Get_DS1302(uchar *ptr)
{
    uchar i;
    uchar addr = 0x81;
   
    for(i = 0;i < 7;i++)
    {
        ptr = R_Data(addr);
        addr += 2;
    }
}



void main(void)
{
   //秒,分,时,日,月,星期,年
  unsigned char wdata[7]={0x30,0x46,0x20,0x14,0x08,0x02,0x07};
  unsigned char rdata[7];
   P2DIR = 0XFF;  P2OUT = 0XFF;
   
    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
   
     /*------选择系统主时钟为8MHz-------*/
    BCSCTL1 &= ~XT2OFF;   //打开XT2高频晶体振荡器
    uchar i;

   do
   {
       IFG1 &= ~OFIFG;                 //清除晶振失败标志
       for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
   }
   while ((IFG1 & OFIFG)!=0);             //如果晶振失效标志存在
   BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振


    Reset_DS1302();
while(1)
  {
     
   
   /*****测试更改和读出时间*****/
    Set_DS1302(wdata);


    Get_DS1302(rdata);
   
    _NOP();         //在此处设置断点,观察rdata是否与wdata一致
   
}
  
}   

file:///C:/Documents%20and%20Settings/Administrator/桌面/1.png
  

相关帖子

沙发
xiaox314| | 2013-1-1 23:46 | 只看该作者
P2DIR=0XFF,是把P2设置成输出模式, P2OUT=0XFF是把P2口都置高

使用特权

评论回复
板凳
小菜小菜|  楼主 | 2013-1-2 12:23 | 只看该作者
xiaox314 发表于 2013-1-1 23:46
P2DIR=0XFF,是把P2设置成输出模式, P2OUT=0XFF是把P2口都置高

嗯,是的,这里应该没错吧

使用特权

评论回复
地板
wulitou| | 2013-8-2 17:43 | 只看该作者
lz问题是否解决?我最近也在调试这个芯片。读出的数据始终为0xff。写保护寄存器读出来的也是0xff不知道怎么回事?

使用特权

评论回复
5
小菜小菜|  楼主 | 2013-9-17 18:40 | 只看该作者
wulitou 发表于 2013-8-2 17:43
lz问题是否解决?我最近也在调试这个芯片。读出的数据始终为0xff。写保护寄存器读出来的也是0xff不知道怎么 ...

说来惭愧、本来用的是这个芯片,但是后来考虑到供电的问题,就改换SD2200了,就没再调这个

使用特权

评论回复
6
firstblood| | 2013-9-20 22:42 | 只看该作者
这个程序的也没多大难度的啊,网上都有很多的参照程序的,只是所用的单片机不一样的

使用特权

评论回复
7
木子不二| | 2013-9-23 18:30 | 只看该作者
wulitou 发表于 2013-8-2 17:43
lz问题是否解决?我最近也在调试这个芯片。读出的数据始终为0xff。写保护寄存器读出来的也是0xff不知道怎么 ...

这个一定是你的时序不对,在检查看看,

使用特权

评论回复
8
木子不二| | 2013-9-23 18:31 | 只看该作者
wulitou 发表于 2013-8-2 17:43
lz问题是否解决?我最近也在调试这个芯片。读出的数据始终为0xff。写保护寄存器读出来的也是0xff不知道怎么 ...

这个一定是你的时序不对,在检查看看,

使用特权

评论回复
9
dirtwillfly| | 2013-9-23 19:58 | 只看该作者
有条件的话,就用逻辑分析仪或者示波器看看时序,有时候又趁手的工具能省好多功夫

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
小菜小菜 + 1 赞一个!
10
gaochy1126| | 2013-9-23 23:20 | 只看该作者
延时的问题吧。

使用特权

评论回复
11
gaochy1126| | 2013-9-23 23:20 | 只看该作者
准确把握一下延时试试看的。

使用特权

评论回复
12
dirtwillfly| | 2013-9-24 20:42 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

5

帖子

0

粉丝