用C语言编写并行端口2线软件

描述

本应用笔记讨论了为有兴趣为应用笔记AN2中所述的并行端口硬件开发3230-Wire软件的客户提供的C源代码。源代码可在达拉斯半导体的FTP站点上免费获得,并且可以在任何使用Windows 95或Windows 98操作系统的PC上运行。此外,FTP站点上还提供了一个简单的Windows程序,该程序提供了基本的2-Wire通信软件,可用于简单评估和调试并行端口硬件。有关硬件的详细信息,请参阅 AN3230。®

本应用说明中介绍的软件是免费的,并“按原样”提供给我们的客户使用。达拉斯半导体对软件可能造成的任何损害不承担任何责任。使用该软件的风险由您自行承担。

软件要求

如介绍中所述,该程序必须在装有Windows 95或Windows 98操作系统的PC上运行。此软件直接访问并行端口,基于 Windows NT 的操作系统需要驱动程序才能完成此任务。

此外,还有多种并行端口操作模式,其中一些与软件不兼容。已成功使用的两种模式是 EPP 和 ECP。大多数PC的并行端口模式都可以在BIOS设置中更改。

源代码描述/用途

源代码(见附录A)是用ANSI C编写的,因此它应该与任何C编译器兼容。为了使它的使用尽可能简单,所有代码和声明都在一个文件(2wire.c)中,因此没有一个头文件也必须包含在项目中才能使用资源。

要使用2-Wire源代码:

将“2wire.c”文件放入项目目录中。

在将访问并行端口的程序顶部添加一个#include“2wire.c”声明。

调用 ParPortSelect(1) 来选择并行端口。该参数确定将使用的端口号(例如,如图所示的 LPT1)。有效端口号为 1、2 和 3。大多数PC将使用LPT1。

使用表2所示的ChangeDelayCount(int i)命令校准3-Wire接口时序。

调用基本2-Wire函数或多字节2-Wire函数,如表1和表2所述。

并行端口时序在很大程度上取决于执行软件的PC的速度,因此计算机之间的差异会使建立可靠的通信变得困难。为了解决此问题,在 SDA 和 SCL 信号之间插入可变长度延迟,以确保速度较快的计算机上的计时不超过最大额定接口速度(快速模式设备为 400kbits/秒)。延迟时间通过调用 ChangeDelayCount(int i) 函数来控制。此函数更改 PC 执行短延迟的次数(10 NOP + a for( ; ; ) 循环的执行时间)。i 的默认值为 1000,在 P3 600MHz 计算机上提供中等到慢速通信。这将导致大多数PC上的中等性能,但它应该可靠地工作。较低的i值将加快接口速度,但编程人员必须确保通信速度在2-Wire器件的规格范围内。在速度较快的机器上,可能需要更大的值 i 才能建立通信,因此如果需要调试,则需要检查这一点。

基本的2-Wire功能可用于大多数应用访问2-Wire器件。发送启动条件、写入和读取字节以及发送停止条件的机制已在这些例程中处理,仅将例程的调用时间和顺序作为与设备通信的最后剩余障碍。要使用这些例程,请如上所述调整时序,并阅读器件的数据手册,以确定对访问寄存器的调用顺序。

多字节2-Wire功能可用于通过一个命令从器件读取和写入多达256字节的信息,但并非所有器件在通信期间都使用相同的数据序列。如果考虑使用这些函数,请检查提供的源代码,以确保它们与正在访问的设备兼容。多字节写入/读取的主要优点是它限制了应用程序所需的调用次数,因为它使用单个命令传输多个字节,而不是发送多个命令来写入/读取单个字节。多字节写入和读取例程使用 SetSlaveAddress() 命令设置的设备地址,因此在使用多字节写入和读取命令之前必须调用 SetSlaveAddress()。

LED 使能和禁用功能允许将 AN3230 中显示的 LED 用作状态指示灯。频闪设置和清除功能允许使用 LED 引脚触发示波器。这些函数对于调试硬件和软件问题非常有用。

 

功能原型 功能说明 返回值
int 开始() 产生 2 线启动条件。也可以调用以生成重新启动条件。 1
int Stop() 产生 2 线停止条件 1
int WriteData(unsigned char ucData); 将参数写入从属服务器 如果从站确认,则为
1,如果从属服务器不确认,则为 0
int ReadDataAck(unsigned char *ucData); 从从站读取数据字节到 ucData 并确认 1
int ReadDataNack(unsigned char *ucData); 从从属服务器读取数据字节到 ucData 并且不确认 1
int ResetBus() 时钟 SCL 9 次,然后生成停止条件 1
功能原型 功能说明 返回值
int SetSlaveAddress(unsigned char ucADDR) 设置多字节读写访问的从地址 1
int WriteBytes(int iCount, unsigned char ucMemAddr, unsigned char ucData[256]) 将 iCount 字节写入 SetSlaveAddress() 设置的设备地址,从 ucMemAddr 设置的内存地址开始。 如果从站确认,则为
1,如果从站不确认任何字节,则为 0。
Int ReadBytes(int iCount, unsigned char ucMemAddr, unsigned char ucData[256]) 从 ucMemAddr 设置的内存地址开始,在 SetSlaveAddress() 设置的设备地址处读取 iCount 字节。 如果从属在命令写入期间确认,则为
1,如果从属在命令写入期间不确认,则为 0。
功能原型 功能说明 返回值
int ParPortSelect(int iLPT) 将并行端口访问变量设置为指定的端口号。对于 LPT1,iLPT = 1。 1 表示成功更改
0 表示失败
int ChangeDelayCount(int iCount) 这决定了在 SDA 和 SCL 通信期间与 DelayASMx10() 命令一起使用的“i”值。使用较高的 i 值调用此函数以使通信速度变慢。默认值为 1000,应提供中等到较慢的通信速度。这是 i 的安全值。大多数PC将能够使用较低的i值来加快通信速度。 1
无效延迟ASMx10(int i) 每个 i 延迟 10 个时钟周期。这称为确定 SDA 和 SCL 计时的延迟。它不需要由软件开发人员调用,它已经嵌入到启动/停止/读/写命令中。
int EnableLED() 使能 AN3230 电路中的 LED 1
int 禁用指示灯() 禁用 AN3230 电路中的 LED 1
int SetStrobe() 将 AN3230 电路中的 LED 引脚设置为高电平,以便示波器触发 1
int ClearStrobe() 将 AN3230 电路中的 LED 引脚设置为低电平,以便示波器触发 1

 

