历史上的今天
返回首页

历史上的今天

今天是:2024年12月17日(星期二)

正在发生

2019年12月17日 | DS18B20时序分析详细步骤

2019-12-17 来源:eefocus

  1、过程1、2是初始化过程,每次读取都要初始化,否则18b20处于待机状态,无法成功读取。过程1:拉低信号线480-700us,使它复位,然后释放总线15-60us,18b20会拉低总线60-240us,然后它释放总线。所以初始化成功的一个标志就是能否读到18b20这个先低后高的操作时序。


  (注意:黑色部分表示主机操作,蓝色部分表示18b20操作,每次主机操作完成之后等待18b20状态时,必须要释放总线,比如将IO设置为高阻态什么的。否则18B20没法把状态写到线上)


  2、过程3、4是写1bit数据过程。过程3是写0 ,过程4是写1。过程3:拉低总线60us,然后抬高总线5us,完成。过程4:拉低总线5us,然后抬高总线60us,完成


  3、过程5、6是读1bit过程。过程5是读0,过程6是读1。过程5、6:拉低总线5us,然后释放总线,读取总线,如果为0,则读入0,如果为1,则读入1。


  DS18B20时序


  初始化序列——复位和存在脉冲


  DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。下图(插图13,即如下截图)阐述了这一点。当发出应答复位脉冲的存在脉冲后,DS18B20通知主机它在总线上并且准备好操作了。

  在初始化步骤中,总线上的主机通过拉低单总线至少480μs来产生复位脉冲。然后总线主机释放总线并进入接收模式。


  当总线释放后,5kΩ的上拉电阻把单总线上的电平拉回高电平。当DS18B20检测到上升沿后等待15到60us,然后以拉低总线60-240us的方式发出存在脉冲。


  如文档所述,主机将总线拉低最短480us,之后释放总线。由于5kΩ上拉电阻的作用,总线恢复到高电平。DS18B20检测到上升沿后等待15到60us,发出存在脉冲:拉低总线60-240us。至此,初始化和存在时序完毕。


  根据上述要求编写的复位函数为:


  首先是延时函数:(由于DS18B20延时均以15us为单位,故编写了延时单位为15us的延时函数,注意:以下延时函数晶振为12MHz)


  /*


  ************************************


  函数:Delayxus_DS18B20


  功能:DS18B20延时函数


  参数:t为定时时间长度


  返回:无


  说明: 延时公式:15n+15(近似),晶振12Mhz


  ******************************************


  */


  voidDelayxus_DS18B20(unsigned int t)


  {


  for(t;t>0;t--)


  {


  _nop_();_nop_();_nop_();_nop_();


  }


  _nop_(); _nop_();


  }


  延时函数反汇编代码(方便分析延时公式)


  C:0x0031 7F01 MOV R7,#0x01


  C:0x0033 7E00 MOV R6,#0x00


  C:0x0035 1206A6 LCALLdelayxus(C:06A6)


  38: voidDelayxus_DS18B20(unsigned int t)


  39: {


  40: for(t;t>0;t--)


  C:0x06A6 D3 SETB C


  C:0x06A7 EF MOV A,R7


  C:0x06A8 9400 SUBB A,#0x00


  C:0x06AA EE MOV A,R6


  C:0x06AB 9400 SUBB A,#0x00


  C:0x06AD 400B JC C:06BA


  41: {


  42:_nop_();_nop_();_nop_();_nop_();


  C:0x06AF 00 NOP


  C:0x06B0 00 NOP


  C:0x06B1 00 NOP


  C:0x06B2 00 NOP


  43: }


  C:0x06B3 EF MOV A,R7


  C:0x06B4 1F DEC R7


  C:0x06B5 70EF JNZDelayxus_DS18B20 (C:06A6)


  C:0x06B7 1E DEC R6


  C:0x06B8 80EC SJMPDelayxus_DS18B20 (C:06A6)


  44: _nop_(); _nop_();


  C:0x06BA 00 NOP


  C:0x06BB 00 NOP


  45: }


  C:0x06BC 22 RET


  分析上述反汇编代码,可知延时公式为15*(t+1)


  /*


  ************************************


  函数:RST_DS18B20


  功能:复位DS18B20,读取存在脉冲并返回


  参数:无


  返回:1:复位成功 ;0:复位失败


  说明: 拉低总线至少480us ;可用于检测DS18B20工作是否正常


  ******************************************


  */


  bit RST_DS18B20()


  {


  bit ret="1";


  DQ=0;/*拉低总线 */


  Delayxus_DS18B20(32);/*为保险起见,延时495us */


  DQ=1;/*释放总线 ,DS18B20检测到上升沿后会发送存在脉冲*/


  Delayxus_DS18B20(4);/*需要等待15~60us,这里延时75us后可以保证接受到的是存在脉冲(如果通信正常的话) */


  ret=DQ;


  Delayxus_DS18B20(14);/*延时495us,让ds18b20释放总线,避免影响到下一步的操作 */


  DQ=1;/*释放总线 */


  return(~ret);


  }


  写时序:


  主机在写时隙向DS18B20写入数据,并在读时隙从DS18B20读入数据。在单总线上每个时隙只传送一位数据。


  写时间隙


  有两种写时隙:写“0”时间隙和写“1”时间隙。总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0.所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。两种写时隙都通过主机拉低总线产生(见插图14)。

  为产生写1时隙,在拉低总线后主机必须在15μs内释放总线。在总线被释放后,由于5kΩ上拉电阻的作用,总线恢复为高电平。为产生写0时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。


  在主机产生写时隙后,DS18B20会在其后的15到60us的一个时间窗口内采样单总线。在采样的时间窗口内,如果总线为高电平,主机会向DS18B20写入1;如果总线为低电平,主机会向DS18B20写入0。


  如文档所述,所有的写时隙必须至少有60us的持续时间。相邻两个写时隙必须要有最少1us的恢复时间。所有的写时隙(写0和写1)都由拉低总线产生。


  为产生写1时隙,在拉低总线后主机必须在15us内释放总线(拉低的电平要持续至少1us)。由于上拉电阻的作用,总线电平恢复为高电平,直到完成写时隙。


  为产生写0时隙,在拉低总线后主机持续拉低总线即可,直到写时隙完成后释放总线(持续时间60-120us)。


  写时隙产生后,DS18B20会在产生后的15到60us的时间内采样总线,以此来确定写0还是写1。


  满足上述要求的写函数为:


  /*


  ************************************


  函数:WR_Bit


  功能:向DS18B20写一位数据


  参数:i为待写的位


  返回:无


  说明: 总线从高拉到低产生写时序


  ******************************************


  */


  void WR_Bit(bit i)


  {


  DQ=0;//产生写时序


  _nop_();


  _nop_();//总线拉低持续时间要大于1us


  DQ=i;//写数据 ,0和1均可


  Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取


  DQ=1;//释放总线


  }


  /*


  ***********************************


  函数:WR_Byte


  功能:DS18B20写字节函数,先写最低位


  参数:dat为待写的字节数据


  返回:无


  说明:无


  ******************************************


  */


  void WR_Byte(unsigned chardat)


  {


  unsigned chari="0";


  while(i++<8)


  {


  WR_Bit(dat&0x01);//从最低位写起


  dat>>=1; //注意不要写成dat>>1


  }


  }


  读时序:


  DS18B20只有在主机发出读时隙后才会向主机发送数据。因此,在发出读暂存器命令 [BEh]或读电源命令[B4h]后,主机必须立即产生读时隙以便DS18B20提供所需数据。另外,主机可在发出温度转换命令T [44h]或Recall命令E 2[B8h]后产生读时隙,以便了解操作的状态(在 DS18B20操作指令这一节会详细解释)。


  所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。在主机产生读时隙后,DS18B20开始发送0或1到总线上。DS18B20让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。因此,主机释放总线和采样总线等动作要在15μs内完成。


  插图15表明了对于读时隙,TINIT(下降沿后低电平持续时间), TRC(上升沿)和TSAMPLE(主机采样总线)的时间和要在15μs以内。


  插图16显示了最大化系统时间宽限的方法:让TINIT 和TRC尽可能的短,把主机采样总线放到15μs这一时间段的尾部。

  由文档可知,DS18B20只有在主机发出读时隙时才能发送数据到主机。因此,主机必须在BE命令,B4命令后立即产生读时隙以使DS18B20提供相应的数据。另外,在44命令,B8命令后也要产生读时隙。


  所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。DS18B20输出的数据在下降沿产生后15us后有效。因此,释放总线和主机采样总线等动作要在15us内完成。


  满足以上要求的函数为:


  /*


  ***********************************


  函数:Read_Bit


  功能:向DS18B20读一位数据


  参数:无


  返回:bit i


  说明: 总线从高拉到低,持续至1us以上,再释放总线为高电平空闲状态产生读时序


  ******************************************


  */


  unsigned char Read_Bit()


  {


  unsigned char ret;


  DQ=0;//拉低总线


  _nop_(); _nop_();


  DQ=1;//释放总线


  _nop_(); _nop_();


  _nop_(); _nop_();


  ret=DQ;//读时隙产生7 us后读取总线数据。把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性


  Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求


  DQ=1;//释放总线


  return ret; //返回读取到的数据


  }


  /*


  ************************************


  函数:Read_Byte


  功能:DS18B20读一个字节函数,先读最低位


  参数:无


  返回:读取的一字节数据


  说明: 无


  ******************************************


  */


  unsigned char Read_Byte()


  {


  unsigned char i;


  unsigned chardat="0";


  for(i=0;i<8;i++)


  {


  dat>>=1;//先读最低位


  if(Read_Bit())


  dat|=0x80;


  }


  return(dat);


  }


  /*


  ************************************


  函数:Start_DS18B20


  功能:启动温度转换


  参数:无


  返回:无


  说明: 复位后写44H命令


  ******************************************


  */


  void Start_DS18B20()


  {


  DQ=1;


  RST_DS18B20();


  WR_Byte(0xcc);// skip


  WR_Byte(0x44);//启动温度转换


  }


  /*


  ************************************


  函数:Read_Tem


  功能:读取温度


  参数:无


  返回:int型温度数据,高八位为高八位温度数据,低八位为低八位温度数据


  说明: 复位后写BE命令


  ******************************************


  */


  int Read_Tem()


  {


  int tem="0";


  RST_DS18B20();


  WR_Byte(0xcc);// skip


  WR_Byte(0xbe);//发出读取命令


  tem=Read_Byte();//读出温度低八位


  tem|=(((int)Read_Byte())<<8);//读出温度高八位


  return tem;


  }


  注: DS18B20官方文档中没有说明读写数据位的顺序,查了下资料,DS18B20读写数据都是从最低位读写的。

