摘要
包括iButton®器件在内,Maxim目前生产的1-Wire®器件已有30多种。如何选择已有的应用程序接口API、软件范例及其它资源与这一类器件进行通信或为某个器件选择正确的资源是一件非常令人头疼的事。本文提供了该类资源的概述和选择指南。另外,还提供了一个目前1-Wire器件的功能说明和家族代码列表,便于用户查询。
所提供的API包括:TMEX (Microsoft Windows® API)、1-Wire公共文件资源(一种跨平台API)、Java™ 1-Wire API (OWAPI)及其变形.NET 1-Wire API (OW.NET)和精简型.NET 1-Wire API (OW.NET.Compact)。本文所描述的所有API都是免费的,而且大多数情况下还包括完整的源代码。
引言
包括iButton在内,Maxim目前生产的
1-Wire 概述
所有通信的第一步都需要总线控制器发出一个复位信号以使总线同步,然后选择一个受控器件进行随后的通信,这可以通过选择所有的受控器件或者选择一个特定的受控器件(利用该器件的序列号进行选择),或者通过对半检索法找到总线上的下一个受控器件来实现。上文所提到的这些指令都是网络指令或者只读存储器(ROM)指令。一旦一个特定的器件被选中,那么在下次复位信号发出之前,所有其它器件都被挂起而忽略随后的通信。
一旦一个器件被用于总线通信,主机就能向它发出特定的器件指令,对它进行数据读写。这是因为每类器件具有不同的功能和不同的用途,而且一旦器件被选定,就有了唯一的协议。虽然每类器件具有不同的协议和特征,但其工作过程却是相同的并且遵循如图1所示的工作流程。
每个受控器件的序列号的整数部分是一个8位的家族代码。这个代码对器件模型来说是特定的。因为每种器件模型执行不同的功能,所以可以用代码来选择用于控制或者查询器件的协议。表1是Maxim
家族代码 | 器件 () - iButton封装 |
说明 (除非特别说明,存储器尺寸以位为单位) |
01 (hex) | (DS1990A), (DS1990R), DS2401, DS2411 | 仅 |
02 | (DS1991)¹ | 多密钥iButton,1152位安全存储器 |
04 | (DS1994), DS2404 | 4Kb非易失RAM存储器及时钟、定时器和闹钟 |
05 | DS2405¹ | 单路可编址开关 |
06 | (DS1993) | 4Kb非易失RAM存储器 |
08 | (DS1992) | 1Kb非易失RAM存储器 |
09 | (DS1982), DS2502 | 1Kb EPROM存储器 |
0A | (DS1995) | 16Kb非易失RAM存储器 |
0B | (DS1985), DS2505 | 16Kb EPROM存储器 |
0C | (DS1996) | 64Kb非易失RAM存储器 |
0F | (DS1986), DS2506 | 64Kb EPROM存储器 |
10 | (DS1920) | 带报警门限的温度检测 |
12 | DS2406, DS2407¹ | 1Kb EPROM存储器,2路可编址开关 |
14 | (DS1971), DS2430A¹ | 256位EEPROM存储器和64位OTP寄存器 |
1A | (DS1963L)¹ | 带写周期计数器的4Kb非易失RAM存储器 |
1C | DS28E04-100 | 4096位 EEPROM存储器,2路可编址开关 |
1D | DS2423¹ | 带外部计数器的4Kb非易失RAM存储器 |
1F | DS2409¹ | 2通道可编址耦合器,用于子网络 |
20 | DS2450 | 4通道A/D转换器(ADC) |
21 | (DS1921G), (DS1921H), (DS1921Z) | Thermochron®温度记录仪 |
23 | (DS1973), DS2433 | 4Kb EEPROM存储器 |
24 | (DS1904), DS2415 | 实时时钟(RTC) |
27 | DS2417 | 带中断的RTC |
29 | DS2408 | 8路可编址开关 |
2C | DS2890¹ | 单路数字电位器 |
2D | (DS1972), DS2431 | 1024位 |
37 | (DS1977) | 密码保护的32KB (字节) EEPROM |
3A | (DS2413) | 2路可编址开关 |
41 | (DS1922L), (DS1922T), (DS1923), DS2422 | 大容量Thermochron (温度)和Hygrochron™ (湿度)记录器 |
42 | DS28EA00 | 可编程分辨率的数字温度计,具有顺序检测和PIO |
43 | DS28EC20 | 20Kb |
*该表没有列出Maxim的全部
¹不推荐在新的设计中使用这些器件。
API基础
会话 |
独占使用 |
链路 |
基本的 |
网络 |
查找和选择器件的网络功能。每个 |
传输 |
块通信和基本的存储器读/写功能。这还包括存储器信息包读/写功能。这些功能是通过网络层和链路层功能构造的。 |
文件 |
使用 |
器件 |
专用器件的‘高层’功能。这些功能通常是通过网络、传输和链路类功能构造的,并执行诸如读取温度值或设置开关状态等操作。 |
图3概括了使用这些功能的典型顺序。SESSION功能围绕着调用器件进行通信,具有代表性的是先使用一个NETWORK功能,然后运行存储器或DEVICE的特定操作。
iButton通信实质上是通过与其触头相‘接触’来实现的。这意味着与器件的联系有时是不可靠的。iButton也可能被安装到阅读器里,在阅读的时候弹出,从而必须有一个相容的纠错方法紧跟其后。当检测到虚假错误时必须重发数据并在数据通信中进行CRC校验。API中的文件输入输出功能所利用的标准文件结构在应用笔记114:“
API的选择
本文主要列举了五种不同的应用程序接口(API)。这些API运行在不同的工作平台上,使用不同的语言,具有不同的性能。表2简要地描述了这五种API;表3说明了按语言划分的可利用API及其操作系统。
API | 缩写 | 说明 |
PD | 源代码完全开放的C语言公共文件资源API,设计用于在多种PC操作系统、手持设备操作系统和微控制器平台之间移植。对于PC平台,通过本地驱动程序库在Microsoft Windows系统上支持所有的 |
|
Java |
OWAPI | 完全公开的、高级Java API,支持几乎所有的 |
.NET |
OW.NET | OWAPI代码基于Microsoft的.NET框架下的J#。 |
精简型.NET |
OW.NET.Compact | 用于Windows CE计算机或平台的精简型.NET框架不包含Microsoft Visual J#®发行套件,目前只包含与C#接口的底层 |
TMEX API | TMEX | 在Windows平台(32位和64位)上支持所有的 |
语言 操作系统 |
TMEX /OW.NET/OW.NET.Compact (与Microsoft Windows语言无关) |
C | Java |
Windows Vista® | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows Vista x64 | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows XP | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows XP x64 | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows 2008 | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows 2008 x64 | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows 2000¹ | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows ME¹ | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows 98¹ | TMEX /OW.NET/OW.NET.Compact | PD | OWAPI |
Windows 95¹ | TMEX | PD | OWAPI |
Win3.1¹ | TMEX | PD | |
DOS¹ | TMEX | PD | |
Pocket PC/CE | OW.NET.Compact | PD | |
Linux®和其它基于UNIX®的操作系统 | PD | OWAPI | |
MxTNI* | PD - 无MxTNI操作系统 | OWAPI |
*MxTNI™是由Maxim研制的带有基于Java的操作系统的嵌入式平台。
¹不再进行支持,之前的驱动程序仍可从Maxim网站下载。
API不同,器件族的支持亦不同。表4列出了目前所有可利用的
器件 | 族号 | 说明 | TMEX | PD | OWAPI | OW.NET | OW.NET Compact |
DS1982 | 09 | 1Kb EPROM存储器 | ABCE | ABCDE | ABCDE | ABCDE | AB |
DS1985 | 0B | 16Kb EPROM存储器 | ABCE | ABCDE | ABCDE | ABCDE | AB |
DS1986 | 0F | 64Kb EPROM存储器 | ABCE | ABCDE | ABCDE | ABCDE | AB |
DS1904 | 24 | RTC | AB | AB | ABI | ABI | AB |
DS1920 | 10 | 带报警输出的温度传感器 | AB | ABI | ABCI | ABCI | AB |
DS1921G DS1921H DS1921Z |
21 | Thermochron温度记录器 | ABDE | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
AB |
DS1922L DS1922T DS1923 |
41 | 高存储容量Thermochron (温度)和/或Hygrochron (湿度)记录器 | AB | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
AB |
DS1963L¹ | 1A | 带写周期计数器的4Kb NV RAM存储器 | ABDE | ABCDE | ABCDEF GH |
ABCDEF GH |
AB |
DS1971 | 14 | 256位EEPROM存储器和64位OTP寄存器 | ABD | ABCDI | ABCDI | ABCDI | AB |
DS1972 | 2D | 1024位EEPROM存储器 | AB | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
|
DS1973 | 23 | 4Kb EEPROM存储器 | ABDE | ABCDE | ABCDEF GH |
ABCDEF GH |
AB |
DS1977 | 37 | 口令保护的32KB (字节) EEPROM | AB | ABCDE | ABCDEF GH |
ABCDEF GH |
AB |
DS1990A DS1990R |
01 | 只有 |
AB | AB | AB | AB | AB |
DS1991¹ | 02 | 多密钥iButton, 1152位加密存储器 | AB | ABC | ABC | ABC | AB |
DS1992 | 08 | 1Kb NV RAM存储器 | ABDE | ABCDE | ABCDEF GH |
ABCDEF GH |
AB |
DS1993 | 06 | 4Kb NV RAM存储器 | ABDE | ABCDE | ABCDEF GH |
ABCDEF GH |
AB |
DS1994¹ | 04 | 4Kb NV RAM存储器和时钟、定时器、闹钟 | ABDE | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
AB |
DS1995 | 0A | 16Kb NV RAM存储器 | ABDE | ABCDE | ABCDEF GH |
ABCDEF GH |
AB |
DS1996 | 0C | 64Kb NV RAM存储器 | ABDE | ABCDE | ABCDEF GH |
ABCDEF GH |
AB |
DS2401 | 01 | 只有 |
AB | AB | AB | AB | AB |
DS2405¹ | 05 | 单路开关 | AB | ABI | ABI | ABI | AB |
DS2404¹ | 04 | 4Kb NV RAM存储器和时钟、定时器、闹钟 | ABDE | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
AB |
DS2406 DS2407¹ |
12 | 1Kb EPROM存储器,2路可编址开关 | ABCE | ABCDEI | ABCDEI | ABCDEI | AB |
DS2408 | 29 | 8路可编址开关 | AB | ABI | ABI | ABI | AB |
DS2409¹ | 1F | 双路开关,耦合器 | AB | ABI | ABI | ABI | AB |
DS2411 | 01 | 只有 |
AB | AB | AB | AB | AB |
DS2413 | 3A | 双路可编址开关 | AB | ABI | ABI | ABI | AB |
DS2415 | 24 | RTC | AB | AB | ABI | ABI | AB |
DS2417 | 27 | 带中断的RTC | AB | AB | ABI | ABI | AB |
DS2422 | 41 | 高存储容量Thermochron (温度)/Hygrochron (湿度)记录器 | AB | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
AB |
DS2423¹ | 1D | 带外部计数器的4Kb NV RAM存储器 | ABDE | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
AB |
DS2430A¹ | 14 | 256位EEPROM存储器和64位OTP寄存器 | ABD | ABCDI | ABCDI | ABCDI | AB |
DS2431 | 2D | 1024位EEPROM存储器 | AB | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
AB |
DS2450 | 20 | 四路ADC | AB | ABI | ABI | ABI | AB |
DS2502 | 09 | 1Kb EPROM存储器 | ABCE | ABCDE | ABCDE | ABCDE | AB |
DS2505 | 0B | 16Kb EPROM存储器 | ABCE | ABCDE | ABCDE | ABCDE | AB |
DS2506 | 0F | 64Kb EPROM存储器 | ABCE | ABCDE | ABCDE | ABCDE | AB |
DS2890¹ | 2C | 单路数字电位计 | AB | AB | ABI | ABI | AB |
DS28E04-100 | 1C | 4096位EEPROM存储器、两路可编址开关 | AB | ABCDEI | ABCDEF GHI |
ABCDEF GHI |
AB |
DS28EA00 | 42 | 分辨率可编程的数字温度计,带有顺序检测和PIO | AB | AB | AB | AB | AB |
DS28EC20 | 43 | 20Kb EEPROM | AB | AB | AB | AB | AB |
阴影标志 | 支持标志说明 |
全部支持 | A. 支持 B. 支持 C. 支持存储器的字节读写 D. 支持存储器的包读写 E.支持AA型 F. 支持AB型 G. 支持BA型 H. 支持BB型 I. 支持其它专用器件 |
部分支持 | |
很少支持 |
¹不推荐在新的设计中使用这些器件。
1-Wire 公共文件(PD)资源概述
用‘C’语言设计的API是可移植的。提供专用平台上完成的‘TODO’模板,也提供了几种平台范例的实现:包括64位Windows、32位Windows和Linux。还有用这些平台实现的几个应用。
有三类可移植的源文件:分别定义为‘通用’、‘userial’和‘其它’。第一类是通用源文件,适用于已经与
值得注意的是,这篇应用笔记还提供完全开放源代码、
有关可用的各类文件可参考下表,表中的这些文件均已在每个平台上建立,并提供下载。
可移植的源文件类别(构件) | 平台 | 端口 | 说明 |
userial | Win64, Win32, Linux, (其它UNIX), DS550 | COM | 支持DS9097U |
通用 | Win64, Win32 | LPT | LPT构件支持Windows上的DS1410E¹并行接口适配器。 |
DS550 | 微处理器(µP)端口引脚 | DS550通用源文件用到了µP端口引脚。 | |
其它'libusb' | Win64, Win32, Linux, Macintosh, (其它UNIX) | USB | 支持DS9490 USB |
其它'WinUsb' | Win64, Win32 | USB | 支持DS9490 USB |
其它'wrapper' (TMEX) | Win32 | USB, COM, LPT | 捆绑了TMEX API,可在Windows下提供多端口支持(分别对应DS9490、DS9097U和DS1410E¹)。 |
其它'multiport' | Win64, Win32 | USB, COM, LPT | 通过直接与最底层的本地Windows驱动程序进行通信,来支持多端口。 |
注:关于最新的平台源文件可从
¹不推荐在新设计中使用DS1410E并行端口适配器。
这些不同类的可移植源代码文件执行同样的
除了能够下载可移植的公用套件‘C’语言模块外,还可以下载有限数量的微处理器(µP)汇编实例,进行
该API中的文件功能实现了
顾名思义,API所提供的源代码有一个尽可能接近公用文件资源的许可证。开发者可以自由使用,并可与他们的应用软件不受任何限制地结合为一体。
会话 |
owAcquire - 获得 owRelease - 释放以前得到的 |
链路 |
owHasOverDrive - 说明适配器是否具有快速模式适配性能。 owHasPowerDelivery - 说明适配器是否能供电。 owHasProgramPulse - 说明EPROM编程电压是否可用。 owLevel - 设置 owProgramPulse - 发同步编程脉冲写EPROM owReadBitPower - 读取1位数据,并有选择地提供供电。 owReadByte - 通过发送全1 (0xFF)接收来自 owSpeed - 设置 owTouchBit - 发送并接收1位 owTouchByte - 发送并接收8位 owTouchReset - 复位 owWriteByte - 向 owWriteBytePower - 向 |
网络 |
owAccess - 选定当前器件并准备运行特定器件的指令。 owFamilySearchSetup - 确定随后的搜索顺序(owNext)以找到特定的家族类型。 owFirst - 搜索并找到 owNext - 搜索并找到 owOverdriveAccess - 选择当前的器件,并设置它的速度为快速模式。 owSerialNum - 保持或设定当前选定的器件的序列号(ROM号)。 owSkipFamily - 略过最后一次查询到的家族类型对应的所有 owVerify - 选择并验证当前的器件正在运行(报警选项)。 |
传输 |
owBlock - 发送和接收 owCanLockPage - 检查给定的存储区是否有可被锁定的页。 owCanLockRedirectPage - 检查给定的存储区是否有在重定向中能够被锁定的页。 owGetAlternateName - 获得改变的器件型号或器件名。 owGetBankDescription - 获得存储区的字符性描述。 owGetDescription - 获得对 owGetExtraInfoDesc - 获得对附加信息的内容描述。 owGetExtraInfoLength - 获得存储区中附加信息的长度,单位为字节。 owGetMaxPacketDataLength - 获得一个数据包中最大的数据长度,单位为字节。 owGetName - 以字符串的形式获得 owGetNumberBanks - 获得某一 owGetNumberPages - 获得给定存储区的页数。 owGetPageLength - 获得给定存储区的原始页长度,单位是字节。 owGetSize - 获得给定存储区的大小,单位是字节。 owGetStartingAddress - 获得给定存储区的物理首地址。 owHasExtraInfo - 检测读数据时存储区的页是否传送附加信息。 owHasPageAutoCRC - 检测读数据页时存储区是否有器件产生的CRC校验码。 owIsGeneralPurposeMemory - 检测存储区是否是通用用户存储器。 owIsNonvolatile - 检测当前的存储区是否是非易失的。 owIsReadOnly - 检测存储区是否是只读的。 owIsReadWrite - 检测存储区是否是可读写的。 owIsWriteOnce - 检测存储区是否是只可写入一次,如EPROM。 owNeedsPowerDelivery - 检测写存储区时是否需要‘供电’。 owNeedsProgramPulse - 检测写存储区时是否需要‘编程脉冲’。 owRead - 读初始状态下存储区的一部分(没有包,CRC校验码)。 owReadPage - 读初始状态下存储区的完整的一页(没有包,CRC校验码)。 owReadPageCRC - 在器件产生CRC校验码的状态下,读存储区的完整的一页。 owReadPageExtra - 读初始状态下包括所有‘附加’信息在内的存储区的完整一页(没有包,CRC码)。 owReadPageExtraCRC - 读取包括所有‘附加’信息和器件生成的CRC码在内的存储区的完整的一页。 owReadPagePacket - 从存储区的页中读取通用数据包(有关通用数据包结构的说明,参见应用笔记114:" owReadPagePacketExtra - 从带有‘附加’信息的存储区页中读取通用数据包。 owRedirectPage - 检测存储区中是否有能被重定向的页。 owWrite - 写初始模式下的一部分存储区。 owWritePagePacket - 把一个通用数据包写入存储区的一页中。 |
文件 |
owAttribute - 改变文件的属性。 owChangeDirectory - 改变当前目录。 owCloseFile - 关闭一个文件。 owCreateDir - 创建一个目录。 owCreateFile - 创建一个可写文件。 owCreateProgramJob - 创建一个写缓冲器,以记录EPROM编程未完成的任务。 owDeleteFile - 删除一个文件。 owDoProgramJob - 写未完成的EPROM编程任务。 owFirstFile - 寻找当前目录下的第一个文件。 owFormat - 格式化 owGetCurrentDir - 获取当前目录。 owNextFile - 寻找当前目录的下一个文件。 owOpenFile - 打开一个可读文件。 owReadFile - 读一个已打开的文件。 owReadFile - 从文件读取数据。 owRemoveDir - 删除一个目录。 owReNameFile - 更改文件名。 owWriteFile - 写一个已创建的文件。 |
器件 |
DoAtoDConversion - 在DS2450上进行A/D转换。 ReadSwitch12 - 读取DS2406开关的状态。 ReadCounter - 读取DS2423 …(由于专用器件的功能太多,这里不能一一列举)。 |
下面的例1就是一段PD编码示例,它遵循图3所概括的API使用流程。简便起见,在程序的每次循环中找到一个
int rslt, portnum=0, doing_work=1; char portString[50]; // set to platform appropriate port string // work loop while (doing_work) { // acquire the1-Wire Net (SESSION) if (owAcquire(portnum, portString)) { // find all devices (NETWORK) rslt = owFirst(portnum, TRUE, FALSE); while (rslt) { // do SOMETHING with device found (TRANSPORT/FILE/DEVICE) // . . . // find the next device (NETWORK) rslt = owNext(portnum, TRUE, FALSE); } // release the1-Wire Net (SESSION) owRelease(portnum); } else { // Could not acquire1-Wire network // . . . } // do other application work // . . . }
图5a和5b列出了C语言模块,它们分别构成了
会话 | |||||
owsesu.c | |||||
链路 | |||||
owllu.c ds2480ut.c ds2480.h | |||||
网络 | |||||
ownetu.c crcutil.c (需要编译) | |||||
传输 | |||||
mbappreg.c | mbappreg.h | mbee.c | mbee.h | mbee77.c | mbee77.h |
mbeewp.c | mbeewp.h | mbeprom.c | mbeprom.h | mbnv.c | mbnv.h |
mbnvcrc.c | mbnvcrc.h | mbscr.c | mbscr.h | mbscrcrc.c | mbscrcrc.h |
mbscree.c | mbscree.h | mbscrex.c | mbscrex.h | mbscrx77.c | mbscrx77.h |
mbsha.c | mbsha.h | mbshaee.c | mbshaee.h | owtrnu.c | pw77.c |
pw77.h | rawmem.c | rawmem.h | |||
文件 | |||||
owcache.c | owfile.c | owfile.h | owpgrw.c | owprgm.c | |
器件 | |||||
ad26.c | ad26.h | atod20.c | atod26.c | atod26.h | cnt1d.c |
humutil.c | humutil.h | jib96.c | jib96.h | jib96o.c | ps02.c |
ps02.h | sha18.c | sha33.c | shadbtvm.c | shadebit.c | shaib.c |
shaib.h | swt05.c | swt12.c | swt12.h | swt1c.c | swt1c.h |
swt1f.c | swt29.c | swt29.h | swt3a.c | swt3a.h | temp10.c |
thermo21.c | hermo21.h | time04.c | time04.h | weather.c | weather.h |
其它功能 | |||||
ioutil.c | owerr.c | findtype.c | ownet.h | screenio.c | sprintf.c |
crcutil.c | |||||
TODO | |||||
提供一个可以运行以下函数的串口模块: BreakCOM* - 在串口上发送一个至少持续2ms的‘BREAK’指令。 CloseCOM - 关闭以前打开的串口(只对一些平台适用)。 FlushCOM* - 允许任意未完成的写操作执行完毕,并清空输入缓冲器。 msDelay* - 至少延迟指定的ms数。 msGettick - 返回一个增量ms计数器(只对一些示例适用)。 OpenCOM - 打开指定的串口以进行通信(只对一些平台适用)。 ReadCOM* - 从串口读取指定数目的字节。 SetCOMBaud - 更改串口的波特率为指定值(也可设置为快速模式)。 WriteCOM* - 写指定数目的字节到串口。 *基本操作所必需的功能。 |
会话 |
(参见TODO) |
链路 |
(参见TODO) |
网络 |
ownet.c crcutil.c (需要编译) |
传输 |
除‘owtrnu.c’换为‘owtran.c’外,其余的均与USERIAL执行程序相同。 |
文件 |
与USERIAL执行程序相同。 |
器件 |
与USERIAL执行程序相同。 |
其它功能 |
与USERIAL执行程序相同。 |
TODO |
提供可以运行以下函数的链接和会话接口: owAcquire - 获得 owRelease - 释放以前得到的 owHasOverDrive - 说明适配器是否具有快速模式适配性能。 owHasPowerDelivery - 说明适配器是否能供电。 owHasProgramPulse - 说明EPROM编程电平是否可用。 owLevel - 设置传输线上某点电平为标准模式(5V弱上拉),供电(5V强上拉),或者为编程电平(12V EPROM编程电平)。 owProgramPulse - 发送同步编程脉冲写EPROM owReadBitPower - 读取1位数据,然后有选择地提供供电。 owReadByte - 通过发送全1信号(0xFF),接收来自 owSpeed - 设置 owTouchBit* - 发送并接收一位 owTouchByte - 发送并接收8位 owTouchReset* - 复位 owWriteByte - 向 owWriteBytePower - 向 *执行基本操作所必须的功能。 |
安装
由于
一些构件需要本地
Java的1-Wire API (OWAPI)概述
为创建
API由很多Java类和接口构成。
容器通过
Java软件开发包
图6所示为API对象生成的典型顺序。‘提供者’提供一个‘适配器’实例(或枚举),反过来它又生成器件‘容器’实例。然后与器件的通信几乎直接通过容器来进行。
图7说明了容器的共同特征。具有存储器的器件将为每个存储区生成一个存储区实例。根据特征可以把存储器划分成几组。比如:一组存储器是易失的,而另一组却是非易失的,或者一个区域能够作通用存储器,或能够进行存储器映射,以改变器件功能。
图8说明了基于OWAPI类库的方法。类或包用粗体字表示。注:因为每个容器都有操作器件类型的高级方法,所以一般不直接访问适配器中链路层的方法。
会话 |
com.dalsemi.onewire.adapter.DSPortAdapter beginExclusive - 获取 endExclusive - 释放对 |
链路 |
com.dalsemi.onewire.adapter.DSPortAdapter canBreak - 检测适配器是否支持 canDeliverPower - 检测适配器是否支持‘强上拉’的供电。 canDeliverSmartPower - 检测适配器是否支持‘智能’供电。所谓‘智能’供电指的是能够检测何时能量消耗开始减少并能自动停止供电。 canFlex - 检测适配器是否支持远距离同步通信。 canHyperdrive - 检测适配器是否支持超光速通信。 canOverdrive - 检测适配器是否支持快速模式通信。 canProgram - 检测适配器是否支持12V的EPROM编程电压。 dataBlock - 发送和接收 getBit - 从 getBlock - 通过发送全1 (0xFF)信号从 getByte - 通过发送全1 (0xFF)信号从 getSpeed - 获取当前 putBit - 向 putByte - 向 reset - 复位所有 setPowerDuration - 设定供电持续时间。 setPowerNormal - 停止供电。 setProgramPulseDuration - 设定编程电平持续时间。 setSpeed - 设定 startBreak - 在 startPowerDelivery - 开始供电。 startProgramPulse - 启动编程脉冲。 |
网络 |
com.dalsemi.onewire.adapter.DSPortAdapter excludeFamily - 在搜索过程中把一个家族都排除在外。 findFirstDevice - 不经过容器的自动生成而找到 findNextDevice - 不经过容器的自动生成而找到 getAllDeviceContainers - 找出 getDeviceContainer - 获取当前找到的器件的容器。 getFirstDeviceContainer - 找到第一个器件,并为之建立一个容器。 getNextDeviceContainer - 找到下一个器件,并为之建立一个容器。 setNoResetSearch - 设置 setSearchAllDevices - 设置 setSearchOnlyAlarmingDevices - 设置 targetAllFamilies - 设置 targetFamily - 在 (也在com.dalsemi.onewire.container*内)。 isAlarming - 检测器件是否处于报警状态。 isPresent - 检测器件是否在 select - 选择 |
传输 |
com.dalsemi.onewire.container.MemoryBank getBankDescription - 返回存储区的文本描述。 getSize - 获取存储区的大小,单位为字节。 getStartPhysicalAddress - 获得存储区的物理首地址。 isGeneralPurposeMemory - 检测存储区是否是通用的(不是存储器映射的)。 isNonVolatile - 检测存储区是否是非易失的。 isReadOnly - 检测存储区是否是只读的。 isReadWrite - 检测存储区是否是可读可写的。 isWriteOnce - 检测存储区是否像EPROM一样只能写入一次。 needsPowerDelivery - 检测存储区写时是否需要供电。 needsProgramPulse - 检测存储区写时是否需要编程脉冲。 read - 不译码直接读取存储区(没有包结构)。 setWriteVerification - 设置API写数据后进行校验。 write - 写存储区(没有包结构)。 com.dalsemi.onewire.container.PagedMemoryBank getExtraInfoDescription - 获取和存储区有关的附加信息说明。 getExtraInfoLength - 获取每一页上附加信息的长度,单位为字节。 getMaxPacketDataLength - 获取包结构所能容纳的最大数据长度,以适合存储区的每一页。 getNumberPages - 获取存储区的页数。 getPageLength - 获取存储区空白页的长度,单位为字节。 hasExtraInfo - 检测存储区是否有与每一页有关的附加信息。 hasPageAutoCRC - 检测存储区中的页是否有器件产生的CRC校验码。 readPage - 从存储区中读取一页。 readPageCRC - 利用器件产生的CRC校验码从存储区读取一页数据。 readPagePacket - 从存储区的一页中读取包结构。 writePagePacket - 写包结构到存储区的页中。 com.dalsemi.onewire.container.OTPMemoryBank canLockPage - 检测存储区的页是否可以写保护。 canLockRedirectPage - 检测存储区的重定向器件是否可以被锁,以防再次重定向。 canRedirectPage - 检测存储区是否有被重定向的页,以此更改一次性写入的页。 getRedirectedPage - 获取被重定向的页的数目。 isPageLocked - 检测页是否加了写保护。 isRedirectPageLocked - 检测页是否被锁,以防被重定向。 lockPage - 锁定一页。 lockRedirectPage - 锁定页以防被重定向。 redirectPage - 重定向一页到新页,更新一次性写器件时使用。 |
文件 |
com.dalsemi.onewire.utils.OWFile 除了与java.io.File (JDK的版本1.2)相同的方法以外,还有下面的方法: close - 关闭文件和释放所有相关的资源。 format - 格式化提供给OWFile的与器件有关联的 getFD - 获得文件的OWFile描述,以使文件操作与器件同步。 getFreeMemory - 获得 getLocalPage - 从 getMemoryBankForPage - 获取可以用来读写 getOneWireContainer - 获得构成文件系统的容器。 getPageList - 获得含有文件的 com.dalsemi.onewire.utils.OWFileDescriptor 同样的方法见java.io.FileDescriptor (JDK的版本1.2)。 com.dalsemi.onewire.utils.OWFileOutputStream 同样的方法见java.io.FileOutputStream (JDK的版本1.2)。 com.dalsemi.onewire.utils.OWFileInputStream 同样的方法见java.io.FileInputStream (JDK的版本1.2)。 |
器件 |
com.dalsemi.onewire.container.* 包括六种不同的传感器类接口,共有30多种器件专用容器执行程序: ADContainer - 模数转换器 ClockContainer - 时钟 SwitchContainer - 开关 TemperatureContainer - 温度传感器 PotentiometerContainer - 数字电位器 HumidityContainer - 湿度传感器 MissionContainer - 用于特定任务的温度和湿度记录器 OneWireSensor - PasswordContainer - 受口令保护的存储器 com.dalsemi.onewire.application.* 安全散列算法(SHA)和 *执行基本操作所必需的函数。 |
下面的例2是OWAPI的代码段,它也遵循图3所概括的API使用流程。和例1中的公用代码实例一样,每次循环只找出一个
boolean doing_work=true; // get the default adapter from the service provider DSPortAdapter adapter = OneWireAccessProvider.getDefaultAdapter(); // work loop while (doing_work) { // get exclusive use of adapter (SESSION) adapter.beginExclusive(true); // clear any previous search restrictions (NETWORK) adapter.setSearchAllDevices(); adapter.targetAllFamilies(); adapter.setSpeed(adapter.SPEED_REGULAR); // enumerate through all the1-Wire devices found (NETWORK) for (Enumeration owd_enum = adapter.getAllDeviceContainers(); owd_enum.hasMoreElements(); ) { // get a 'container' for each device OneWireContainer owd = ( OneWireContainer ) owd_enum.nextElement(); // do SOMETHING with device found (TRANSPORT/FILE/DEVICE) // . . . } // end exclusive use of adapter (SESSION) adapter.endExclusive(); // do other application work // . . . }
1-Wire 标记
随着
安装
图8所提到的调用API所需的任何模块都包含在一个jar文件里:OneWireAPI.jar。将模块导入正确的位置或类路径可提供全部的API。但有两个特例:一个是本地或通信API需要安装在特定的平台上,另一个是平台有容量的限制以致不能满足所有API的需要。这两个特例将在OWAPI软件包里进行详细的说明。
1-Wire .NET (OW.NET)概述
处于全面考虑,我们提供的.NET支持是对应Java的
注意:OneWire.NET.dll还需要在
- 本地
1-Wire 端口适配器驱动程序。该驱动程序是1-Wire 驱动程序,且可从iButton网站下载。 - Microsoft .NET 2.0框架。
- Visual J# .NET 2.0发行版本。
精简型1-Wire .NET (OW.NET Compact)概述
该对象的接口与
TMEX API (TMEX)概述
TMEX API是一套独立于Windows动态链接库的语言,它提供所有
这种API的最底层用作Windows平台(
TMEX SDK所提供的例子都有源代码,但还未提供低级驱动程序的源代码。驱动程序可自由发布。
表6出了目前支持的
适配器 | 端口 | 特征 |
DS9490R, DS9490B | USB | 供电快速模式RJ-11或iButton座DS2401 ID |
DS1410E¹ | 并口 | 供电快速模式RJ-11或双iButton座DS2401 ID |
DS1410D¹ | 并口继承 | 双iButton DS2401 ID |
DS9097U-009 | 串口 | 供电快速模式RJ-11连接器DS2502 ID |
DS9097U-S09 | 串口 | 供电快速模式RJ-11连接器 |
DS9097U-E25 | 串口 | 供电快速模式RJ-11连接器可写EPROM |
DS1411 | 串口 | 供电快速模式单iButton座 |
DS9097E¹ | 串口继承 | RJ-11连接器可写EPROM |
DS9097¹ | 串口继承 | RJ-11连接器 |
DS1413¹ | 串口继承 | 单iButton座 |
¹不推荐在新设计中使用这些适配器。
TMEX支持的Windows平台
TMEX支持以下Microsoft Windows平台:Windows 2008、Windows 2003、Windows Vista以及Windows XP SP2,包含x86 (32位)和x64 (64位)两种操作系统。请注意,如果需要使用更早版本的Windows操作系统的驱动程序,Maxim网站还提供有TMEX继承版本(但不是主要支持的版本)。请下载4.00或更低版本的
图10列出了TMEX API提供的功能。注:这种API不提供任何无存储器件的专用功能。
会话 |
TMEndSession - 放弃 TMExtendedStartSession - 请求独占 TMValidSession - 检测当前 |
链路 |
TMClose - 为开放端口释放资源(不总是可用)。 TMOneWireCom - 设置 TMOneWireLevel - 设置传输线上某点电平为标准模式(5V弱上拉),供电传输(5V强上拉)或者编程电平(12V EPROM编程电平)。 TMProgramPulse - 向 TMSetup - 检测和验证端口和适配器是否正在运行。 TMTouchBit - 发送并接收 TMTouchByte - 发送并接收 TMTouchReset - 复位 |
网络 |
TMAccess - 选择当前器件并准备执行一条专用器件指令。 TMAutoOverDrive - 设置驱动程序自动地决定器件是否进行快速模式传输。 TMFamilySearchSetup - 设置当前的搜索状态为在下一次搜索(TMNext或TMNextAlarm)中找出指定的家族类型。 TMFirst - 找出 TMFirstAlarm - 找出 TMNext - 找出 TMNextAlarm - 找出 TMOverAccess - 选定当前器件并将其速度设为快速模式传输。 TMRom - 找回或设置当前器件的串口号(ROM编号)。 TMSkipFamily - 跳过最后一次搜索发现的所有家族类型。 TMStrongAccess - 选择和验证当前器件是否存在。 TMStrongAlarmAccess - 选择和验证当前器件是否存在并且处于报警状态。 |
传输 |
TMBlockIO - 在 TMBlockStream - 发送和接收带有NO TMExtendedReadPage - 读取存储区中含有器件产生的CRC校验码的完整的一页(并不适用于所有器件类型)。 TMProgramByte - 将一个字节编入 TMReadPacket - 从存储器的页中读取通用数据包(通用数据包结构的说明请参见应用笔记114:" TMWritePacket - 向存储器的页中写入通用数据包。 |
文件 |
TMAttribute - 更改文件或目录属性。 TMChangeDirectory - 读取或更改当前的工作目录。 TMCloseFile - 关闭已打开或新建的文件以释放文件句柄。 TMCreateFile - 新建一个可写文件。 TMCreateProgramJob - 新建一个写缓冲器以记录EPROM未完成的编程工作。 TMDeleteFile - 删除一个文件。 TMDirectoryMR - 新建或移走一个子目录。 TMDoProgramJob - 写EPROM未完成的编程工作。 TMFirstFile - 找出当前目录下第一个文件。 TMFormat - 格式化 TMNextFile - 找出当前目录下的下一个文件。 TMOpenFile - 打开一个可读文件。 TMReadFile - 读已打开的文件。 TMReNameFile - 改变文件或目录的名称。 TMTerminateAddFile - 结束‘AddFile’,‘AddFile’是EPROM上的一种特殊的文件类型,不用重写就可以打开它。 TMWriteAddFile - 添加或改变EPROM器件上的‘AddFile’。 TMWriteFile - 写已创建的文件。 |
器件 |
无 |
其它 |
TMGetTypeVersion - 获得适配器驱动程序的版本信息。 Get_Version - 获得所有驱动程序的版本。 |
下面的例4是TMEX的代码段,它遵循图3所概括的API使用流程。和上面的三个例子一样,一个简单的程序允许每次循环期间只找出一个
int PortNum, PortType; // port number and type set for adapter present long session_handle; // session handle unsigned char state_buffer[5120]; int doing_work=1, did_setup=0; short rslt; // work loop while (doing_work) { // aquire the1-Wire Net (SESSION) session_handle = TMExtendedStartSession(PortNum,PortType,NULL); if (session_handle > 0) { // check to see if TMSetup has been done once if (!did_setup) { if (TMSetup(session_handle) == 1) did_setup = 1; else { // error setting up port, adapter may not be present // . . . } } else { // find all devices (NETWORK) rslt = TMFirst(session_handle, state_buf); while (rslt > 0) { // do SOMETHING with device found (TRANSPORT/FILE/DEVICE) // . . . // find the next device (NETWORK) rslt = TMNext(session_handle, state_buf); } } // release the1-Wire Net (SESSION) TMEndSession(session_handle); } else { // Could not acquire1-Wire network // . . . } // do other application work // . . . }
安装
TMEX API通过之前提到的
有关
其它工具
本文中所讨论的这些API代表了与
软件授权API
软件授权是应用软件对所需硬件令牌的一种锁定。这里的令牌是一种连接到用户工作站的iButton。在应用软件运行之前,轮询iButton存在与否及其有效性。还可以是在程序执行时不断地查询。实际上,本文提到的任何API都能用于这种应用程序,但也有一些必须注意的问题。由于允许用户替换驱动程序,这些外部的驱动便产生了安全漏洞,从而使锁定失败。构建在
软件授权API的设计是以使用最简单为中心目的,以便更容易地移植到软件开发者现有的代码中。API主要提供三种服务:
- 初始化一个
1-Wire 器件 - 验证器件
- 清除器件(因此系统中不再有有效器件)
有关
软件实例搜索引擎
Maxim不断开发
1-Wire 器件(Thermochron、SHA iButton等)- 平台(Win32、Linux、MxTNI等)
- API (TMEX、
1-Wire 公共资源、1-Wire .NET等) - 编程语言(C、Java、C#、Visual Basic、Delphi等)
搜索结果包括:程序的详细说明和其对应的下载链接。
第三方
有大量的适用于
结束语
本文对各种