当前位置:首页 > 电源 > 数字电源
[导读]前 言  DS18B2普遍都是和单片机配合使用,很少有关于DSP与DS18B20的连接的接口报道,所以此文详细介绍了TMS320LF2407与 DS18B20的连接方法,并且很详细的介绍了如何用C语言完成精确的软件延时,从而完成DS18B20与

前  言

  DS18B2普遍都是和单片机配合使用,很少有关于DSP与DS18B20的连接的接口报道,所以此文详细介绍了TMS320LF2407与 DS18B20的连接方法,并且很详细的介绍了如何用C语言完成精确的软件延时,从而完成DS18B20与TMS320LF2407之间的基于单线总线协议的数据通讯。

  1 DS18B20的时序

  1. 1  复位时序

  复位使用DS18B20时,首先需将其复位,然后才能执行其它命令。复位时,主机将数据线拉为低电平并保持480us~960us,然后释放数据线,再由上拉电阻将数据线拉高15~60us,等待DS18B20发出存在脉冲,存在脉冲有效时间为60~240us,这样,就完成了复位操作。

  1.2  写时序

  在主机对DS18B20写数据时,先将数据线置为高电平,再变为低电平,该低电平应大于1us。在数据线变为低电平后15us内,根据写“1”或写“0” 使数据线变高或继续为低。DS18B20将在数据线变成低电平后15us~60us内对数据线进行采样。要求写入DS18B20的数据持续时间应大于 60us而小于120us,两次写数据之间的时间间隔应大于1us。

  1.3  读时序

  读时隙当主机从DS18B20读数据时,主机先将数据线置为高电平,再变为低电平,该低电平应大于1us,然后释放数据线,使其变为高电平。DS18B20在数据线从高电平变为低电平的15us内将数据送到数据线上。主机可在15us后读取数据线.。

  2 TMS320LF2407与DS18B20的连接

  DS18B20有三个引脚。其与TMS320LF2407A的接线图如下。VDD管脚接5V电压给传感器供电。DQ管脚为数据线,与 TMS320LF2407A的IOPA6连接的同时,还要接一个4.7K的上拉电阻,并接到5V的电源上,使数据线在空闲状态下能自动上拉为高电平。 GND管脚接地。

  3 软件设计

  3.1 精确的软件定时的实现

  众所周知,TMS320LF2407的内核属于C2000系列的处理器,处理速度达到30MIPs,也就是每条指令所花的时间理论上只有33ns。但是实际情况是,由于DSP外部电路的数据处理速度和数据调用等因素,往往处理速度达不到这个数量级。那怎样测出每条指令的处理时间从而计算出软件延时程序的精确时间呢?计算方法如下:

  1、延时程序的C语言代码为:

  for(loopindex=0;loopindex
其中loopindex 为unsigned int,无符号整形数值, N为常量,根据所要求的延时时间,计算得出。具体算法在下面给出。

  2、这个for语句在CCS中的编译器编译后所产生的汇编语言为:

LACL #0h
SACL *, 0
LACL *
SUB N(计算得到的循环次数)
BCND 转移的地址,GEQ
LACC *, 0
ADD #1h
SACL *, 0
LACL *
SUB N(计算得到的循环次数)
BCND 转移的地址,LT[!--empirenews.page--]

  这些汇编语句所占用的时间可以计算成公式:DELAY=(9N+4)*单个指令周期。

  3、测试出一个指令周期

  系统所用晶振为20M,倍频以后的时钟频率为40M,定时器1的分频为1,也就是说定时器的计时周期为25ns。开启定时器,单步运行上面的汇编语句,看定时器每次运行后所增加的数值。测试得到,在每次单步运行占一个指令周期的汇编语句后,定时器的数值增加10。也就是说,每个单指令周期的指令占用的时间为:25ns*10=250ns,也就是0.25us。

  4、延时程序的最终计算公式为:

  DELAY =(9n+4)*0.25us。

  由公式可以看出,当n=0时,DELAY=1us,当n=65535时,DELAY= 150ms。

3.2 主要程序

  由于文章篇幅的关系,这里只给出复位程序、读字节程序和整个读温度的主程序,写命令字的程序可以根据上面所述的时序自行编写。

#define nop()   {asm( nop );}
#define DATA_PORT  PADATDIR
#define DATA_MODE  0x0040
#define  DATA_OUT   0x4000
#define  DATA_BIT   0x0040
#define PIN_HIGH()   {PADATDIR=PADATDIR|DATA_OUT|DATA_BIT;}
#define PIN_LOW()  {DATA_PORT=(PADATDIR|DATA_OUT)&(~DATA_BIT);}
#define PIN_LEAVE()  {DATA_PORT=DATA_PORT&(~DATA_OUT)|DATA_BIT;}
/* 传感器复位程序 */
unchar reset(void)
{  unchar retval;
unint loopindex="0";
    PIN_HIGH();
    nop();nop();nop();nop(); /* 延时1us*/
PIN_LOW();
for(loopindex=0;loopindex<213;loopindex++){;} /*置总线为低电平并保持至少480us */
PIN_HIGH();
for(loopindex=0;loopindex<26;loopindex++){;} /*等电阻拉高总线并保持15-60us */
PIN_LEAVE(); /*接受应答信号*/
nop();
if((DATA_PORT & DATA_BIT) == 0x0000)
{  retval = 0;  }
else
{  retval = 1;  }
PIN_HIGH();
    for(loopindex=0;loopindex<106;loopindex++){;} /*延时60-240us */
    return(retval); /*返回应答信号 */
}[!--empirenews.page--]
/* 从传感器中读一个字节 */
void read_byte(unchar *ReadByte)       
{
    int i;
    unchar temp="0";
unint loopindex="0";   
    PIN_HIGH();
    for(i=0;i<8;i++)
    {
        temp="temp">>1;
      PIN_LOW();
  nop();nop();nop();nop(); /*延时2us */
  nop();nop();nop();nop();
  PIN_HIGH();   
  for(loopindex=0;loopindex<6;loopindex++){;}  /* 延时14us */
  PIN_LEAVE();
  nop();
  if((DATA_PORT & DATA_BIT) == 0x0000)
  {   temp="temp" & 0x7F;  }
  else
  {   temp="temp" | 0x80;  }
  PIN_HIGH();
  for(loopindex=0;loopindex<26;loopindex++){;}   /* 延时60us */
    }                       
    *ReadByte=temp;
    return;
}
/* 将读得的温度转化为十进制 */
float transform(unchar *T)
{
unchar temp="0";
float temprature="0";
temp=temp|(*(T+1)<<8);
temp=temp|*T;
if((temp&0x0F800)==0x0F800)
{  temprature="0-"((~temp)+1)*0.0625; }
else
{  temprature="temp"*0.0625; } 
return(temprature);
}
/* 读取温度主函数,返回十进制温度数 */
float read_temp()
{
Unchar buff[2];
float temprature="0";
unint loopindex="0"; 
while (reset()==1){};      /* 复位等待从机应答 */
    write_byte(0xCC);         /* 忽略ROM匹配 */
    write_byte(0x44);          /* 发送温度转化命令 */
    for(loopindex=0;loopindex<65535;loopindex++){;}  /* 延时300ms,等待数模转换 */
for(loopindex=0;loopindex<65535;loopindex++){;}
while(reset()==1){};        /* 再次复位,等待从机应答 */
    write_byte(0xCC);         /* 忽略ROM匹配 */
    write_byte(0xBE);          /* 发送读温度命令 */
    read_byte(buff);           /* 读出温度低8位 */       
    read_byte(buff+1);         /* 读出温度高8位 */
    temprature="transform"(buff);
    PIN_HIGH();             /* 释放总线 */
return(temprature);
}

  4 结束语

  DS18B20是一款非常优秀的单总线数字式传感器。硬件设计简单,运行可靠。通过分析C语言编译后的汇编语言可以很明确的计算出软件延时的时间,从而满足单线总线通讯的时序要求,从而可以出色的完成DSP与DS18B20通讯的软件设计。

  5 本文创新点有两个:

  1、通过C编译器编译出来的相应的C语言的延时程序,从而得到其对应的汇编语言,再通过定时器计时,能够知道单指令周期的时间,从而能够精确的计算出软件延时程序的延时时间。

  2、通常DS18B20都是与单片机配合使用的,而本文则详细的介绍了DS18B20与DSP的结合使用方法,其区别主要是在端口的操作上和延时的控制上。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

美国纽约州阿蒙克2022年10月20日 /美通社/ -- IBM(NYSE: IBM)发布 2022 年第三季度业绩报告。 IBM 董事长兼首席执行官 Arvind Kri...

关键字: IBM 软件 BSP 云平台

成都2022年10月19日 /美通社/ -- 近期,平安养老险积极筹备个人养老金的产品设计和系统开发工作,发展多样化的养老金融产品,推动商业养老保险、个人养老金、专属商业养老保险等产品供给。 搭养老政策东风 ...

关键字: 温度 BSP 东风 大众

广东佛山2022年10月19日 /美通社/ -- 空间是人居生活的基础单元,承载着生存与活动的最基本功能。而对于理想空间的解构意义却在物理性容器之外,体现出人们对于空间和生活深层关系的思考,同时也塑造着人与空间的新型连接...

关键字: 温度 BSP 智能化 进程

上海2022年10月19日 /美通社/ -- 10月17日晚间,安集科技披露业绩预告。今年前三季度,公司预计实现营业收入7.54亿元至8.33亿元,同比增长60.24%至77.03%;归母净利润预计为1.73亿...

关键字: 电子 安集科技 BSP EPS

北京2022年10月19日 /美通社/ -- 10月18日,北京市经济和信息化局发布2022年度第一批北京市市级企业技术中心创建名单的通知,诺诚健华正式获得"北京市企业技术中心"认定。 北京市企业技...

关键字: BSP ARMA COM 代码

北京2022年10月18日 /美通社/ -- 10月14日,国际数据公司(IDC)发布《2022Q2中国软件定义存储及超融合市场研究报告》,报告显示:2022年上半年浪潮超融合销售额同比增长59.4%,近5倍于...

关键字: IDC BSP 数字化 数据中心

上海2022年10月18日 /美通社/ -- 2022年9月5日,是首都银行集团成立60周年的纪念日。趁着首都银行集团成立60周年与首都银行(中国)在华深耕经营12年的“大日子”,围绕作为外资金融机构对在华战略的构想和业...

关键字: 数字化 BSP 供应链 控制

东京2022年10月18日  /美通社/ -- NIPPON EXPRESS HOLDINGS株式会社(NIPPON EXPRESS HOLDINGS, INC.)旗下集团公司上海通运国际物流有限公司(Nipp...

关键字: 温控 精密仪器 半导体制造 BSP

广州2022年10月18日 /美通社/ -- 10月15日,第 132 届中国进出口商品交易会("广交会")于"云端"开幕。本届广交会上高新技术企业云集,展出的智能产品超过140,...

关键字: 中国智造 BSP 手机 CAN

要问机器人公司哪家强,波士顿动力绝对是其中的佼佼者。近来年该公司在机器人研发方面获得的一些成果令人印象深刻,比如其开发的机器人会后空翻,自主爬楼梯等。这不,波士顿动力又发布了其机器人组团跳男团舞的新视频,表演的机器人包括...

关键字: 机器人 BSP 工业机器人 现代汽车

数字电源

15504 篇文章

关注

发布文章

编辑精选

技术子站

关闭