当前位置:首页 > 测试测量 > 测试测量
[导读]前 言  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

  这些汇编语句所占用的时间可以计算成公式: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); /*返回应答信号 */
}
/* 从传感器中读一个字节 */
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的结合使用方法,其区别主要是在端口的操作上和延时的控制上。

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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