摘要: 这个电路提供了一个直接的I(2)C接口到你的PC的USB端口。USB转1线 加密狗为PC提供1线主控,控制1线I/O扩展器。这个I/O扩展器有两个双向开漏端口,PC机可以从中写入和读取。通过在这两个端口上生成正确的逻辑信号,PC机可以模拟I(2)C主机。
当你需要一个直接的I(2)C接口到你的电脑时,有几种选择可供选择。例如,PC机的并口可以模拟I(2)C主机(参见应用说明3230,“如何使用PC机的并口与2线设备通信”)。不过,新款个人电脑通常没有这个端口,Windows 的现代版本(Windows XP 和Windows Vista )也不允许轻松访问它。
一种更好的方法是使用USB端口,但这种技术需要一个复杂的驱动程序,通常还需要一个微控制器,这反过来又需要固件。不是一个下午就能做好的东西!有许多商业版本可用,但它们并不便宜。另一方面,图1的电路可以快速构建,并且可以使用多种编程语言(如LabVIEW和Visual Basic)进行操作。
图1所示 该电路为计算机的USB端口提供I(2)C接口。
U1 (DS9490R)是一个USB-to-1-Wire桥接器,为PC增加了一个1-Wire主控器。1线I/O扩展器(U2, DS2413P)连接到1线网络,提供两个双向开漏端口,由PC通过U1控制。这就是创建I(2)C主机所需的所有硬件。
对于缺乏硬件I(2)C主控器的微控制器,“位敲击”是实现软件I(2)C主控器的一种经过验证的方法。这是用于为该平台启用软件I(2)C主机的技术。
软件通过控制U2的PIOA和PIOB(引脚6和4)的逻辑电平来生成I(2)C信号。例如,为了创建启动条件,SDA必须在SCL高时从高到低转换。驱动SCL (PIOA)高,然后SDA (PIOB)高,然后将SDA拉低。因此,软件通过控制PIOA和PIOB来实现i2c主控。DS2413数据表中的流程图显示了这个PIO功能(图2)。
图2 PIO功能的流程图,取自DS2413数据表。
要更改PIO输出,必须首先通过ROM函数寻址该部分。这个系统只包括一个单一的1-Wire从机,因此您可以使用“skip ROM”命令跳过复杂的寻址过程。然后通过发送“5A”命令写入PIO输出锁存器。1线I/O扩展器(U2)包括一个8位寄存器,它的两个lsb连接到PIOA和PIOB。(另外六个字是“无所谓”。)
为了改变逻辑状态,要发送两次新数据:一次按原样发送,一次倒过来发送。从机(U2)通过向主机返回一个“AA”命令来确认无错误接收,最后也发送新的输出状态。整个序列现在可以重新开始,或者由1-Wire主复位中止。因此,每次输出更改必须传输4个字节(不包括Skip ROM和5A命令)。例如,生成I(2)C start命令必须执行以下顺序:
主模式 | 数据 | 评论 |
TX | (重置) | 复位总线 |
处方 | (存在) | DS2413存在 |
TX | 0 xcc | 跳过罗 |
TX | 0 x5a | 写PIO寄存器 |
TX | 0 xff | sci = 1,SDA = 1 |
TX | 0 x00 | 反向数据 |
处方 | 0 xaa | 接收数据 |
处方 | 0 x0f | 返回输出状态 |
TX | 0 xfd | sci = 1,SDA = 0 |
TX | 0 x02 | 反向数据 |
处方 | 0 xaa | 接收到的数据 |
处方 | 0 x2d | 返回输出状态 |
类似的序列实现了其他事件,如发送字节、确认和停止。
Maxim为DS9490提供了一个软件驱动程序,也为Windows提供了一个支持Microsoft . net平台的1-Wire软件开发工具包(SDK)。为了说明这一点,我们可以在LabVIEW中使用它的。net支持来实现一个I(2)C master。只有在安装了。net支持的1-Wire驱动程序时才有效。另一个先决条件是安装Microsoft . net框架和Visual j#可重新发布包。详细信息请参见应用说明155,“1-Wire 软件资源引导设备说明”。
为了防止其他应用程序访问1-Wire网络,VI“I(2)C Initialize”(其中VI是LabVIEW术语,意思是虚拟仪器)初始化U1并赋予LabVIEW对1-Wire网络的独占访问权(图3)。然后发出1-Wire复位,然后是跳过命令(CC),并以PIO写命令(5A)结束。
图3 VI“I(2)C Initialize”初始化DS2413,之后它准备接收I/O数据。
从机(U2)现在已经准备好接受pio的数据。VI“I(2)C时钟”将SCL线从低切换到高(图4)。SDA可以设置为高或低,VI返回SDA状态。您可以通过连续调用此函数8次来编写一个完整的字节(每传输一个比特调用一次)。如果从机返回数据,SDA由主机驱动高电平。为了传输“0”,从机可以将SDA拉低(这是可以的,因为PIOB是一个开漏输出)。因为U2会自动返回更新后的输出状态,所以不需要特殊的读取操作(参见VIs的“Send I(2)C字节”和“Get I(2)C字节”)。
图4 VI“I(2)C时钟”切换SCL从低到高。SDA可以对“I(2)C写”动作和“I(2)C读”动作进行设置或复位。
VIs“I(2)C启动”、“I(2)C停止”和“I(2)C确认”使用相同的结构来生成适当的SDA和SCL信号。通过组合这些vi,您可以编写一个完整的I(2)C读或写会话。为了说明通信会话(图5),我们读取实时时钟(DS1337)的寄存器0。然后,该设备用0x39应答,这是计算秒数的寄存器的内容。寄存器地址设置为0x00,从地址设置为0xD0,需要读取的字节数设置为1。示波器图像(图6)显示了电路为这些设置产生的信号。
图5 示例如何读取寄存器,使用图1的电路。
图6 读取DS1337的寄存器0。S=开始,A=承认,Sr=重复开始,P=停止。从主人到奴隶都有阴影;从奴隶到主人都是白色的。
由于软件开销很大,该电路产生信号的速率被限制在大约20bps。然而,这个想法可以在不同的编程语言中实现。Maxim网站提供了几个1-Wire示例程序,您可以将其作为起点。
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308