0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何配置微芯片PICmicro以实现1-Wire通信协议

星星科技指导员 来源:ADI 作者:ADI 2023-03-13 11:34 次阅读

Maxim的多款产品包含1-Wire通信接口,可用于各种应用。这些应用可能包括与Microchip流行的PICmicros(PIC)之一的接口。为了方便1-Wire器件与外设接口控制器(PIC)微控制器之间的简单接口,本应用笔记介绍了PIC微控制器的一般1-Wire软件例程,并解释了时序和相关细节。本应用笔记还提供了一个涵盖所有1-Wire例程的文件。此外,还包括汇编代码示例,该代码是专门为PIC16F628从DS2762高精度Li+电池监测器读取数据而编写的。

介绍

Microchip的PICmicro微控制器器件(PIC)已成为低功耗和低成本系统解决方案的热门设计选择。微控制器具有多个通用输入/输出(GPIO)引脚,可轻松配置为实现Maxim的1-Wire协议。1-Wire协议允许与许多Maxim器件进行交互,包括电池和热管理、存储器、iButton器件等。本应用笔记介绍了PIC1F16的一般628-Wire例程,并解释了时序和相关细节。为方便起见,所有材料均假定为4MHz时钟,该频率可用作许多PIC的内部时钟。本文档的附录A包含一个包含所有1-Wire例程的文件。附录B给出了一个示例汇编代码程序,用于PIC16F628从DS2762高精度Li+电池监测器读取数据。本应用笔记仅限于常规速度的1-Wire通信。®

常规宏

要以主机形式传输1-Wire协议,只需要两种GPIO状态:高阻抗和逻辑低电平。以下 PIC 程序集代码段实现这两种状态。PIC16F628有两个GPIO端口,PORTA和PORTB。任一端口都可以设置为1-Wire通信,但在本例中,使用PORTB。此外,以下代码假定汇编代码中配置了一个常量DQ,以指示PORTB中的哪个位是1-Wire引脚。在整个代码中,此位号简称为 DQ。在外部,该引脚必须通过上拉电阻连接到电源

    OW_HIZ:MACRO
      ;Force the DQ line into a high impedance state.
             BSF    STATUS,RP0                  ; Select Bank 1 of data memory
             BSF    TRISB, DQ                   ; Make DQ pin High Z
             BCF    STATUS,RP0                  ; Select Bank 0 of data memory
             ENDM

      OW_LO:MACRO
      ;Force the DQ line to a logic low.
             BCF    STATUS,RP0                  ; Select Bank 0 of data memory
             BCF    PORTB, DQ                   ; Clear the DQ bit
             BSF    STATUS,RP0                  ; Select Bank 1 of data memory
             BCF    TRISB, DQ                   ; Make DQ pin an output
             BCF    STATUS,RP0                  ; Select Bank 0 of data memory
             ENDM

这两个代码片段都是作为宏编写的。通过将代码编写为宏,可以使用单个宏调用将其自动插入到程序集源代码中。这限制了必须重写代码的次数。第一个宏OW_HIZ强制DQ线进入高阻抗状态。第一步是选择数据存储器的存储组1,因为TRISB寄存器位于存储组1中。接下来,通过在TRISB寄存器中设置DQ位,将DQ输出驱动器更改为高阻抗状态。最后一行代码更改回数据存储器的库 0。最后一行不是必需的,但用于使所有宏和函数调用使数据存储器处于已知状态。

第二个宏OW_LO将 DQ 线强制到逻辑低电平。首先,选择数据存储器的组0,以便可以访问PORTB寄存器。PORTB 寄存器是数据寄存器,包含强制到 TRISB 引脚的值(如果它们配置为输出)。

PORTB 的 DQ 位被清除,因此线路被强制为低电平。最后,选择数据存储器的组1,并清除TRISB寄存器的DQ位,使其成为输出驱动器。与往常一样,宏以选择数据存储器的库 0 结束。

包括一个标记为WAIT的最终宏,以产生1-Wire信号的延迟。WAIT 用于产生 5μs 倍数的延迟。调用宏时,TIME 值为微秒,并生成相应的延迟时间。宏只需计算需要 5μs 延迟的次数,然后在 WAIT5U 内循环。例程 WAIT5U 将在下一节中显示。对于 WAIT 中的每个指令,处理时间都作为注释给出,以帮助了解延迟是如何实现的。

    WAIT:MACRO TIME
      ;Delay for TIME µs.
      ;Variable time must be in multiples of 5µs.
             MOVLW (TIME/5) - 1                 ;1µs to process
             MOVWF TMP0                         ;1µs to process
             CALL WAIT5U                        ;2µs to process
             ENDM

