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

描述

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。这些参数在文档的其余部分中都有引用。

控制器

图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 开始发送另一个位。写零和写一过程的可视化解释如图 <> 所示。

控制器

图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 所示。

控制器

图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+电池监测器。

审核编辑:郭婷

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分