GPIB 注意事项(sn75als160+sn75als162)

#记录项目经验和复盘
本文的作者,通过借鉴GITHUB的开源代码,同时借鉴了中国知网几位硕士研究生(杨翠翠/许诚昕/高玉栋/)的论文,以及《IEC_60488_1_2004_IEEE 488.1》,《中华人民共和国国家标准GB/T 1 5946--2008/IEC 60488-1:2004》,完成了公司安排的任务,所以分享经验,记录成长。

本文章借鉴了GITHUB 上开源的gpib 代码,链接:
”gpib“ 的搜索结果 | GitHub 中文社区

1..如果要把机器配置成可说可听,

要在代码里面设置哪些功能?
除了C 之外的全部。

2. 在上位机扫描设备的时候,机器并未发送并行轮询响应,为什么控者还是能扫描到公司机器?
 

因为在将公司仪器设置成

侦听者的时候,NDAC被拉低了很长一段时间来应答控制者

3.1  因为GPIB 接口电平识别的特性,所以输出的DAV, GPIB_OUTPUT,EOI, SRQ_out

都是取反后输出。

为了还原输出的电平,所以这些信号被输入的时候,也要被取反。

(因为电平识别是相反的,1被识别成低电平,所以输出要先取反,保证信号被硬件识别;因为取反后输出,所以输入也要取反,才能还原原来的电平。)

输出要取反:

 DAV    <= not gpib_DAV_out when TE  else 'Z';

 DAV_in   <= DAV;

输入也要取反:

 gpib_DAV_in   <= not gSync_DAV_out;

3.2 但是NDAC/NRFD的输入输出都不用取反,因为NFRD为0,表示的是RFD有效,能直接被GPIB 接口电平识别,所以RFD报文直接赋值给NFRD,不用输入输出取反。
4.如何确定GPIB 的时钟频率?见右图:公司的机器,在AH功能的ST_ACDS 状态(备注:在逻辑分析仪上看到的NRFD/NDAC 信号,是1就是RFD/DAC 报文为真,是0就是NRFD/NDAC 报文为假。),也就是A1 - A2间隔部分,计数2次用了190ns, 也就是说,只要ST_ACDS 状态持续时间超过190ns,就能满足时序要求。因为时钟频率越大,时钟周期越短,所以推测出时钟频率要大于:1*10^9 / (190 /2 )= 5.26 mhz,所以时钟频率选择4mhz。

5.板子的电路,是三态门的,要怎么设置5管理线的方向?

5.1. 因为没有控制(C)功能,所以 SRQ 信号全部设置成输出。

5.2. 因为没有控制(C)功能,所以 IFC   信号全部设置成输入。

5.3. 因为没有控制(C)功能,所以 ATN 信号全部设置成输入。

5.4. 因为没有控制(C)功能,所以 REN 信号全部设置成输入。

5.5. 因为EIO可以由控者发出,也可以由讲者发出,所以 EIO 信号需要设置成三态。

7.代码修改记录

7.1   去掉gpibInterface模块 C 功能

7.2   去掉InterruptGenerator模块

7.3   去掉WriterControlReg1模块

7.4   去掉ReaderControlReg1模块

7.5   去掉GpibStatusReg模块

7.6   去掉gpibBusReg模块

8.如何理解LE/TE 功能的副地址?
所谓副地址,就是GPIB 设备的另外一个地址,就是同一个GPIB 设备,可以用到2个不同的地址来表示。

9.如何理解串行轮询的请求服务?
 

串行轮询是,某一个设备通过拉高rsv 来输出SRQ 线为高,所以总线会发起串行轮询序列,来确认是哪一个设备输出SRQ 线为高,直到确认是哪一个设备发起的服务请求,否则会一直发起SPE 多线报文的串行轮询序列。

 

