基于CH375的USB数据采集应用程序.docx
- 文档编号:16723610
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:47
- 大小:76.38KB
基于CH375的USB数据采集应用程序.docx
《基于CH375的USB数据采集应用程序.docx》由会员分享,可在线阅读,更多相关《基于CH375的USB数据采集应用程序.docx(47页珍藏版)》请在冰点文库上搜索。
基于CH375的USB数据采集应用程序
基于CH375的USB数据采集应用程序
摘要
利用USB接口技术,采用USB模块CH375与AT89C81结合,实现与计算机通信。
给出了CH375与单片机接口电路的原理简图,并详细介绍了实现USB数据传输的上位机的程序设计。
关键词:
USB,CH375,AT89C51,上位机
一、CH375模块简介
USB模块CH375是一个USB总线的通用设备接口芯片,用户无需编写驱动程序,内置有USB通讯中的底层协议,完全满足USB1.1标准。
具有8位数据总线(D0~D7)、地址输入(A0)、读(RD#)、写(WR#)、片选控制线(CS#)以及中断输出(INT#),可以方便地挂接到单片机的数据总线上。
当A0为低电平时选择数据端口,单片机通过8位并口对CH375进行读写数据;为高电平时选择命令端口,可以向其写入命令。
在本地端,单片机对CH375的操作是采用命令加数据的I/O操作方式,任何操作都是先发命令给CH375,然后执行数据输入输出。
CH375接收到上位机发送的数据或者发送完给上位机的数据后,以中断方式通知单片机,并进行相应处理。
将CH375芯片的驱动程序、动态链接库拷贝到上位机中,利用CH375动态链接库DLL提供的API函数对其进行操作,对USB设备的通信就几乎和访问本地硬盘中的文件差不多了。
二、系统原理图
CH375的数据总线直接与AT89C51的数据总路线P0口相连,中断输出INT#与AT89C51的外部中断INT1相连,RD#、WR#与AT89C51的RD、WR对应,片选A0及CS#分别接P2.0和P2.1。
接接线电路图如下:
三、设计通信方案
USB模块CH375在计算机应用层与其本地端单片机AT89C51之间提供了端对端的连接。
统一采用数据加应答方式进行通信,所有的通信都由计算机应用层发起,然后以接收到单片机的应答结束。
单一通道完整的通信过程包括:
①计算机应用层按事先约定的格式将数据请求发送给CH375;
②CH375以中断方式通知单片机。
③单片机进入中断服务程序,获取CH375的中断状态并分析;
④如果是上传(上传缓冲区的数据被计算机成功读取),则释放当前USB缓冲区,然后退出中断程序;
⑤如果是下传(下传缓冲区成功接收到计算机发送的数据),则从数据下传缓冲区读取数据块;
⑥分析接收到的数据块,如果是数据请求上传命令,准备应答数据(采集数据);
⑦单片机将采集数据写入数据上传缓冲区中,然后退出中断程序;
⑧CH375将采集数据返回给计算机;
⑨计算机应用层接收到应答数据,传输结束;
该通讯方式具有数据自动同步、程序设计简单、较好的交互性和可控性等优点。
计算机获取通道信息,并将数据保存到本地,通过应用软件进行处理。
四、应用程序设计
系统应用程序的设计包括单片机端的C51程序设计用上位机PC机端的应用程序设计,现只考虑上位机的程序设计,假设单片机和应用程序通信的数据格式已经统一。
通过VB调用CH375的动态链接库直接操作接收到的数据。
1、相关接口函数
对于USB存储设备的应用,CH375直接提供了数据块的读写接口,以512字节的物理扇区为基本读写单位,从而将USB存储设备简化为一种外部数据存储器,单片机可以自
由读写USB存储设备中的数据,也可以自由定义其数据结构。
由于计算机将USB存储设备组织为文件系统,为了方便单片机通过USB移动存储设备与计算机之间交换数据,单片机也可以将USB存储设备组织为文件系统,按照计算机定义的数据结构读写USB存储设备。
CH375以C语言子程序库提供了USB存储设备的文件级接口,这些应用层接口API
包含了常用的文件级操作,可以移植并嵌入到各种常用的单片机程序中。
CH375的U盘文件级子程序库具有以下特性:
支持常用的FAT12、FAT16和FAT32文
件系统,磁盘容量可达100GB以上,支持多级子目录,支持8.3格式的大写字母文件名
,支持文件打开、新建、删除、读写以及搜索等。
CH375的文件级接口API子程序需要大约600字节的随机存储器RAM作为缓冲区。
所有API在调用后都有操作状态返回,但不一定有应答数据。
有关API参数的说明请参考CH375HF?
.H,主要子程序如下:
初始化CH375芯CH375Init
查询磁盘是否准备好:
CH375DiskReady
查询磁盘容量:
CH375DiskSize
查询磁盘信息(总容量及剩余容量):
CH375DiskQuery
打开文件:
CH375FileOpen
枚举或者搜索文件:
CH375FileEnumer
关闭文件:
CH375FileClose
新建文件:
CH375FileCreate
删除文件:
CH375FileErase
以扇区为单位从文件读数据:
CH375FileRead
以扇区为单位向文件写数据:
CH375FileWrite
以扇区为单位移动文件指针:
CH375FileLocate
查询文件属性(属性/日期/时间/长度):
CH375FileQuery
设置文件属性(属性/日期/时间/长度):
CH375FileModify
以字节为单位从文件读数据:
CH375ByteRead
以字节为单位向文件写数据:
CH375ByteWrite
以字节为单位移动文件指针:
CH375ByteLocate
底层BulkOnly协议命令:
CH375BulkOnlyCmd
2、VB应用程序设计
①VB程序界面
总的程序界面如下:
②程序资源
程序中需要调用CH375DLL.DLL,需要CH375的硬件驱动程序,及相关VB文件资源.如下:
③VB程序源代码
主界面代码:
PublicOldAsString'SFR寄存器修改前的数据:
判断有无修改
PublicFunctionmReadIRam()AsBoolean
Dimi,jAsLong
DimAddrAsLong
Dimval(15)AsByte''''m
If(CH375DBG_Opened=True)Then
mReadIRam=True
Else
mReadIRam=False
EndIf
EndFunction
PublicFunctionmWriteSFR(AddAsLong,valueAsString)AsBoolean
DimCAsByte
If(value="")Then
mWriteSFR=True
ExitFunction
EndIf
C=hextobcd(value)
If(CH375DBG_WriteSFR(Add,C)=True)Then
mWriteSFR=True
Else
mWriteSFR=False
EndIf
EndFunction
PublicFunctionmReadXRam()AsBoolean
DimAdhAsByte
DimiAsLong
DimjAsLong
DimAddrAsLong
DimAdAsLong
DimCAsByte
Dimval(20)AsByte
Dimstr(10)AsByte
Dimm_addrAsString
m_addr=Trim(Text5.Text)
If(CH375DBG_Opened=True)Then
If(m_addr<>"")Then
'adh=mCharToBcd(m_addr[0])<<4|mCharToBcd(m_addr[1]);
Adh=hextobcd(m_addr)
'ad=(ULONG)adh<<8
Ad=CLng(CLng(Adh)*256)
Else
Ad=0
EndIf
mReadXRam=True
Else
mReadXRam=False
EndIf
EndFunction
PrivateSubForm_Unload(CancelAsInteger)
CH375DBG_CloseExit
EndSub
'*****************************************************selectform
PrivateSubOption1_Click(IndexAsInteger)'窗口选择
SFR.Visible=False
'IRam.Visible=False
'XRam.Visible=False
EXTERNCmd.Visible=False
IfIndex=0Then'SFR
Text3
(1).Text=("P0")
Text3
(2).Text=("PCON")
Text3(3).Text=("TCON")
Text3(4).Text=("TMOD")
Text3(5).Text=("TL0")
Text3(6).Text=("TL1")
Text3(7).Text=("TH0")
Text3(8).Text=("TH1")
Text3(9).Text=("P1")
Text3(10).Text=("SCON")
Text3(11).Text=("SBUF")
Text3(12).Text=("P2")
Text3(13).Text=("IE")
Text3(14).Text=("P3")
Text3(15).Text=("IP")
Text3(16).Text=("T2CON")
SFR.Visible=True
CallSFRRefresh_Click
EXTERNCmd.Visible=True
EndIf
EndSub
'*****************************SFR
PrivateSubSFRRefresh_Click()
DimverAsByte
Dimval1AsByte
Dimval2AsByte
Dimval3AsByte
Dimval4AsByte
Dimval5AsByte
Dimval6AsByte
Dimval7AsByte
Dimval8AsByte
Dimval9AsByte
Dimval10AsByte
Dimval11AsByte
Dimval12AsByte
Dimval13AsByte
Dimval14AsByte
Dimval15AsByte
Dimval16AsByte
If(CH375DBG_GetFirmwareInfo(ver)=True)Then
M_ver.Caption=hex2bit(ver)
Else
MsgBox"无法打开CH372/CH375,可能未工作或者单片机未执行调试程序",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H80,val1)=True)Then
Text4
(1).Text=hex2bit(val1)
Else
MsgBox"SFR读地址P0失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H87,val2)=True)Then
Text4
(2).Text=hex2bit(val2)
Else
MsgBox"SFR读地址PCON失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H88,val3)=True)Then
Text4(3).Text=hex2bit(val3)
Else
MsgBox"SFR读地址TCON失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H89,val4)=True)Then
Text4(4).Text=hex2bit(val4)
Else
MsgBox"SFR读地址TMOD失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H8A,val5)=True)Then
Text4(5).Text=hex2bit(val5)
Else
MsgBox"SFR读地址TL0失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H8B,val6)=True)Then
Text4(6).Text=hex2bit(val6)
Else
MsgBox"SFR读地址TL1失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H8C,val7)=True)Then
Text4(7).Text=hex2bit(val7)
Else
MsgBox"SFR读地址TH0失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H8D,val8)=True)Then
Text4(8).Text=hex2bit(val8)
Else
MsgBox"SFR读地址TH1失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H90,val9)=True)Then
Text4(9).Text=hex2bit(val9)
Else
MsgBox"SFR读地址P1失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H98,val10)=True)Then
Text4(10).Text=hex2bit(val10)
Else
MsgBox"SFR读地址SCON失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&H99,val11)=True)Then
Text4(11).Text=hex2bit(val11)
Else
MsgBox"SFR读地址SBUF失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&HA0,val12)=True)Then
Text4(12).Text=hex2bit(val12)
Else
MsgBox"SFR读地址P2失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&HA8,val13)=True)Then
Text4(13).Text=hex2bit(val13)
Else
MsgBox"SFR读地址IE失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&HB0,val14)=True)Then
Text4(14).Text=hex2bit(val14)
Else
MsgBox"SFR读地址P3失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&HB8,val15)=True)Then
Text4(15).Text=hex2bit(val15)
Else
MsgBox"SFR读地址IP失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
If(CH375DBG_ReadSFR(&HC8,val16)=True)Then
Text4(16).Text=hex2bit(val16)
Else
MsgBox"SFR读地址T2CON失败",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
EndSub
PrivateSubBUTTON_READ_Click()
If(CH375DBG_Opened=True)Then
If(mReadXRam()=False)Then
MsgBox"读XRAM失败!
",vbOKCancel,"CH37XDBG"
EndIf
Else
MsgBox"设备未打开!
",vbOKOnly,"CH37XDBG"
EndIf
EndSub
PrivateSubRecieve_Click()
'CXRAMPagem_xram;
DimBuffer(MAX_DATA_SIZE*2)AsByte
DimLengAsLong
DimTemsAsString
If(CH375DBG_Opened=False)Then
MsgBox"设备未打开",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
'写出命令块
Leng=Len(Up)
If(CH375ReadData(CH375DBG_Index,Up,Leng))Then
'读取应答块
If(Up.mCommandNot=Down.mCommandNot)Then'操作成功
'状态码
m_Comm=hex2bit(Up.mStatus)
'返回码1
Para1.Text=hex2bit(Up.mReserved(0))
'返回码2
Para2.Text=hex2bit(Up.mReserved
(1))
'返回码3
Para3.Text=hex2bit(Up.mReserved
(2))
'返回码4
Para4.Text=hex2bit(Up.mReserved(3))
'返回长度
ILeng.Text=hex2bit(Up.mLength)
Tems=""
Fori=0ToUp.mLength-1
Tems=Tems+hex2bit(Up.mBuffer(i))+""'返回数据
Nexti
IBuff.Text=Tems
Else
MsgBox"返回状态错误!
",vbOKCancel,"CH37XDBG"
'ExitSub
EndIf
OpenApp.Path&"\input.dat"ForAppendAs#1
Print#1,m_Comm&Space(5)&m_Len&Space(5)&m_Para1&Space(5)&m_Para2&Space(5)&m_Para3&Space(5)&m_Para4&Space(5)&m_Buff&"["&Now&"]"
Close#1
Else
MsgBox"读失败!
",vbOKCancel,"CH37XDBG"
EndIf
EndSub
PrivateSubOnButtonSend_Click()
Dimm_CommAsString
Dimm_LenAsString
Dimm_Para1AsString
Dimm_Para2AsString
Dimm_Para3AsString
Dimm_Para4AsString
Dimm_BuffAsString
DimTemsAsString
DimBuffer(120)AsByte
DimLengthAsByte
DimTemhAsByte
DimLengAsLong
m_Comm=Trim(ICmdcode.Text)
m_Len=Trim(ILeng.Text)
m_Para1=Trim(Para1.Text)
m_Para2=Trim(Para2.Text)
m_Para3=Trim(Para3.Text)
m_Para4=Trim(Para4.Text)
m_Buff=Trim(IBuff.Text)
'保存数据及参数
OpenApp.Path&"\output.dat"ForAppendAs#1
Print#1,m_Comm&Space(5)&m_Len&Space(5)&m_Para1&Space(5)&m_Para2&Space(5)&m_Para3&Space(5)&m_Para4&Space(5)&m_Buff&"["&Now&"]"
Close#1
If(CH375DBG_Opened=False)Then
MsgBox"设备未打开",vbOKCancel,"CH37XDBG"
ExitSub
EndIf
'命令码
If(Len(m_Comm)>0)Then
Down.mCommand=hextobcd(m_Comm)
Else
Down.mCommand=0
EndIf
'反命令码
Down.mCommandNot=NotDown.mCommand
'参数1
If(Len(m_Para1)>0)Then
Down.mByte(0)=hextobcd(m_Para1)
'Down.mDword=CLng(hextobcd(m_Para1)*(256^3))
Else
Down.mByte(0)=0
EndIf
'参数2
If(Len(m_Para2)>0)Then
Down.mByte
(1)=hextobcd(m_Para2)
Else
Do
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 CH375 USB 数据 采集 应用程序