推荐阅读

史海拾趣

Ho Chien Electronics Group Inc公司的发展小趣事

Ho Chien Electronics Group Inc公司发展故事

故事一:创立与全球化布局

Ho Chien Electronics Group Inc.(以下简称“Ho Chien”)创立于1974年,其全球总部位于美国波士顿。自成立以来,Ho Chien迅速在全球范围内扩展其业务,先后在中国、新加坡、德国、巴西、加拿大和墨西哥等地设立了超过40个分部。这一布局不仅加强了公司的市场渗透力,还为其提供了丰富的资源支持,助力其在电子行业细分市场中稳步前行。Ho Chien特别专注于互连与机电产品领域,通过为原始设备制造商和合约制造商提供高质量的产品和服务,逐步在行业内建立了良好的声誉。

故事二:亚太市场的拓展

2012年12月,Ho Chien正式启动其亚太业务,并将亚太区总部设在香港。为了更好地服务亚太地区的客户,Ho Chien不仅设立了销售部,还构建了区域配送中心和增值服务中心。经过数年的努力,Ho Chien亚太区已开设24个分部和3处仓库,极大地提升了其在该地区的运营效率和服务质量。这一举措不仅加深了Ho Chien在亚太市场的影响力,还为其未来的全球扩张奠定了坚实的基础。

