一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

使用PC机和DS3900与ds1267、ds1867、ds1868通信

来源:analog 发布时间:2023-12-12

摘要: DS1267, DS1867和DS1868是数字电位器,使用独特的3线协议,很难与PC接口。本应用笔记提供了一个简单的硬件/软件PC接口来编程这些设备。

本应用说明描述了如何使用DS3900 PC串口到3线接口与三个数字端口DS1267、DS1867和DS1868进行通信,这三个数字端口使用这个移位寄存器接口进行编程。DS3900是一个具有MAX3223 RS-232收发器和微处理器的模块,微处理器充当PC串行端口与被控制的3线设备之间的接口。收发器允许模块的微处理器与PC机通信,微处理器通过并行端口实现命令结构,允许PC机读取或写入三个数字电位器。应用说明描述了DS3900以及如何将其连接到被测设备。本文中描述的源代码可在Dallas Semiconductor的FTP站点上获得。

介绍

DS1267, DS1867和DS1868是数字电位器,使用独特的3线协议,很难与PC接口。本应用笔记提供了一个简单的硬件/软件解决方案来生成一个PC接口来调整电位器设置和示例c++算法来读取和写入这些设备。图1所示的软件及其源代码可在Devices站点上获得。


图1所示。设备3线评估软件(DS3wire.exe)。

硬件

为此应用程序生成的硬件使用DS3900与ic通信。DS3900是一个具有MAX3223 RS232收发器和微处理器的模块。收发器允许模块的微处理器与PC通信,微处理器实现命令结构,允许PC读取或写入模块上的任何I/O引脚。除DS3900和3线制IC外,还应使用去耦电容来降低由DS3900和电位器数字接口引起的V(CC)上的噪声。图2显示了使用DS3900和DS3Wire应用程序与3线设备通信所需的连接。


图2。DS3Wire应用原理图。

软件

图1所示的软件有三个主要例程;DS3900和对话框的初始化(OnInitDialog),读取17位寄存器(OnRead),写入17位寄存器(OnWrite)。这些例程是使用一个名为“CdsPic”的c++类实现的。CdsPic包含子程序,允许预先编写和测试RS232/DS3900代码用于创建3线算法。DS3Wire应用程序中CdsPic类的实例称为“DS3900”。CdsPic类和RS232功能可在设备站点上为任何可能感兴趣的人提供。对于那些对DS3900实现的细节不感兴趣的人来说,函数名是通用的,足以被视为伪代码。表1列出了一些示例函数名及其描述,以供参考。

表1。CdsPic成员函数示例
例子描述
DS3900.BoardPresent如果在CdsPic类初始化代码期间检测到DS3900则返回TRUE,如果未检测到DS3900则返回FALSE。
DS3900.Write1(真正的)引脚P1被设置为输出并强制其高电平。如果在通信过程中未检测到错误,则返回TRUE。
DS3900.Write1(假)引脚P1被设置为输出并强制其低电平。如果在通信过程中未检测到错误,则返回TRUE。
DS3900.Read1(状态)引脚P1被设置为输入,读取,并且P1的输入电平返回给布尔变量“state”。如果在通信过程中未检测到错误,则返回TRUE。
DS3900Read4(状态)引脚P4被设置为输入、读取,并且P4的输入电平返回给布尔变量“state”。如果在通信过程中未检测到错误,则返回TRUE。

电话基本知识


这个特定版本的3线接口是最容易理解的,如果它被视为一个17位移位寄存器,具有两个控制信号,时钟(CLK)和移位使能(“激活-低RST”),以及两个数据信号,数据输入(DQ)和数据输出(C(out))。active-low RST值高时,接口不复位;因此,移位寄存器是启用的。当“活动-低RST”为高时,接收到的CLK上的任何正边将导致移位寄存器将所有数据移位一个位置,将DQ的现值移动到第一个位置。这种移位也会改变C(OUT)的值,它总是显示寄存器中第17位的当前值。一旦所有17位数据被转移到设备中,复位信号就会降低,这将把新的设置转移到控制电位器位置的寄存器中,并禁用3线接口。

C(OUT)引脚的设计目的是提供在同一3线总线上级联多个3线设备的能力,但它确实提供对移位寄存器的读访问。通过使能接口(将“active-low RST”设置为高)并将移位寄存器中的17位时钟调到C(OUT),每次可以读取一个位来执行读操作。当“active-low RST”被取消激活时,移位寄存器中的值将是DQ在读取周期中写入设备的值,因为数据在被移出时正在被移入设备。这需要在每个时钟脉冲启动之前将DQ重写为C(OUT)的当前值,否则读取操作将具有破坏性。当“激活-低RST”被停用时,破坏性读操作将导致电位器改变位置。

