| 查看: 203 | 回复: 0 | |||
| 当前主题已经存档。 | |||
[交流]
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; } } } |
» 猜你喜欢
到新单位后,换了新的研究方向,没有团队,持续积累2区以上论文,能申请到面上吗
已经有6人回复
2025冷门绝学什么时候出结果
已经有7人回复
请问有评职称,把科研教学业绩算分排序的高校吗
已经有6人回复
Bioresource Technology期刊,第一次返修的时候被退回好几次了
已经有7人回复
真诚求助:手里的省社科项目结项要求主持人一篇中文核心,有什么渠道能发核心吗
已经有8人回复
寻求一种能扛住强氧化性腐蚀性的容器密封件
已经有5人回复
请问哪里可以有青B申请的本子可以借鉴一下。
已经有4人回复
请问下大家为什么这个铃木偶联几乎不反应呢
已经有5人回复
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有4人回复
康复大学泰山学者周祺惠团队招收博士研究生
已经有6人回复














回复此楼