利用API控制DS1WM 1-Wire总线主机

网友投稿 284 2022-10-23

利用API控制DS1WM 1-Wire总线主机

摘要:本应用笔记提供了一些利用Maxim API控制DS1WM 1-Wire总线主机的C语言例程。本文讨论的内容基于DS1WM已经设计到

内,主控

通过API调用控制DS1WM。DS1WM通过两个文件(DS1WM.c和DS1WM.h)进行通信,这两个文件构成了API。本文讨论的例程包括:初始化、1-Wire复位、

搜索算法,说明了1-Wire常见功能的使用。假设读者已经了解1-Wire器件、DS1WM 1-Wire主机以及1-Wire总线协议。

引言

DS1WM1-Wire总线主机内部生成1-Wire时序和控制信号,无需CPU产生逐位控制时序。该控制功能使系统程序设计人员能够使用API函数进行程序开发。DS1WM API采用ANSI C语言编写,可以为多种支持ANSI C的微处理器平台所用。以下例程介绍了如何在网络中识别、选择1-Wire从设备,并与其进行通信。

图1. 1-Wire网络总线示例

图1所示的电路配置适用于以下所有示例程序。主机CPU利用DS1WM与带有链路模式和GPIO的1-Wire数字

DS28EA00以及1-Wire 1Kb EEPROM DS2431进行通信。示例程序重点演示API,而非从设备功能。16MHz的系统

通过CLK引脚提供1-Wire主机时序。1-Wire主机的端口引脚需要映射到应用微处理器的引脚。API文件DS1WM.h中包含了引脚映射功能。API头文件中的MaxNumberDevices宏必须更改为实际可能的最大器件数。DS1WM.c API文件中的Re

By

FromRegister和WriteByte2Register函数也需要进行修改,以便正确触发微处理器端口。VPUP电压典型值为5.0V,RPUP不大于2.2kΩ。

概述

通过Maxim支持中心,可以申请免费的DS1WM和API。下面讨论了初始化和1-Wire复位控制的DS1WM代码。此外还提供了一个示例,用于演示如何使用DS1WM ROM搜索引擎确定每个器件的唯一注册码(ROM ID)。使用存储的注册码以及家族码,可以识别每个1-Wire从设备,并通过匹配ROM命令进行访问。家族码列表,请参见应用笔记155:“1-Wire®软件资源指南”。DS28EA00示例演示了如何进行温度转换。第二个示例给出了高速读写DS2431暂存器的两种方法。

总线主机基本操作

微处理器通过触发复位引脚初始化DS1WM,API

执行所有1-Wire通信。示例程序通过调用DS1WM API函数进行工作。由于响应中断时会改变微处理器代码,因此后续示例中采用轮询方式替代中断方式通信。

后续的示例程序中用到了表1所示的1-Wire操作。

表1. 1-Wire操作

*该表涵盖了示例中用到的子程序,详细说明请参见DS1WM.c文件。

初始化

通过初始化DS1WM,启动主机,提供正确的1-Wire总线时序。主机将数值16 (代表频率值)传递至SetClockFrequency函数,将0x90h写入时钟分频

(请参见DS1WM

)。中断使能寄存器设置为0x00h,防止INTR引脚产生中断。上电时,接收缓存可能包含无效值,因此在发送1-Wire命令之前,最好对接收缓存进行清理。启动时对中断寄存器和接收缓存器的读操作将清除其中的各个位。

//----------------------------------------------------------------------------------------------------//Start of initialization exampleSetClockFrequency(16); //Set clock frequency to 16MHz (power-on default)InterruptEnableRegisterWrite(0x00); //Clear interrupts//Flush receive bufferInterruptRegisterData = InterruptRegisterRead();ReceiveBufferRead();//End of initialization example//----------------------------------------------------------------------------------------------------

1-Wire复位(OWReset API函数)

初始化完成后,主机必须确定1-Wire总线上是否接有设备。主机调用OWReset函数,以实现该目的。如果检测到器件存在脉冲,该函数返回1;如果没有检测到器件或发送错误,则函数返回0。如果返回值为0,需要检查ErrorStatus变量,以确定故障状态。1-Wire复位的优先级高于所有1-Wire命令(例如,Match ROM、Skip ROM、Read ROM),但调用OWSearch函数时除外,该函数自身带有复位。软件设计人员应当在程序中加入适当的故障处理代码,在发生故障时能够触发执行这些代码。ErrorStatus值意味着发生了如下错误中的一种:没有进行在线检测;没有检测到器件;存在1-Wire

;1-Wire总线始终处于低电平状态。

利用ROM搜索引擎确定ROM ID

总线上的每个1-Wire设备都必须进行识别。存储在每个1-Wire器件中的唯一64位ROM ID用于选择各个器件,并根据家族码识别器件类型。为降低例程的复杂度,采用8位家族码识别DS28EA00和DS2431。

注意:如果1-Wire总线上连接了不止一种器件类型(例如,具有相同的家族码),则后续的方法无法对器件进行识别。不对总线上的多个1-Wire器件进行识别,则无法对特定的1-Wire器件发送功能命令。如果使用了两个或更多的类似器件,则必须通过查找表才能正确访问特定器件。

调用OWSearch函数可以识别总线上所有的1-Wire器件,该函数将8字节ROM ID排成一列。这期间无需调用OWReset函数,因为该函数已经包含在OWSearch函数中。OWSearch函数例外的包含了OWReset函数,是因为其搜索算法具有迭代过程。OWSearch函数的返回值为搜索到的1-Wire器件个数,并将每个64位ROM ID写入一个名为ROMCodes的二维数组。

下列例程仅演示了调用一次OWSearch的情况,因此后续连接至该1-Wire总线的器件将无法通过该代码进行识别。OWSearch函数成功执行后将返回搜索到的器件个数。如果搜索失败,ErrorStatus变量将返回错误值,其中包括产生OWReset的故障条件。搜索成功后,对ROMCodes数组进行了遍历,并保存每个器件的数组索引。这种器件索引方式是通过比较搜索到的每个器件的家族码实现的。随后调用数组索引,可以实现与搜索到的特定1-Wire器件进行通信。这相当于创建了一个简单的链表(注:可以通过指针进行操作)。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java泛型T,E,K,V,N,?与Object区别和含义
下一篇:华为云arm架构docker启动redis报错:<jemalloc>: Unsupported system page size
相关文章

 发表评论

暂时没有评论,来抢沙发吧~