基本2线功能示例

本节介绍如何将两个字节写入DS1086 DAC寄存器,然后使用基本的2-Wire功能读回。DS1086的从地址为B0h,DAC寄存器为2字节,从存储器地址08h开始。

要将 0180h 写入地址 08h 和 09h,可以使用以下过程。

 

unsigned char fail = 0;

Start();                   // Generates Start Condition
fail |= !WriteData(0xB0);  // Writes the slave address
fail |= !WriteData(0x08);  // Writes the memory address of the DAC register
fail |= !WriteData(0x01);  // Writes the MSB of the DAC register
fail |= !WriteData(0x80);  // Writes the LSB of the DAC register
Stop();                    // Generates Stop Condition
if(fail == 1)
      Error("Device failed to acknowledge during write attempt");

若要读取刚刚写入 DAC 寄存器的字节,可以使用以下代码。

unsigned char ucDataMSB=0;        // define variable for MSB data to be stored after the read
unsigned char ucDataLSB=0;        // define variable for LSB data to be stored after the read
unsigned char fail = 0;

Start();                          // Generate Start Condition
fail |= !WriteData(0xB0);         // Write the slave address, LSbit=0 to signify write byte
fail |= !WriteData(0x08);         // Write the memory address of the DAC register
Start();                          // Generates a re-start condition
WriteData(0xB1);                  // Writes the slave address, LSbit=1 to signify read byte
ReadDataAck(&ucDataMSB);          // Reads the MSB of DAC and sends acknowledgement to the slave
ReadDataNack(&ucDataLSB);         // Reads the LSB of DAC and does not acknowledge the slave
Stop();                           // Generates Stop Condition
if(fail ==1)
      Error("Device failed to acknowledge during read attempt");
 

视窗并行端口2线软件

图1所示的软件是为了演示“2wire.c”软件的基本功能而编写的,也可用于调试AN3230硬件。

源代码

图1.Windows并行端口到2-Wire软件的示例。

该软件可以与“并行端口选择”部分中列出的 3 个并行端口中的任何一个进行通信。

2-Wire函数部分中的按钮只需接受对话框中的参数,然后调用相应的“2wire.c”函数。Start 生成一个启动条件,写入数据将按钮右侧框中的参数写入从站。两个读取按钮都从从站读取一个字节,但一个确认数据传输,另一个不确认数据传输。停止按钮生成停止条件。写入字节按钮在LSbit设置为零时写入2-Wire器件地址框中的值,读取按钮在LSbit设置为<>时写入相同的值。这些按钮允许写入数据按钮用于数据和存储器地址,而不必在每次访问器件时频繁地将其中一个值更改为从地址。

单字节写入将单个数据字节(Data)传输到2-Wire器件地址框中列出的从地址,位于Addr框中列出的存储器地址处。

2字节从<>线器件地址盒中列出的从地址从“地址”从“地址”框中列出的存储器地址读取一个字节。对话框将在不确认的情况下读取,以指示它只读取一个字节。

双字节写入将两个数据字节(数据MSB和数据LSB)传输到2-Wire器件地址框中列出的从地址,位于Addr框中列出的存储器地址。

双字节读取从机读取从机的两个数据字节,从2-Wire器件地址框中列出的从地址开始,从“地址”框中列出的存储器地址开始。对话框将确认第一个数据字节读取,但不确认第二个数据字节读取。

“查找地址”按钮写入2-Wire总线(00h-FEh)上的每个从地址,检查确认地址以确定哪些地址具有从地址。响应确认的地址将列在状态框中。该按钮可用于确定AN3230硬件设置是否正确,以及能够接收数据的从机是否连接到2-Wire总线。

Comm. Delay 按钮调用 ChangeDelayCount() 函数,并将按钮右侧的整数作为参数。这可用于调整2-Wire接口的时序。

LED 按钮启用和禁用 AN3230 电路中显示的指示 LED。选通使能使软件在单字节和双字节写/读功能之前将LED引脚设置为高电平,并在通信结束后将LED引脚设置为低电平。

“测试”按钮执行环回测试,确保当SDA输出设置为低电平时,SDA输入读数为低电平,同样,对于高电平条件也是如此。它还测试LED引脚是否可以设置为低电平和高电平,暂停足够长的时间,以便用户看到LED闪烁然后熄灭。

上面列出的所有命令都在“状态”窗口中提供用户反馈。

结论

本应用笔记演示了使用AN2所示的并行端口2-Wire电路以及“3230wire.c”文件中提供的源代码对2-Wire器件进行编程的简便性。“2wire.c”中的例程执行信令功能,使程序员能够专注于调整接口时序,并按照2-Wire器件数据手册中概述的正确通信顺序调用2-Wire例程。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分