故事三:产品线的丰富与拓展

Ho Chien致力于为电子行业各细分市场的客户提供全面支持,其产品线涵盖了25个不同元器件类别。主要分销产品包括互连器件、继电器、风扇、开关、散热解决方案、套管和线束产品、晶体与振荡器、紧固件与五金件以及传感器等。随着市场的不断变化和技术的飞速发展,Ho Chien不断调整和优化其产品线,以满足客户日益增长的需求。这一策略不仅帮助Ho Chien保持了其在行业内的竞争力,还为其带来了稳定的收入来源。

故事四:创新与研发

作为电子行业的领军企业之一,Ho Chien深知创新对于公司发展的重要性。因此,公司不断加大在研发方面的投入,致力于新技术、新产品的开发和应用。通过引进先进的研发设备和优秀人才,Ho Chien在多个领域取得了重大突破,并成功推出了一系列具有自主知识产权的产品。这些创新成果不仅提升了Ho Chien的品牌价值,还为其在全球市场上的拓展提供了有力支持。

故事五:人才培养与企业文化

在快速发展的过程中,Ho Chien深刻认识到人才对于公司持续发展的关键作用。因此,公司始终坚持“以员工为中心”的管理思想,努力为员工创造宽松的工作氛围和良好的发展机会。Ho Chien不仅提供优厚的福利待遇和丰富的培训资源,还鼓励员工积极发挥自己的才华和潜能。在这种企业文化的影响下,Ho Chien汇聚了一大批优秀的专业人才和管理精英,为公司的快速发展提供了强有力的智力支持。同时,这种积极向上的企业文化也进一步提升了Ho Chien的品牌形象和社会影响力。

