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+电池监测器。
审核编辑:郭婷
-
微控制器
+关注
关注
48文章
7482浏览量
151012 -
控制器
+关注
关注
112文章
16185浏览量
177335 -
1-Wire
+关注
关注
0文章
49浏览量
21293
发布评论请先 登录
相关推荐
评论