通用1线例程

1-Wire时序协议具有特定的时序约束,必须遵循这些约束才能实现成功的通信。为了帮助实现特定的时序延迟,使用例程WAIT5U产生5μs延迟。此例程如下所示。

      WAIT5U:
      ;This takes 5µs to complete
             NOP                                ;1µs to process
             NOP                                ;1µs to process
             DECFSZ TMP0,F                      ;1µs if not zero or 2µs if zero
             GOTO WAIT5U                        ;2µs to process
             RETLW 0                            ;2µs to process

当与 WAIT 宏结合使用时,可以生成简单的时序延迟。例如,如果需要 40μs 延迟,则会调用 WAIT 0.40。这会导致 WAIT 中的前 3 行执行,导致 4μs。接下来,WAIT4U 中的前 5 行代码在 5μs 内执行,循环 6 次,总共 30μs。WAIT5U的最后一个循环需要6μs,然后返回到WAIT宏。因此,总处理时间为 4 + 30 + 6 = 40μs。

2.5V < VDD <5.5V, TA= -20°C 至 +70°C
参数 象征 最小值 典型值 麦克斯 单位
时隙 t槽 60 120 微秒
恢复时间 t娱乐 1 微秒
写入 0 低时间 t低0 60 120 微秒
写入 1 低时间 t低1 1 15 微秒
读取数据有效 tRDV 15 微秒
复位时间高 tRSTH 480 微秒
复位时间低 tRSTL 480 960 微秒
存在检测 t帕迪亚 15 60 微秒
存在检测低 tPDL 60 240 微秒

任何1-Wire交易的开始都始于来自主器件的复位脉冲,然后是来自从器件的存在检测脉冲。图 1 说明了此事务。该初始化序列可以通过PIC轻松传输,汇编代码如图1所示。1-Wire初始化、读取和写入的时序规格见上表1。这些参数在文档的其余部分中都有引用。

pYYBAGQOmdqAXAliAAAqdsMe1ak002.gif

图1.1-Wire初始化序列。

    OW_RESET:
             OW_HIZ                             ; Start with the line high
             CLRF      PDBYTE                   ; Clear the PD byte
             OW_LO
             WAIT      .500                     ; Drive Low for 500µs
             OW_HIZ
             WAIT      .70                      ; Release line and wait 70µs for PD Pulse
             BTFSS     PORTB,DQ                 ; Read for a PD Pulse
             INCF      PDBYTE,F                 ; Set PDBYTE to 1 if get a PD Pulse
             WAIT      .430                     ; Wait 430µs after PD Pulse
             RETLW     0

OW_RESET程序首先确保DQ引脚处于高阻抗状态,以便上拉电阻将其拉高。接下来,它清除PDBYTE寄存器,以便准备验证下一个存在检测脉冲。之后,DQ引脚被驱动为低电平500μs。这符合 tRSTL参数如表1所示,并提供了一个20μs的附加缓冲器。将引脚驱动至低电平后,引脚释放至高阻抗状态,并在读取存在检测脉冲之前增加70μs的延迟。使用 70μs 可确保 PIC 采样在有效时间对 t 的任意组合PDL和 t帕迪亚.读取存在检测脉冲后,调整PDBYTE寄存器以显示逻辑电平读数。然后,DQ引脚将处于高阻抗状态再保持430μs,以确保RSTH已满足时间,并包括一个20μs的额外缓冲器。

1-Wire通信所需的下一个例程是DSTXBYTE,用于将数据传输到1-Wire从器件。此例程的 PIC 代码如图 2 所示。此例程与要在 W 寄存器中发送的数据一起调用,并立即移动到 IOBYTE 寄存器。接下来,将 COUNT 寄存器初始化为 8,以计算从 DQ 行发送的位数。从 DSTXLP 开始,PIC 开始发送数据。首先,DQ引脚被驱动为低电平3μs,无论发送什么逻辑电平。这确保了低1时间被满足了。接下来,IOBYTE 的 lsb 移动到 CARRY 位,然后测试一个 60 或 <>。如果CARY为<>,则设置TRISB的DQ位,将引脚变为高阻抗状态,并通过上拉电阻将线路拉高。如果 CARRY 为零,则行保持低电平。接下来增加<>μs的延迟以允许最小t低0时间。等待60μs后,引脚变为高阻抗状态,然后再增加2μs用于上拉电阻恢复。最后,COUNT 寄存器递减。如果 COUNT 寄存器为零,则所有 2 位均已发送,例程已完成。如果 COUNT 寄存器不为零,则从 DSTXLP 开始发送另一个位。写零和写一过程的可视化解释如图 <> 所示。