GSG公司的发展小趣事
智能压力测量电路采用先进的传感器技术和数字信号处理算法,能够实现更高的测量精度。
Amptek Inc公司的发展小趣事
检查传感器是否受到污染或损坏,信号调理电路是否发生漂移,以及是否需要进行重新校准。
FINDER公司的发展小趣事
检查通信接口是否连接正确,通信协议是否匹配,以及通信线路是否受到干扰或损坏。
Allied Electronic & Semiconductor Technology Inc公司的发展小趣事

随着国内市场的饱和,AE&ST公司开始将目光投向全球。公司积极寻找国际合作伙伴,拓展海外市场。在一次国际电子展上,AE&ST与一家欧洲知名电子公司达成了战略合作协议。双方共同研发了一款针对欧洲市场的特色产品,并成功打开了欧洲市场的大门。此后,AE&ST公司不断深化与国际伙伴的合作,逐步实现了全球化布局。

上海如韵(CONSONANCE)公司的发展小趣事

随着市场需求的不断变化,如韵意识到技术创新是企业持续发展的关键。因此,公司投入大量资源进行产品研发和技术升级。其中,一次重要的技术突破让如韵在行业内声名鹊起。

当时,市场上的某种电子元器件存在性能不稳定的问题,给许多电子设备制造商带来了困扰。如韵的研发团队经过深入研究,成功开发出了一种新型电子元器件,不仅性能稳定可靠,而且成本更低。这一创新产品迅速占领了市场份额,成为公司的明星产品,也为如韵带来了丰厚的经济回报。

问答坊 | AI 解惑

用MAX712芯片自制的充电器

一、线路图:   1、rsense电阻取1欧姆时。充电电流为250MA,0.5欧姆时,电流为520MA,2N6109用TIP42代替,SHUNT电阻为限流电阻,大约1K,其他参数如图。   转绢流后充电机充电电流是原来的1/8还是1/16取决于PGM3脚的接法:   Rsense电阻两 ...…

查看全部问答>

vb程序调试正常运行错误

本人刚学VB,在写一个串口数据采集大的小软件,刚开始就遇到了问题,以下代码,我在调试时都正常运行,能正确获得返回数据,可是生成exe文件后,程序却没反应,也没有错误信息出现!就是没有数据,求高手帮忙! Public gSend As Boolean  &nb ...…

查看全部问答>

ARM9的ADC怎么和外部电路连接

请问ARM9的ADC怎么和外部的放大电路连接?…

查看全部问答>

quartus功能仿真出现致命错误。 Fatal error: Module: quartus_sim.exe Exception: Access Violat

*** Fatal error: Module: quartus_sim.exe Exception: Access Violation Stack Trace: 01a314e6: SDB_DFF_INFO::set_last_clock_value() + 0x34 (tsm_sdb) 01a03144: EDS_ENGINE::propagate() + 0xb0 (TSM_EDS) 01a03321: EDS_ENGINE::propaga ...…

查看全部问答>

请问

刚涉足这个领域,要配硬件环境,不知道哪个开发语言好呢.…

查看全部问答>

FTF印象_4

名字很有吸引力的一个报告(Designint the \"impossible\" Tablet),但不知道什么原因而取消未能进行, 可以通过资料看看是介绍什么的。…

查看全部问答>

关于LED驱动电源的谐波测试必备

杭州远方PF9811,才两千多块钱; 2-50次谐波都能测出来; 按IEC61000-3-2,谐波要测到39次…

查看全部问答>

LM4871/CSC8002低电压3W功率放大器IC应用电路原理图说明

LM4871/CSC8002 是一个BTL 桥连接的音频功率放大器.它能够在5V 电源电压下给一个3Ω 负载提供THD 小于10%、平均值为3W 输出功率。在关闭模式下电流的典型值为0.6uA. LM4871/CSC8002 是为提供大功率,高保真音频输出而专门设计的.它仅仅需要少量 ...…

查看全部问答>

TPM驱动可以在ucosii下吗?

最近在研究将TPM(安全模块)应用到ARM7上,要在ucosii里添加TPM的驱动,但是现在都是linux下的驱动。有没有大侠可以指点下,可以在ucosii中加TPM的驱动吗?…

查看全部问答>