通过以下三句实现操作寄存器的写操作:
checkErr( Ivi_LockSession (vi, VI_NULL));
io = Ivi_IOSession(vi);
viCheckErr(viOut16 (io, VI_A16_SPACE, 0x06,zhuangtai_in));
Write_ControlREG函数原型为ViStatus_VI_FUNC CSY_WRITE_ControlREG (ViSession vi, ViInt16 control),程序实现过程与Write_OperateREG函数类似。
3.2.4 对弹丸个数读取寄存器添加函数
Read_GeshuReg函数原型为ViStatus _VI_FUNC CSY_READ_GeshuReg (ViSession vi, int *ge_shu),其中vi同样是仪器句柄,指针*ge_shu是读取的个数返回值。
图 3-4 弹丸个数读取驱动程序流程图
个数读取流程图如图3.4取的数据是在弹丸过靶结束后,存储器地址变化模块输出的最后一个地址,并不是真正的数据个数。从上文对存储器地址产生模块的分析中可以看出,从存储器的第三个单元存储的才是真正的弹丸数据值,而每个弹丸数据值又由两个单元来存储(计数器溢出次数,溢出后的余数),所以如果从个数寄存器读取的数值为n,那么,弹丸的个数应为(n-2)/2。经过这一处理后,将真正的弹丸数送到指针ge_shu输出。此处仍用VISA资源管理函数实现对弹丸个数寄存器的读取。当然弹丸个数寄存器的读取也可以由CSY_ATTR_Geshu属性获得函数实现,即Ivi_GetAttributeViInt32 (vi, "",CSY_ATTR_Geshu, 0, n)。
3.2.5 对存储器数据寄存器添加读取函数
READ_DATA函数原型为ViStatus _VI_FUNC CSY_READ_DATA (ViSession vi, int zhu_fu, ViInt16 addr, int *d_out)
图3-6 驱动器中单个数据读取流程图
其中zhu_fu用于选择是对主存储器进行读取还是对辅存储器进行读取,addr表示要读取的存储器的地址,指针d_out为输出参数,输出在存储单元中读取的值。注意,此函数一次只能读取存储器一个存储单元的值,读取流程图如3-6所示。
因为在弹丸过靶的过程中是通过FPGA中的存储器地址产生模块提供存储器地址信号的,而当上位机对存储器进行读取的时候,显然不能再使用硬件产生地址,而应使用上位机发送来的地址信号,所以此处要给出存储器地址产生方式切换信号,此信号由控制寄存器的D11(对应主存储器)、D10(对应辅存储器)给出,可以参见控制寄存器各位定义。
图 3-7 读取主存储器数据流程图
READ_DATA_zhu函数原型为ViStatus _VI_FUNC CSY_READ_DATA_zhu (ViSession vi, int geShu, int d_zhu[]),它与上述的READ_DATA函数主要区别在于此函数可以一次性读取主储存器中此次存储的所有弹丸数据值。其中geShu为输入参数,输入要读取的个数值,即个数读取寄存器给出的数值,若弹丸个数(即Read_GeshuReg函数中读取的个数值)为n,则geShu的值就等于(n+1)*2;d_zhu[]是输出数组,存储读取的数据值。程序流程图如图3-7所示。
应注意的是,原来存储器中数据从0003H单元才是真正有效的数据,此处对读取的数据进行简单处理,将数据前移两个单元,也就是READ_DATA zhu函数的返回数组d_zhu[]中的第一个数据开始就是有效的数据,方便上层应用软件的后续数据处理。
READ_DATA_fu函数原型为ViStatus _VI_FUNC CSY_READ_DATA_FU (ViSession vi, int geShu, int d_fu[]),主要实现对辅存储器中存储数据的一次性读取,其工作过程与READ_DATA zhu函数基本相同,此处不再详细介绍。
除了一次性存储器数据读取函外,之所以设置单个存储器数据的读取函数READ_DATA,是考虑到如果用户只是希望读取主存储器或者辅存储器中的某个或某几个单元中的数据值时,会比较方便。 基于VXI总线枪弹杀伤力测试系统应用程序开发(14):http://www.751com.cn/jixie/lunwen_1973.html