24小时热门版块排行榜    

Znn3bq.jpeg
汕头大学海洋科学接受调剂
查看: 216  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 人工智能320调剂08工类还有机会吗 +15 振—TZ 2026-04-10 16/800 2026-04-13 14:11 by 张zhihao
[考研] 290求调剂 +18 柯淮然 2026-04-12 20/1000 2026-04-13 12:56 by cyh—315
[考研] 一志愿085802 323分求调剂 +13 drizzle_9 2026-04-12 14/700 2026-04-13 10:26 by Faiz5552
[考研] 0831一轮调剂失败求助 +10 小熊睿睿_s 2026-04-11 10/500 2026-04-12 22:43 by 长弓傲
[考研] 求调剂,262机械专硕 +8 嗯yyl 2026-04-08 8/400 2026-04-12 02:31 by 秋豆菜芽
[找工作] 山东高校教师考核超级无底线,员工过不下去啦 +4 qut2026 2026-04-09 9/450 2026-04-12 00:54 by qut2026
[教师之家] 请问地理、遥感方面,可以做哪些横向项目啊,纵向完不成考核啊 +3 锦衣卫寒战 2026-04-07 5/250 2026-04-11 20:51 by 豫椒
[考研] 352 求调剂 +6 yzion 2026-04-11 8/400 2026-04-11 16:24 by 明月此时有
[考研] 085501机械专硕 302分 不挑专业求调剂 +7 汪某. 2026-04-09 7/350 2026-04-11 14:37 by luhong1990
[考研] 296求调剂 +6 汪!?! 2026-04-09 6/300 2026-04-11 11:25 by zhq0425
[考研] 085410-273求调剂 +6 X1999 2026-04-10 6/300 2026-04-11 10:32 by Delta2012
[考研] 297求调剂 +9 Kwgyz 2026-04-09 9/450 2026-04-11 10:09 by zhq0425
[考研] 284求调剂 +12 archer.. 2026-04-10 13/650 2026-04-11 08:44 by zhq0425
[考研] 342电子信息专硕求调剂 +9 你让我怎么荔枝 2026-04-10 10/500 2026-04-11 08:33 by zhq0425
[考研] 282,电气工程专业,求调剂,不挑专业 +9 jggshjkkm 2026-04-10 9/450 2026-04-10 14:55 by 逆水乘风
[考研] 344求调剂 +7 丶风雪夜归人丶 2026-04-09 7/350 2026-04-10 12:05 by pengliang8036
[考研] 一志愿中南大学物理学,英一66,求调剂 +4 长烟旖旎 2026-04-08 5/250 2026-04-10 10:31 by 颖果儿
[考研] 初试分332,一志愿报考西北工业大学, +11 故人?? 2026-04-09 11/550 2026-04-09 21:54 by JineShine
[考研] 286求调剂 +19 Faune 2026-04-08 20/1000 2026-04-09 08:36 by 哦哦123
[考研] 软工学硕299求调剂 +6 useryy 2026-04-07 6/300 2026-04-07 09:50 by vgtyfty
信息提示
请填处理意见