本应用笔记讨论了为有兴趣为应用笔记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例程。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !