基于单片机和CH371USB接口芯片实现虚拟示波器的设计

网友投稿 277 2022-11-07

基于单片机和CH371USB接口芯片实现虚拟示波器的设计

一、引言

二、

南京沁恒公司推出的是一个USB总线的通用接口芯片,它利用硬件逻辑屏蔽了USB 通讯中的所有协议,在计算机应用层与本地端控制器之间提供端对端的连接。基于CH371,设计者不需要了解任何USB协议、固件程序以及驱动程序,可以轻松地将原来的并口、串口的产品升级到USB接口,以较低的风险和成本享用USB接口带来的优越性。

在本系统中使用的是SOP28的产品,他的管脚定义如下表:

根据系统的要求我们设计硬件如下。

图三 单片机、CH371和RAM部分原理图

三、软件设计

单片机端软件:

单片机端软件主要完成数据采集控制、数据报告这两个功能。其中数据采集控制根据计算机端软件设定的增益、时基、触发等参数控制数据,这里面要用到计算机向单片机发送少量的控制信息;数据报告功能则需要单片机将缓存中的一个采集周期的所有数据传送给计算机端软件,这属于大批量数据的传输。我们把介绍的重点放在单片机与计算机的通信上面。

单片机与计算机通信是通过对CH371的寄存器操作实现的,有关其寄存器定义的具体情况请参考数据手册。

在应用中需要注意的是,CH371提供的单片机接收缓冲区为8个字节,多于8个字节的计算机下传数据被切分;而单片机的发送缓冲区也是8个字节,多于8个字节的上传数据需要分多次上传。另外,CH371的中断包括了上传及接受成功,中断发生后具体的情况需要由传输状态寄存器来辨别;同时其中断电平是单稳态的,一个事件发生后中断信号跳变,但仅维持一个短暂的脉冲便恢复,这是为了配合不同速度的处理器而作的处理。

单片机与计算机的USB通信主要功能子程序示例如下:(请在使用时加入CH371的相应寄存器的地址定义)

file://********** CH371初始化程序******************************

void ch371_init()

{

CH371_INT_SET=0; file://CH371中断数据设定寄存器的地址偏移

CH371_LENGTH=0X0F; file://置上传数据长度寄存器为15,表示暂时没有数据上传

save_length=0; file://保存下传数据长度

IT0=1; file://外部信号为下降沿触发

IE0=0; file://清中断标志

PX0=1; file://置高优先级

EX0=1; file://允许中断

}

file://***********上传数据子程序********************************

void ch371_upload(unsigned char len) file://参数传入数据长度

{

unsigned char i;

unsigned char *up_buf;

unsigned char *ch371_buf;

{

up_buf=&ret_buffer; file://指向数据的地址

ch371_buf=&CH371_BUFFER; file://指向数据缓冲区

for(i=0;i{

*ch371_buf=*up_buf; file://写入上传数据缓冲区

ch371_buf++; up_buf++;

}

}

CH371_LENGTH=len; file://写入本次数据的长度

}

file://********中断子程序 使用中断0 寄存器组2********

void ch371_inter() 0 using 2{

unsigned char *down_buf;

unsigned char *ch371_buf;

unsigned char i;

IE0=0; file://清中断标志

if( (CH371_STATUS&0x01) ==0 ){

file://读取状态信息寄存器,判断数据传输状态

save_length=CH371_LENGTH; file://保持下传数据长度

down_buf=&save_buffer;

ch371_buf=&CH371_BUFFER;

for(i=0;ifile://判断下传数据长度并处理

{

*down_buf=*ch371_buf; file://读取一字节的下传数据

down_buf++; ch371_buf++;

}

}

else CH371_LENGTH=0x0f; file://置上传数据长度寄存器为15

}

计算机端软件:

图四 虚拟仪器计算机软件面板图

计算机端有关USB通信的开发不需要了解USB底层驱动,并且芯片生产商已经以动态链接库的形式封装好了面向功能应用的API函数,开发者可以在多种高级语言中调用,功能强大且灵活方便。CH371动态链接库提供的API函数主要包括:设备管理API、数据传输API、中断查询API、I2C 操作API和直接控制API。

其中设备管理API对于一般产品开发不需要用到;数据传输API是最重要最常用的一组函数,他提供了多种数据传输模式;中断查询API一般用于USB设备使用到中断传输的场合,我们这里没有用到;I2C 操作API用于对CH371控制的I2C器件进行读写,一般用于存放产品信息,我们这里也没有用到;直接控制API是用于CH371直接输入输出信号,包括设置、输入和输出三部分组成,我们使用这一组API实现对LED进行控制。

在实际应用中笔者使用VB6作为计算机端应用软件的开发平台,首先要将沁恒公司提供的驱动程序、动态链接库拷贝到计算机中,再将动态链接库的访问入口及函数定义入口添加至VB6项目中,就是将提供的VB6实例程序中的module功能模块添加到自己的工程项目下即可。此时对USB设备的通信编程就几乎和访问本地硬盘中的文件差不多了,具体差别可以通过分析实例程序的句法来解决。下面给出计算机接收与发送数据的相关程序。

Dim myReq As DEMO_REQ

Dim mOpen As Integer

Private Sub Form_Load( ) ’ 窗口加载事件

Dim mLength As Long

mOpen = CH371OpenDevice(mIndex) ‘ 窗体加载时打开设备

If mOpen = -1 Then

MsgBox “无法打开CH371设备” ’ 加载失败提示

End If

myReq.mCommand = &HFF ‘ 用户定义命令

myReq.mBuffer(0) = &H11 ’ 用户定义数据

myReq.mBuffer(1) = &H22 ‘ 用户定义数据

mLength = Len(myReq)

……

CH371ReadData(mIndex, myReq, mLength) ‘ 通过CH371接收应答数据

……

End Sub

四、结束语

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:为什么说线上广交会,能够加速传统企业的数字化转型?
下一篇:SpringBoot 统一公共返回类的实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~