poYBAGQOmduAI0H7AAAw_GF7_hc302.gif

图2.1线写入时隙。

    DSTXBYTE:                                 ; Byte to send starts in W
             MOVWF     IOBYTE                   ; We send it from IOBYTE
             MOVLW     .8
             MOVWF     COUNT                    ; Set COUNT equal to 8 to count the bits
      DSTXLP:
             OW_LO
             NOP
             NOP
             NOP                                ; Drive the line low for 3µs
             RRF        IOBYTE,F
             BSF        STATUS,RP0              ; Select Bank 1 of data memory
             BTFSC      STATUS,C                ; Check the LSB of IOBYTE for 1 or 0
             BSF        TRISB,DQ                ; HiZ the line  if LSB is 1
             BCF        STATUS,RP0              ; Select Bank 0 of data memory
             WAIT      .60                      ; Continue driving line for 60µs
             OW_HIZ                             ; Release the line for pullup
             NOP
             NOP                                ; Recovery time of 2µs
             DECFSZ    COUNT,F                  ; Decrement the bit counter
             GOTO      DSTXLP
             RETLW     0

1-Wire通信的最后一个例程是DSRXBYTE,它允许PIC从从器件接收信息。代码如图 3 所示。在任何DQ活动开始之前,COUNT寄存器初始化为8,其功能是计算接收的位数。DSRXLP 首先将 DQ 引脚驱动为低电平,向从设备发出 PIC 已准备好接收数据的信号。该线路被驱动为低电平6μs,然后通过将DQ引脚置于高阻抗状态来释放。接下来,PIC再等待4μs,然后对数据线进行采样。在低行驱动后,OW_LO中有 1 行代码,OW_HIZ内有 3 行代码。每条线需要1μs来处理。将所有时间相加得到 1 + 6 + 3 + 4 = 14μs,略低于 tRDV规格为15μs。读取 PORTB 寄存器后,DQ 位被屏蔽,然后将寄存器添加到 255 以强制 CARRY 位镜像 DQ 位。然后,CARRY 位移动到存储传入字节的 IOBYTE 中。一旦字节被存储,就会增加50μs的延迟,以确保槽满足了。最后一项检查是确定 COUNT 寄存器是否为零。如果为零,则已读取 8 位,并退出例程。否则,将在 DSRXLP 上重复该循环。读零和读一事务如图 3 所示。

pYYBAGQOmdyALZhpAABDRKLtVjQ926.gif

图3.1-线读取时隙。

         MOVLW     .8
             MOVWF     COUNT                   ; Set COUNT equal to 8 to count the bits
      DSRXLP:
             OW_LO
             NOP
             NOP
             NOP
             NOP
             NOP
             NOP                                ; Bring DQ low for 6µs
             OW_HIZ
             NOP
             NOP
             NOP
             NOP                                ; Change to HiZ and Wait 4µs
             MOVF      PORTB,W                  ; Read DQ
             ANDLW     1<

总结

Maxim的1-Wire通信协议可以在Microchip的PICmicro系列微控制器上轻松实现。要完成1-Wire交易,只需要两种GPIO状态,并且PIC上的多个GPIO很容易配置用于此任务。1-Wire通信需要三个基本程序:初始化、读字节和写字节。介绍并详细介绍了这三个程序,以提供精确的1-Wire常规速度通信。这使得PIC能够与Maxim 1-Wire的众多器件中的任何一种接口。本文档的附录 A 在一个方便的包含文件中包含所有三个例程。附录B包含一个小型汇编程序,用于将PIC16F628连接至DS2762高精度Li+电池监测器。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7545

    浏览量

    151325
  • 控制器
    +关注

    关注

    112

    文章

    16337

    浏览量

    177829
  • 1-Wire
    +关注

    关注

    0

    文章

    49

    浏览量

    21308
收藏 人收藏

    评论

    相关推荐

    基于C++模板威廉希尔官方网站 的1-wire总线编程

    , touch。但这里没有具体实现这些操作。2、1-wire 器件枚举类:ow_enum_t实现了 enum 操作。3、1-wire 协议
    发表于 11-22 23:40

    1-Wire时序的理解及配置

    应用中的高速模式。DS2480B的特性之一在于其具有伸缩速率模式,允许设计者标准速度配置1-Wire时序。本应用笔记阐述了如何确定最佳时序配置以及如何用Windows?软件将设置参数
    发表于 11-12 00:17

    如何访问1-Wire API

    任何组件在创建者来实现这一点。有人知道如何访问1-Wire API吗?谢谢 以上来自于百度翻译 以下为原文I have been looking for a 1-wire component
    发表于 07-29 15:25

    DS2480B串行接口1-Wire 线驱动器的使用

    1-Wire®通信协议可以通过微处理器上的一个IO 引脚产生,不过,为了创建可靠的1-Wire 网络,必须提供正确的时序和适当的输出电压摆率。1-Wire 主机发送的时序不正确
    发表于 04-18 10:14 57次下载

    应用笔记159绝对可靠的1-Wire通信

    应用笔记159绝对可靠的1-Wire通信 Dallas Semiconductor的1-Wire®器件利用一根数据线和定义完善的、经过时间检验的协议进行
    发表于 04-10 09:57 25次下载

    什么是1-Wire

    什么是1-Wire 定义:单线(加地线)通信协议1-Wire®串行存储器产品通过单线连接为你的产品添加存储器!
    发表于 04-20 23:22 3503次阅读
    什么是<b class='flag-5'>1-Wire</b>

    用软件实现1-Wire通信

    摘要:在没有专用总线主机(如DS2480B、DS2490)的情况下,微处理器可以轻松地产生1-Wire时序信号。本应用笔记给出了一个采用‘C’语言编写、支持标准速率的1-Wire主机通信基本子程序
    发表于 05-08 12:02 2294次阅读
    用软件<b class='flag-5'>实现</b><b class='flag-5'>1-Wire</b><b class='flag-5'>通信</b>

    1-Wire器件与8051系列单片机的软件接口

    摘 要:分析了1-Wire总线的硬件结构和通信协议,结合实际应用设计了1-Wire器件与8051系列单片机的软件接口。 关键词:1-Wire总线,软件接口,CRC校验  
    发表于 05-17 12:40 2031次阅读
    <b class='flag-5'>1-Wire</b>器件与8051系列单片机的软件接口

    DS1820单总线(1-wire)数字温度传感器

      DS1820是美国DALLAS公司生产的一种单总线(1-wire)数字温度传感器,采用1-wire总线通信协议。具有独特的单总线通信方式
    发表于 12-09 11:35 3807次阅读
    DS1820单总线(<b class='flag-5'>1-wire</b>)数字温度传感器

    1-Wire总线主机

    Abstract: Communication with 1-Wire slave devices requires a 1-Wire master. There are numerous ways
    发表于 10-19 17:02 53次下载

    1-Wire通信协议的工作原理及优势介绍

    了解1-Wire®通信协议的工作原理及其相对于其他类型串行通信的优势、常见实施配置,以及主流的1-Wire应用
    的头像 发表于 10-09 04:10 7025次阅读

    实现隔离式1-Wire总线

    1-Wire总线在需要电气隔离的医疗设备中传感器和耗材的认证和校准中越来越受欢迎。本文应用笔记4206“为嵌入式应用选择合适的1-Wire主机”为基础,介绍如何修改现有的1-Wire
    的头像 发表于 01-17 10:39 3173次阅读
    <b class='flag-5'>实现</b>隔离式<b class='flag-5'>1-Wire</b>总线

    可靠的长线1-Wire网络指南

    1-Wire协议最初设计用于通过短连接与附近设备进行通信1-Wire也是在单个微处理器端口引脚上增加辅助存储器的一种方式。后来开发的方法将1-Wi
    的头像 发表于 03-01 14:21 1855次阅读
    可靠的长线<b class='flag-5'>1-Wire</b>网络指南

    使用UART实现1-Wire总线主控

    本应用笔记解释了如何使用微处理器的UART实现1-Wire总线主机。它包括对所需电气接口、UART配置以及UART和1-Wire信号之间的时序关系的说明。此外,它还参考了UART
    的头像 发表于 03-29 11:28 3942次阅读
    使用UART<b class='flag-5'>实现</b><b class='flag-5'>1-Wire</b>总线主控

    如何将1-Wire主机复用到多个通道?

    如何将1-Wire主机复用到多个通道? 1-Wire是一种串行通信协议,可用于连接各种感测器和芯片,如温度传感器、湿度传感器、EEPROM等。通常情况下,每个
    的头像 发表于 10-29 14:21 587次阅读