24小时热门版块排行榜    

Znn3bq.jpeg
汕头大学海洋科学接受调剂
查看: 217  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 26药学专硕105500求调剂 +6 喽哈加油 2026-04-13 6/300 2026-04-14 16:40 by zhouxiaoyu
[考研] 复试调剂 +18 积极向上; 2026-04-10 20/1000 2026-04-14 16:11 by zs92450
[考研] 一志愿西南大学生物学学硕344 求生物学相关调剂/生物与医药 +8 超人不会飞@ 2026-04-08 8/400 2026-04-14 16:06 by zs92450
[考研] 求调剂 +20 MAX怅惘 2026-04-09 22/1100 2026-04-14 14:57 by 独醉梦孤城
[考研] 302求调剂 +10 易!? 2026-04-13 10/500 2026-04-13 19:04 by lbsjt
[考研] 考研二轮调剂 +10 故人?? 2026-04-09 10/500 2026-04-13 09:55 by szhize
[考研] 求调剂288 +7 ioodiiij 2026-04-10 9/450 2026-04-13 08:33 by Hayaay
[考研] 求调剂 +16 张番茄不炒蛋 2026-04-10 17/850 2026-04-12 13:58 by 熬夜成!
[考研] 本科南方医科大学 一志愿985 药学学硕284分 求调剂 +5 弱水听文 2026-04-09 5/250 2026-04-12 13:16 by shengxi123
[考研] 326求调剂 +6 Shansyn 2026-04-10 6/300 2026-04-12 09:46 by hammer3
[考研] 求调剂,一志愿材料科学与工程985,365分, +8 材化李可 2026-04-11 10/500 2026-04-12 08:42 by 852137818
[考研] 求调剂 +6 archer.. 2026-04-09 8/400 2026-04-11 10:55 by zhq0425
[考研] 调剂 +19 小张ZA 2026-04-10 20/1000 2026-04-10 22:08 by 猪会飞
[考研] 083200 305分 求二轮调剂 不接受跨专业 +9 Claireyyyy 2026-04-09 10/500 2026-04-10 21:21 by Claireyyyy
[考研] 一志愿京区985,085401电子信息,本科电子信息 +3 阳光开朗的男孩 2026-04-10 3/150 2026-04-10 16:29 by sophia_93
[考研] 本科西工大 0856 324求调剂 +10 wysyjs25 2026-04-09 11/550 2026-04-10 08:37 by 5268321
[考博] 博士自荐 +7 可可小胖 2026-04-08 7/350 2026-04-10 08:28 by kimhero
[考研] 085601初试330分找调剂 +10 流心奶黄包l 2026-04-09 10/500 2026-04-10 08:14 by Sammy2
[考研] 083200 初试305分 求调剂 暂不考虑跨专业 +15 Claireyyyy 2026-04-09 15/750 2026-04-09 16:11 by zhuimr
[考研] 求调剂,现在还能填的 +3 上岸小莹加油 2026-04-08 3/150 2026-04-08 14:30 by zhq0425
信息提示
请填处理意见