24小时热门版块排行榜    

CyRhmU.jpeg
查看: 203  |  回复: 0
当前主题已经存档。

czxjuren

金虫 (小有名气)

[交流] msp430读写ds1991问题

我写的ds1991读写程序,在51单片机测试过,能正常读写。可用到msp430f2131为啥就不行了呢?
是指令执行的周期引起的吗?
51我用的12M晶振,程序注释中的时间是在51中仿真测试出来的。
51的12M经过12分频后是1M,为了延长同样长的时间,我在430程序中将MCLK配置成1M了,
请问在430中是不是也延长了这么多时间呀?如果不是要延时这么长时间,怎么实现?
我的程序如下:
//******************************************************************************
//  MSP430x2xx Demo - Software Toggle P1.0
//
//  Description; Toggle P1.0 by xor'ing P1.0 inside of a software loop.
//  ACLK = n/a, MCLK = SMCLK = default DCO
//
//                MSP430x2xx
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            |             P1.0|-->LED
//
//  A. Dannenberg
//  Texas Instruments, Inc
//  January 2006
//  Built with IAR Embedded Workbench Version: 3.40A
//******************************************************************************
#include "msp430x20x1.h"

#define  TM_OUT(level)       P2OUT = ((unsigned int)level) ? (P2IN|BIT4) : (P2IN&~BIT4)
#define  TM_DIR(level)       P2DIR = ((unsigned int)level) ? (P2DIR|BIT4) : (P2DIR&~BIT4)
#define  TM_IN               (P2IN&BIT4)
/******************************
函数功能:测试DS1991是否在线
           DS1991在线则返回1,
           否则返回0
********************************/
unsigned char rest(void)
{
unsigned char i;
unsigned char k=0;
TM_DIR(1);
TM_OUT(0);
for(i=0;i<170;i++);   //512us   //发复位低脉冲tRSTL>80us
  TM_OUT(1);                          //释放总线,等待上拉电阻将总线恢复高电平tPDH=5us~60us
for(i=0;i<1;i++);   //5us
i=0;TM_DIR(0);
do              //等待对方返回低脉冲, tPDL=60us~240us
{
    if(TM_IN==0)
     {
       k=1;
       for(i=0;i<15;i++);   //47us
       i=0;
       do
       {
        if(TM_IN==1)        //等待对方恢复高电平
        break;
       }while(i++<40);
      TM_DIR(1);
      TM_OUT(1);
      for(i=0;i<135;i++);   //482us
      break;
     }

}
while(i++<55);    //530us
TM_DIR(1);
      TM_OUT(1);
for(i=0;i<5;i++);   //27us
return k;

}
/******************************
函数功能:DS1991写数据
           *byte1为数据指针,
           num表示写的数据个数
********************************/
void wrbyte(unsigned char *byte1,unsigned char num)
{
unsigned char i,j,k,byte,temp;
for(k=0;k {
   byte=*(byte1+k);
   for(j=0;j<8;j++)
    {
     temp=(byte>>j)&0x01;  //14us
     TM_OUT(0);  //1us
     i=0; //2us    //总线值低电平tLow1=1us~15us   
     TM_OUT(temp);
     //TM=temp;   //4us//写周期TH=60us-tLow1, 对方在检测到总线=0开始15us后,将总线采样写入
     for(i=0;i<30;i++);   //91us
     TM_OUT(1);
     for(i=0;i<1;i++);   //5us
   }
}
}
/******************************
函数功能:DS1991读数据
           num表示读的数据个数
           函数返回指针
********************************/
unsigned char *rbyte(unsigned char num)
{
unsigned char i,j,k,byte1=0,byte2=0;
unsigned char *pp,temp[8];
for(k=0;k {
    for(j=0;j<8;j++)
     {
      TM_OUT(0);      //总线值低电平tSu<1us
      i=0; //2us      
      TM_OUT(1);       //等待总线数据到达tLOW=1us~15us
      i=1; //2us
      i=2; //2us
      i=0;i=3;i=8;i=9;i=0;TM_DIR(0);
      byte2=(unsigned char)(TM_IN);   //采样周期,对方在检测到总线=0开始15us后,将数据放在总线上,持续时间0~45us
                                   //然后释放总线,总时间共60us-TL.
      byte2=byte2<<7;
      byte1=byte1>>1;
      byte1=byte1|byte2;
      byte2=0;
     for(i=0;i<16;i++);   //40us
     TM_DIR(1); TM_OUT(1);
     for(i=0;i<1;i++);   //5us
     }
     temp[k]=byte1;
  }
  pp=temp;
  return pp;
}

void main(void)
{
  unsigned int i;
  unsigned char  *pp,temp[8]={0};
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  BCSCTL1=CALBC1_1MHZ;                 //将MCLK配置成1M
  DCOCTL=CALDCO_1MHZ;
  for (;
  {
    for(;
    {     
     i=rest();            //测试DS1991是否在线,在线则跳出循环
     if(i==1){break;}
    }
                              
    /////////////  读取8 位家族码48 位唯一的序列号和8 位CRC 校验码
    temp[0]=0x33;
    wrbyte(temp,1);
    pp=rbyte(0x8);
    for(i=0;i<8;i++)
    temp=*(pp+i);

   if(temp[0]==0x02)     //ds1991家族码为02
   {
     i=rest();
   temp[0]=0xcc;     //Skip ROM
   wrbyte(temp,1);
   temp[0]=0x96;temp[1]=0xc0;temp[2]=(0xff-temp[1]);  //Write Scratchpad [96H]
   wrbyte(temp,3);
   temp[0]=0x32;
   wrbyte(temp,1);
    i=rest();
   
   ////////////////////
   i=rest();
   temp[0]=0xcc;
   wrbyte(temp,1);
   temp[0]=0x69;temp[1]=0xc0;temp[2]=(0xff-temp[1]); // Read Scratchpad [69H]
   wrbyte(temp,3);
   pp=rbyte(0x2);
    for(i=0;i<2;i++)
    temp=*(pp+i);
    i=rest();
    i=9;
   }  
   
     
  }
  
}
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 czxjuren 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见