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

    文章

    6809

    浏览量

    147637
  • 控制器
    +关注

    关注

    112

    文章

    15223

    浏览量

    171192
  • 1-Wire
    +关注

    关注

    0

    文章

    49

    浏览量

    21230
收藏 人收藏

    评论

    相关推荐

    基于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接口

    1-Wire接口要适应12V供电的芯片有什么?
    发表于 11-12 11:20

    请问1-wire支持热插拔吗?

    1-wire支持热插拔吗?怎样实现
    发表于 10-19 10:58

    微控制器和1-Wire温度传感器的软件接口

    传感器之间的1-Wire通信。硬件配置1的框图说明了在采用多个1-Wire温度传感器时,该硬件配置
    发表于 12-17 11:29

    如何访问1-Wire API

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

    请问Microchip可能有关于1-Wire的库代码吗?

    ;我知道它可以用1-Wire工作,但是我从来没有经历过1-Wire,只有家族。R与MSSP I2C;是否有人分享有关1Wire的有用信息,或者Microchip可能有关于1-Wire
    发表于 10-31 10:43

    串行1Wire线驱动器DS2480B资料推荐

    通信协议,合并数据和控制信息,而无需控制引脚,这样就保证了通用串口至无线转换器的兼容性,允许更容易实现1-Wire接口转换。DS2480B的多种控制功能针对1-Wire网络进行了优化
    发表于 05-17 07:20

    如何使用FlexIO块访问1-wire设备?

    我的 MCU 是 RT1052,现在我需要访问一个温度传感器 DS18B20,这是一个具有单线协议的设备。使用延迟功能访问 1-wire 协议的方法不适用于 RTOS。 从参考手册来看,1-w
    发表于 04-23 06:43

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

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

    什么是1-Wire

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

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

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

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

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

    配置芯片寄存器的SPI通信协议的verilog实现

    最近正在调试一个芯片的评估板,其中配置寄存器使用的是SPI通信协议。其实很多芯片寄存器的配置都用到了SPI
    的头像 发表于 06-16 09:50 1282次阅读
    <b class='flag-5'>配置</b><b class='flag-5'>芯片</b>寄存器的SPI<b class='flag-5'>通信协议</b>的verilog<b class='flag-5'>实现</b>

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

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