这个接口有两个主要问题需要避免:

  1. 部分写(移动少于17位)将产生移位寄存器垃圾,这是前一个数据和新数据的产物。因此,如果不写入所有17位,就不可能改变一个电阻器的值。

  2. 除非从移位寄存器移出的数据被旋转回移位寄存器,否则读函数是破坏性的。


第一个问题很容易解决,不要执行部分写入。第二个问题可以通过两种不同的方式解决。数据表显示使用一个反馈电阻(10k欧姆),它将自动将C(OUT)的值写入DQ,除非DQ在写入周期中由输出驱动。虽然这可以用DS3900实现,但该设计是用C(OUT)驱动单独的输入引脚实现的。这演示了在不能使用反馈电阻时如何实现接口。微处理器,或DS3900在这种情况下,将不得不在固件/软件中执行反馈电阻的功能。当一个值在C(OUT)上被读取时,它将在3线设备被时钟化之前被写入DQ。

当反馈电阻不能使用时,最常见的情况是当3线设备连接到开路采集器I/O端口时。开路集电极I/O引脚将有一个上拉电阻输出高电压电平。这个电阻将与反馈电阻竞争。如果反馈电阻小于上拉,则C(OUT)将始终写入DQ,包括在写周期期间,当意图是向设备写入新值时。如果反馈电阻大于上拉,DQ在读取期间总是很高。


OnInitDialog


OnInitDialog是Windows用来初始化对话框的函数。如果使用Microsoft Developer Studio生成对话框,其中一个对话框构造选项会在代码中为程序员留下注释。这将在这个函数的末尾留下一个“TODO”注释,说明在这里放置额外的初始化代码。

在本例中添加了以下代码,以确保DS3900正确上电,将CLK和“低激活RST”设置为低电平,并使用电位器的当前位置初始化编辑框。如果未检测到DS3900,则会通知用户一条错误消息。

// TODO:在这里添加额外的初始化<- developer Studio Comments if(DS3900.BoardPresent ) // <- BoardPresent 检查DS3900 {// <- if found path m_sEDIT_Status= "DS3900 found !";//新的状态信息,所有的系统进入DS3900.Write1(false);//初始化时钟DS3900.Write2(false);//初始化reset OnRead ;//读取和更新编辑框}else {// <-如果没有找到路径m_sEDIT_Status = "DS3900没有找到!@#$";//新的状态信息,错误检测UpdateData(FALSE);//更新对话框值消息框("DS3900未找到检查电源和串行电缆启动应用程序","DS3900错误");}

图3。额外的初始化代码添加到OnInitDialog函数

OnRead


OnRead函数读取17位移位寄存器。它在读取按钮被按下和OnInitDialog期间执行。该算法假设C(OUT)引脚连接到一个单独的DS3900输入,如图2所示。这需要软件在3线设备被时钟之前将C(OUT)上读取的值写入DQ,否则在读取操作期间会无意中调整电位器。图4显示了应用程序使用的算法。除了重新生成17位外,它还将数据重构为表示Pot0、Pot1和堆栈选择位的变量,并使用UpdateData(FALSE)函数更新对话框。从PC到DS3900的每次传输都被监视是否有错误,任何对通信的干扰都将导致交易终止和错误消息。如果没有错误,则在状态框中显示“读取成功”。此函数执行大约需要95ms,尽管结果可能因所使用PC的速度而异。

