一.任务内容:
** 本节课来学习Labview软件中DLL数据接口文件的使用,调用DLL文件来实现对数据控制采集板卡的操作。具体要求如下:**
** 1.设计CH341芯片的功能VI,目标是方便后续课程的使用或者调用;**
** 2.实现芯片GPIO端口的输入和端口信号的采集两个函数功能;**
** 3.使用设计的功能VI来搭建流水灯,分频器,步进电机等实践任务;**

二.单一功能函数块的设计

** 操作芯片的第一步是进行打开或者关闭设备,查手册可知OpenDevice和****CloseDevice 是设备的打开和关闭函数, 需要输入指定CH341设备序号,然后输出目标设备的状态信息,设备号是从0开始。上图是设计指导,注意调用DLL文件必须是保存后的VI文件才能够正常,新建未保存的VI是不能正常运行的。**

** 下一个功能是GPIO端口输入输出数字信号的操作。该函数难度升级,需要了解寄存器的位操作的含义。**
** CH341SetOutput函数是设置CH341的I/O方向,并通过CH341直接输出GPIO数据,所以它有设置方向和输出IO电平2个功能。该函数重要的参数有**iEnable 数据有效标志 、 iSetDirOut 设置I/O方向 、iSetDataOut 输出数据。 **** 谨慎使用该函数, 防止修改I/O方向使输入引脚变为输出引脚导致与其它输出引脚之间短路而损坏芯片!
** iEnable是数据有效标志,可以通过屏蔽IO区域来操作少量的IO变化,从而不影响其它端口的正常工作。比如8个IO口输入输出各4个,配置输出时需要屏蔽掉4个输入,否则输入将受到影响。具体定义函数见上图。**
**iSetDirOut是设置I/O方向,某位清0则对应引脚为输入,某位置1则对应引脚为输出。比如 **8个IO口输入输出各4个** ,我们需要配置11110000(0xF0)来实现输入输出的配置和初始化。**
** iSetDataOut函数是要输出的电平数据,只有I/O方向为输出的时候,对应位才有效,清0时对应引脚输出低电平,某位置1时对应引脚输出高电平。**

** CH341GetInput函数是通过CH341芯片直接获取GPIO的输入数据和状态,该函数的效率比CH341GetStatus更高。本函数需要注意电平数据返回的格式,在虚拟仪器中指针通常用数组形式来表达,所以该函数需要建立一个U32的数据数组来存放数据,需要提前分配容量=1的数组传入 iStatus端口状态参数,指向一个双字单元,用于保存状态数据。 **
****** iStatus状态参数的定义是:位7-位0对应CH341的D7-D0引脚,位8对应CH341的ERR#打印机出错引脚,位9对应CH341的PEMP打印机缺纸引脚, ********** ** 位10对应CH341的INT#中断请求输入引脚, 位11对应CH341的SLCT引脚, 位23对应CH341的SDA引脚,** **位13对应CH341的BUSY/WAIT#忙或等待引脚。**
三.组合功能函数块的设计

** 接下来设计加大难度,我们来实现只修改IO的输入输出方向,因为在实际应用中我们可能事先不知道所有IO口的状态和方向,需要初始化配置。贸然修改IO会影响到全局IO口的变化。**
** 该函数先使用CH341GetInput获取IO的状态信息,然后 CH341SetOutput来进行初始化IO方向配置 ,再把状态数据重载实现只修改方向的效果********。因为要**********谨慎使用输出函数, 防止修改I/O方向使输入变为输出,导致与其它输出引脚之间短路而损坏芯片!
四.应用案例

** 第1个案例是 实现分频器的功能, 让8个IO输出二进制数据,表现是让IO口闪烁,低位闪烁最快,比如IO0的频率是256Hz,那么其他IO依次是:64Hz、32Hz、16Hz、8Hz、4Hz、2Hz、1Hz。**
** 首先打开设备,然后使用**CH341SetOutput不断的变化输出电平值,For函数是来决定输出频率的次数,输出频率经过测试单IO最高能够达到2kHz的输出频率,通过数值变换布尔数组来实现二进制变换。最后操作完毕要及时关闭设备驱动。****