GPIB-232的转换制作讲解 488标准规定是协议,而对其实现的方法并没有规定,那么如何制作实现一个GPIB的模块呢?主要的实现方法有三种:一、用分立逻辑器件搭建,早期的GPIB实现方法,成本高,而且可靠性不好;二、用集成专用GPIB芯片,使用方便,易于集成,比如ISA、PCI的GPIB卡都是这种方法,但价格比较贵,不易DIY,网上有很多的二手GPIB卡,主要分为两种类型:ISA总线、PCI总线的。如果是ISA则必须是老式的电脑主板有ISA总线插槽才能用,这类电脑基本已被淘汰;而PCI的GPIB卡基本在600元以上,不同品牌价格有点差别,这就限制了GPIB卡的普及;三、用MCU纯软件完成,由于GPIB逻辑复杂,所以做起来有点麻烦,而且不容易完全符合GPIB的标准,但成本低,容易DIY。 为了实现本人手中几个有GPIB设备的自动测试功能,本人参考了相关资料,用MCU实现了软件的GPIB采集卡。如下图: 当然,光有这个GPIB卡还不行,还要有相关的采集软件,这个卡实现的是GPIB转232,所以上位机的软件主要功能是发送、接收和存储232接口的信号。软件界面如下图: 主要可实现如下功能: 一、 可以发送GPIB的命令,控制仪器的工作,不同仪器的命令有点不同,不过也大同小异。如图上所示的_?6,F1R16STG是发送给HP3456A六位半万用表的命令,实现以下功能:设置成DCV(F1),自动量程(R1),六位半显示(6STG),6是3456A的地址代表十进制的22。 二、 实时显示万用表发送的测量数据,并可保存成TXT格式的文件,当文件的大小达到一定时,可自动保存到指定目录的指定文件,并加上保存时间,方便日后分析。 三、 其它的辅助功能:悬浮显示、接收数量、暂停/继续、通信格式、串口选择等。 四、 支持同时多任务采集(多个卡连接到多个仪器),支持232转USB与计算机相连。 更多设计说明,详见附件原文出处。
<think>好的,我现在需要帮助用户找到关于NI VISA中GPIB::INTFC类型设备使用viReadAsync的示例代码和注意事项。首先,我得回忆一下NI VISA的相关知识。用户提到了GPIB::INTFC,这通常指的是GPIB接口控制器本身,而不是连接的仪器设备。这种情况下,viReadAsync用于异步读取接口的消息或状态,可能需要处理特定的返回数据格式。 接下来,用户需要示例代码。我记得在NI的文档或示例程序中,可能有相关的代码片段,但需要确认是否正确适用于INTFC类型设备。同时,用户可能在使用异步读取时需要注意回调函数的处理、资源释放以及超时设置等问题。 然后,考虑到用户之前提到的引用内容,比如VISA支持的转换代码和Connection Expert的例子程序,但这些可能不直接相关。不过,我需要确保示例代码中的格式符合VISA的规范,比如正确使用viReadAsync函数和参数。 注意事项方面,异步操作需要正确管理会话和事件处理,避免资源泄漏。GPIB接口控制器可能有特定的数据格式,比如二进制或状态字节,用户需要根据手册解析数据。超时设置也很重要,防止程序挂起。 最后,生成相关问题时要围绕GPIB::INTFC的异步操作、VISA函数使用差异、调试工具以及错误处理等方面。确保问题对用户进一步探索有帮助,同时引导他们查阅官方文档以获得准确信息。</think>以下是为您整理的关于NI VISA GPIB::INTFC类型设备使用$viReadAsync$的示例代码和注意事项: ### 示例代码(C语言) ```c ViSession vi; ViStatus status; ViUInt32 retCnt; ViChar buffer[256] = {0}; ViPEventType eventType; // 打开GPIB接口控制器会话(假设逻辑地址为0) status = viOpenDefaultRM(&defaultRM); status = viOpen(defaultRM, "GPIB::INTFC::0::INSTR", VI_NULL, VI_NULL, &vi); // 配置异步读取 status = viReadAsync(vi, buffer, sizeof(buffer), &eventType); // 处理其他任务... // 等待异步操作完成(超时设置为5000ms) status = viWaitOnEvent(vi, VI_EVENT_IO_COMPLETION, 5000, &eventType, &retCnt); // 验证读取结果 if (status == VI_SUCCESS_TERM_EN) { printf("Received %d bytes: %s\n", retCnt, buffer); } // 清除事件队列 viDiscardEvents(vi, VI_ALL_ENABLED_EVENTS, VI_QUEUE); // 关闭会话 viClose(vi); viClose(defaultRM); ``` ### 关键注意事项 1. **设备地址格式**: - 使用$GPIB::INTFC::<逻辑地址>::INSTR$格式访问接口控制器 - 逻辑地址通常为0(默认接口地址)[^2] 2. **数据格式处理**: - 接口控制器返回的数据可能是二进制状态信息 - 建议使用$viReadSTB$获取状态字节作为补充验证 3. **异步操作管理**: - 必须调用$viWaitOnEvent$等待操作完成 - 完成事件类型为$VI_EVENT_IO_COMPLETION$ - 使用$viDiscardEvents$清除残留事件 4. **错误处理规范**: ```c if (status < VI_SUCCESS) { viStatusDesc(vi, status, errDesc); printf("Error: %s\n", errDesc); } ``` 推荐在关键操作后添加错误描述获取[^1] 5. **资源释放**: - 异步操作未完成时调用$viClose$会导致内存泄漏 - 建议使用$viTerminate$终止未完成操作
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值