void OnRead {//子程序使用的变量int success;bool一点;Unsigned char mask=0x80;Unsigned char =0;Unsigned char pot1=0;if(DS3900. boardpresent ) //只读取如果DS3900找到{success = DS3900. write2 (true);// Pull reset high if(success) // Abort如果通信失败读取。{success += DS3900.Read5(bit);// Read Cout(栈位优先)success += DS3900.Write4(bit);//复制读内容到DQ成功+= DS3900.Write1(true);//时钟位成功+= DS3900.Write1(false);//时钟位m_R O_Stack = bit;// <-Update对话框变量if(success == 5) //中止通信失败时读取。{for(int x = 0;X <8;//锅1读循环{success += DS3900.Read5(bit);// Read Cout(栈位优先)success += DS3900.Write4(bit);//复制读内容到DQ成功+= DS3900.Write1(true);//时钟位成功+= DS3900.Write1(false);//时钟位if(bit) //如果位设置,则设置端口变量pot1的位|=掩码;Mask = Mask >>1;//为下一个通道调整掩码}m_ucEDIT_Pot1 = pot1;// <-更新对话框变量掩码=0x80;//重置掩码(int y = 0;Y <8;y++) //锅0读循环{success += DS3900.Read5(bit);// Read Cout(栈位优先)success += DS3900.Write4(bit);//复制读内容到DQ成功+= DS3900.Write1(true);//时钟位成功+= DS3900.Write1(false);//时钟位if(bit) //如果位设置,则设置端口变量pot0的位|=掩码;Mask = Mask >>1;//为下一个通道调整掩码}m_ucEDIT_Pot0 = pot0;// <-更新对话框变量}}success += DS3900.Write2(false);// Pull reset low if(success == 70) //判断通信是否失败m_sEDIT_Status = " success Read";//成功消息else m_sEDIT_Status = "读取失败";// UpdateData(FALSE);// <-触发对话框更新}

图4。OnRead函数

注意,读算法的最后一个if语句更新了对话框的状态消息。如果DS3900初始化成功,这将在显示对话框之前用“成功读取”覆盖初始化的“DS3900 Found!”消息。


OnWrite


OnWrite函数读取用户输入到对话框中的值,并将其写入3线设备。要读取对话框的值,需要调用UpdateData(TRUE)函数。除了重新生成数据之外,UpdateData(TRUE)还将ASCII字符串转换为电位器寄存器的无符号字符,并将堆栈选择位的r / o按钮转换为整数值。这些值自动存储在m_ucEDIT_Pot0、m_ucEDIT_Pot1和m_R O_Stack变量中。在读取新的所需设置后,写入算法指示DS3900每次发送一个位的17位数据。

在写入过程中,对DS3900的通信进行监视,以防出现错误,“success”变量保持成功数据传输次数的运行总数。如果对DS3900的每次读/写操作都成功,程序将更新状态框,使其显示“写成功”;否则,它将中止该命令并返回一条错误消息。该函数执行时间约为70ms,如图5所示。

void OnWrite {UpdateData(TRUE);//读取对话框的值//子程序使用的变量int success;Unsigned char mask = 0x80;unsigned char po0 = m_ucedit_po0;unsigned char pot1 = m_ucEDIT_Pot1;Bool bit = false;if(m_R O_Stack) //将堆栈选择位放入"bit"变量。Bit = true;if(DS3900. boardpresent ) //只写如果DS3900找到{success = DS3900. write2 (true);// Pull reset high if(success) //如果comm. fail {success += DS3900.Write4(bit);//写入堆栈select bit success += DS3900.Write1(true);//时钟位成功+= DS3900.Write1(false);//时钟位if(success == 4) //如果comm. fail {for(int x = 0;X <8;x++) //循环槽1的8位{if(槽1 &= DS3900.Write4(true);else success += DS3900.Write4(false);success += DS3900.Write1(true);//时钟位成功+= DS3900.Write1(false);//时钟掩码= mask >>1;//调整掩码到下一个位置}mask = 0x80;//重置掩码(int y = 0;Y <8;y++) //循环8位的锅0 {if(锅0 &= DS3900.Write4(true);else success += DS3900.Write4(false);success += DS3900.Write1(true);//时钟位成功+= DS3900.Write1(false);//时钟掩码= mask >>1;//调整掩码到下一个位置。}}} success += DS3900.Write2(false);// Pull reset low} if(success == 53) // Comm. Pass/Fail通知。m_sEDIT_Status = "写入成功";//传递消息else m_sEDIT_Status = "Write Failed";// UpdateData(FALSE);// <-触发对话框更新}

图5。OnWrite函数

结论

本应用笔记提供了一个简单的c++算法,用于使用DS3900读取和写入包含17位移位寄存器的3线设备。写操作大约需要70ms,而不使用反馈电阻的读操作大约需要95ms来执行。虽然相对于3线接口的最大数据速率来说,这并不快,但它足以评估电位器。图1所示的软件可以在这里下载。

注意:本软件“按原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵权的保证。在任何情况下,达拉斯半导体都不承担任何索赔、损害赔偿或其他责任,无论是合同诉讼、侵权行为还是其他行为,都是由软件或软件的使用或其他交易引起的。



声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: