24小时热门版块排行榜    

查看: 212  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 299求调剂 +5 某某某某位 2026-03-21 5/250 2026-03-23 23:36 by 热情沙漠
[考研] 291求调剂 +8 hhhhxn.. 2026-03-23 8/400 2026-03-23 23:15 by peike
[考研] 265求调剂 +10 梁梁校校 2026-03-17 10/500 2026-03-23 21:17 by 一切OK
[基金申请] 请教下大家 2026年国家基金申请是双盲审吗? +3 lishucheng1 2026-03-22 4/200 2026-03-23 20:48 by god_tian
[考研] 328求调剂,英语六级551,有科研经历 +7 生物工程调剂 2026-03-17 12/600 2026-03-23 18:18 by YMU施老师
[考研] 一志愿南京理工大学085701资源与环境302分求调剂 +5 葵梓卫队 2026-03-18 7/350 2026-03-23 16:26 by lingjue
[考研] 0854电子信息求调剂 324 +3 Promise-jyl 2026-03-23 3/150 2026-03-23 13:43 by wangkm
[考研] 317求调剂 +12 申子申申 2026-03-19 18/900 2026-03-22 22:23 by luoyongfeng
[考研] 293求调剂 +3 涛涛Wjt 2026-03-22 5/250 2026-03-22 22:21 by jiangpengfei
[考研] 一志愿华中农业071010,总分320求调剂 +5 困困困困坤坤 2026-03-20 6/300 2026-03-22 17:41 by hxsm
[考研] 308求调剂 +3 墨墨漠 2026-03-21 3/150 2026-03-22 16:54 by i_cooler
[考研] 一志愿 西北大学 ,070300化学学硕,总分287,双非一本,求调剂。 +3 晨昏线与星海 2026-03-20 3/150 2026-03-22 16:00 by ColorlessPI
[考研] 275求调剂 +6 shansx 2026-03-22 8/400 2026-03-22 15:27 by barlinike
[考研] 材料学硕333求调剂 +3 北道巷 2026-03-18 3/150 2026-03-21 18:17 by 学员8dgXkO
[考研] 307求调剂 +3 余意卿 2026-03-18 3/150 2026-03-21 17:31 by ColorlessPI
[考研] 0805材料320求调剂 +3 深海物语 2026-03-20 3/150 2026-03-21 15:46 by 无际的草原
[考研] 化学求调剂 +4 临泽境llllll 2026-03-17 5/250 2026-03-21 02:23 by JourneyLucky
[考研] 295求调剂 +4 一志愿京区211 2026-03-18 6/300 2026-03-20 23:41 by JourneyLucky
[考研] 一志愿南昌大学,327分,材料与化工085600 +9 Ncdx123456 2026-03-19 9/450 2026-03-20 23:41 by lovewei0727
[考研] 求调剂 +3 @taotao 2026-03-20 3/150 2026-03-20 19:35 by JourneyLucky
信息提示
请填处理意见