📄 module1.bas
字号:
Attribute VB_Name = "Module1"
Public Const MAX_DATA_SIZE As Long = 56 ' 单次命令处理的最大数据长度'有效值是1到56
Public Down As USB_DOWN_PKT
Public Up As USB_UP_PKT
Public Const CONST_CMD_LEN As Long = &H7
Public XRamaStartaddr As Byte
' ****************************************************************************************************
' 计算机接口子程序源程序
''Const MAX_DATA_SIZE As Long = 16 ' 单次命令处理的最大数据长度'有效值是1到56
Type Parastruct
mByte(3) As Byte ' 通用参数
'mWord(2) As Integer ' 通用参数'低字节在前'Little-Endian
'mDword As Long ' 通用参数'低字节在前'Little-Endian
'mAddress(1) As Byte ' 读写操作的起始地址'低字节在前'Little-Endian
End Type
Type USB_DOWN_PKT ' 下传的数据包结构'用于命令/写数据
mCommand As Byte ' 命令码'见下面的定义
mCommandNot As Byte ' 命令码的反码'用于校验下传数据包
'u As Parastruct
mByte(3) As Byte ' 通用参数'低字节在前'Little-Endian
mLength As Byte ' 下面的缓冲区的长度'读写操作的字节数
mBuffer(MAX_DATA_SIZE) As Byte ' 数据缓冲区
End Type
Type USB_UP_PKT ' 上传的数据包结构'用于状态/读数据
mStatus As Byte ' 状态码'见下面的定义
mCommandNot As Byte ' 命令码的反码'用于校验上传数据包
mReserved(3) As Byte
mLength As Byte ' 下面的缓冲区的长度'读操作的字节数
mBuffer(MAX_DATA_SIZE) As Byte ' 数据缓冲区
End Type
' 命令码定义'按位说明
' 位7为命令类型: 0=实现特定功能' 1=存储器和SFR读写
'对于"实现特定功能"命令类型:
'位6 -位0为定义的具体命令码 ' 命令码为00H-7FH' 其中: 00H-3FH为通用标准命令' 40H-7FH为与应用系统有关的特定命令
'目前版本定义了以下通用标准命令:
'0 H: 获取调试固件程序的版本 ' 并取消未完成的上传数据块
'10 H: 获取当前应用系统的版本和说明字符串
' 对于"存储器和SFR读写"命令类型:
'位6为数据传输方向: 0=读操作/上传' 1=写操作/下传
'位5-位4为数据读写宽度: 00=以字节为单位/8位' 01=以字为单位/16位' 10=以双字为单位/32位' 11=以位为单位/1位
'位1-位0为存储器空间: 00=存取SFR' 01=存取内部RAM' 10=存取外部RAM' 11=存取程序ROM
'例如: 命令码80H为读SFR ' 命令码83H为读程序ROM' 命令码C1H为写内部RAM' 命令码C2H为写外部RAM
' 状态码定义: 00H为操作成功' 080H为命令不支持' 0FFH为未定义的错误
Const USB_CMD_GET_FW_INFO As Byte = &H0
Const USB_CMD_GET_APP_INFO As Byte = &H10
Const USB_CMD_MEM_ACCESS As Byte = &H80
Const USB_CMD_MEM_DIR_WR As Byte = &H40
Const USB_CMD_MEM_WIDTH As Byte = &HC
Const USB_CMD_MEM_W_BYTE As Byte = &H0
Const USB_CMD_MEM_W_WORD As Byte = &H4
Const USB_CMD_MEM_W_DWORD As Byte = &H8
Const USB_CMD_MEM_W_BIT As Byte = &HC
Const USB_CMD_MEM_SPACE As Byte = &H3
Const USB_CMD_MEM_S_SFR As Byte = &H0
Const USB_CMD_MEM_S_IRAM As Byte = &H1
Const USB_CMD_MEM_S_XRAM As Byte = &H2
Const USB_CMD_MEM_S_ROM As Byte = &H3
Const ERR_SUCCESS As Byte = &H0
Const ERR_UNSUPPORT As Byte = &H80
Const ERR_UNDEFINED As Byte = &HFF
Const ReadSFRCmdCode As Byte = &H80
Const WriteSFRCmdCode As Byte = &HC0
Const ReadIRamCmdCode As Byte = &H81
Const WriteIRamCmdCode As Byte = &HC1
Const ReadXRamCmdCode As Byte = &H82
Const WriteXRamCmdCode As Byte = &HC2
Const ReadRomCmdCode As Byte = &H83
'Const WriteRomCmdCode As Byte = &HC3
Public CH375DBG_Index As Long ' CH372/CH375设备序号
Public CH375DBG_Opened As Boolean ' CH372/CH375设备被打开标志
' 应用程序启动后'在所有操作之前'必须首先调用一次下面的CH375DBG_GetFirmwareInfo子程序
'获取调试固件程序的版本'并取消未完成的上传数据块
Public Function CH375DBG_GetFirmwareInfo(ver As Byte) As Boolean
' 输入参数: ver 指向一个字节变量单元'用于存放获取的版本号
Dim Leng As Long
CH375DBG_GetFirmwareInfo = False
If CH375OpenDevice(CH375DBG_Index) <> 0 Then ' 打开CH375设备
CH375DBG_Opened = True ' 打开CH375设备
GetFirmwareInfo = True
Else
CH375DBG_Opened = False '打开CH375设备失败
GetFirmwareInfo = False
Exit Function '退出
End If
Down.mCommand = USB_CMD_GET_FW_INFO
Down.mCommandNot = Not (Down.mCommand)
For i = 0 To 3
Down.mByte(i) = 0
Next i
Down.mLength = 1
'Leng = mOFFSET(USB_DOWN_PKT, mBuffer)
Leng = CONST_CMD_LEN
If (CH375Writedata(CH375DBG_Index, Down, Leng)) Then
' 写出命令块
'Leng = Len(Up)
Leng = Len(Up)
If (CH375ReadData(CH375DBG_Index, Up, Leng)) Then
' 读取应答块
If ((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot) And (Up.mLength >= 1)) Then
' 操作成功,并且返回数据
ver = Up.mBuffer(0) ' 返回版本号 ''''modi
CH375DBG_GetFirmwareInfo = True
End If
End If
Else
GetFirmwareInfo = False
GetFirmwareInfo = True
End If
End Function
' 应用程序退出前'在所有操作之后'应该调用一次下面的CH375DBG_CloseExit子程序
Public Function CH375DBG_CloseExit() '关闭CH372/CH375设备
' 关闭CH372/CH375设备
CH375DBG_Opened = False
CH375CloseDevice (CH375DBG_Index)
End Function
'获取当前应用系统的版本和说明字符串
Public Function CH375DBG_GetAppSysInfo(ver As Byte, StringBuffer() As Byte) As Boolean
' 输入参数: ver 指向一个字节变量单元'用于存放获取的版本号
' StringBuffer 指向一个足够大的字符串缓冲区'用于存放获取的说明字符串
'获取当前应用系统的版本和说明字符串
'输入参数: ver 指向一个字节变量单元,用于存放获取的版本号
' StringBuffer 指向一个足够大的字符串缓冲区,用于存放获取的说明字符串
Dim Down As USB_DOWN_PKT
Dim Up As USB_UP_PKT
Dim Leng As Long
CH375DBG_GetAppSysInfo = False
Down.mCommand = USB_CMD_GET_APP_INFO
Down.mCommandNot = Not Down.mCommand
For i = 0 To 3
Down.mByte(i) = 0
Next i
Down.mLength = 0
'len = mOFFSET( USB_DOWN_PKT, mBuffer )
Leng = CONST_CMD_LEN
If (CH375Writedata(CH375DBG_Index, Down, Leng)) Then
'写出命令块
Leng = Len(Up)
If (CH375ReadData(CH375DBG_Index, Up, Leng)) Then
'读取应答块
'If ((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot) And (Up.mLength >= 1)) Then
If ((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot) And (Up.mLength >= 1)) Then
'操作成功,并且返回数据
ver = Up.mBuffer(0) '返回版本号
For i = 0 To (Up.mLength - 1)
StringBuffer(i) = Up.mBuffer(i + 1) '返回说明字符串
Next i
CH375DBG_GetAppSysInfo = True
End If
End If
End If
End Function
Public Function CH375DBG_ReadSFR(Addr As Byte, Data As Byte) As Boolean '从SFR一个单元读取数据
' 输入参数: addr 指定SFR的地址
' data 指向一个字节变量单元'用于存放读出的数据
' 从SFR一个单元读取数据
' 输入参数: addr 指定SFR的地址
' data 指向一个字节变量单元,用于存放读出的数据
Dim Down As USB_DOWN_PKT
Dim Up As USB_UP_PKT
Dim Leng As Long
CH375DBG_ReadSFR = False
'Down.mCommand = hextobcd(Hex(USB_CMD_MEM_ACCESS) & Hex(USB_CMD_MEM_W_BYTE) & Hex(USB_CMD_MEM_S_SFR))
Down.mCommand = ReadSFRCmdCode
Down.mCommandNot = Not Down.mCommand
'Down.mDword = Addr * (256 ^ 3) '地址低位在前,地址高位在后
Down.mByte(0) = CByte(Addr)
For i = 1 To 3
Down.mByte(i) = 0
Next i
Down.mLength = 1
Leng = CONST_CMD_LEN
If (CH375Writedata(CH375DBG_Index, Down, Leng)) Then
' 写出命令块
Leng = Len(Up)
If (CH375ReadData(CH375DBG_Index, Up, Leng)) Then
' 读取应答块
If (((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot)) And (Up.mLength >= 1)) Then
' 操作成功,并且返回数据
Data = Up.mBuffer(0) ' 返回数据 '!date是动态数组
CH375DBG_ReadSFR = True
End If
End If
End If
End Function
Public Function CH375DBG_WriteSFR(Addr As Long, Data As Byte) As Boolean '向SFR一个单元写入数据
' 输入参数: addr 指定SFR的地址
' data 指定准备写入的数据
' 向SFR一个单元写入数据
' 输入参数: addr 指定SFR的地址
' data 指定准备写入的数据
Dim Down As USB_DOWN_PKT
Dim Up As USB_UP_PKT
Dim Leng As Long
CH375DBG_WriteSFR = False
Down.mCommand = WriteSFRCmdCode
Down.mCommandNot = Not (Down.mCommand)
Down.mByte(0) = CByte(Addr)
For i = 1 To 3
Down.mByte(i) = 0
Next i
Down.mLength = 1
Down.mBuffer(0) = Data
Leng = CONST_CMD_LEN + Down.mLength
If (CH375Writedata(CH375DBG_Index, Down, Leng)) Then
' 写出命令块
Leng = Len(Up)
If (CH375ReadData(CH375DBG_Index, Up, Leng)) Then
' 读取应答块
If ((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot)) Then
' 操作成功
CH375DBG_WriteSFR = True
End If
End If
End If
End Function
Public Function CH375DBG_ReadIRAM(StartAddr As Long, Buffer() As Byte, Count As Byte) As Boolean '从内部RAM读取数据块
' 输入参数: StartAddr 指定内部RAM的起始地址
' buffer 指向一个足够大的数据缓冲区'用于存放读出的数据块
' count 指定读取的字节数
' 从内部RAM读取数据块
' 输入参数: StartAddr 指定内部RAM的起始地址
' buffer 指向一个足够大的数据缓冲区,用于存放读出的数据块
' count 指定读取的字节数
Dim Down As USB_DOWN_PKT
Dim Up As USB_UP_PKT
Dim Leng As Long
CH375DBG_ReadIRAM = False
If (Count > MAX_DATA_SIZE) Then
CH375DBG_ReadIRAM = False ' 限制单次处理的数据长度,可以与单片机程序的MAX_DATA_SIZE一起同步修改为更大或更小的值
Exit Function
End If
Down.mCommand = ReadIRamCmdCode
Down.mCommandNot = Not Down.mCommand
'Down.mDword = StartAddr * (256 ^ 3)
Down.mByte(0) = CByte(StartAddr)
For i = 1 To 3
Down.mByte(i) = 0
Next i
Down.mLength = Count
Leng = CONST_CMD_LEN
If (CH375Writedata(CH375DBG_Index, Down, Leng)) Then
' 写出命令块
Leng = Len(Up)
If (CH375ReadData(CH375DBG_Index, Up, Leng)) Then
' 读取应答块
If ((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot) And (Up.mLength >= Count)) Then
' 操作成功,并且返回数据
For i = 0 To (Count - 1)
Buffer(i) = Up.mBuffer(i) ' 返回数据
Next i
CH375DBG_ReadIRAM = True
End If
End If
End If
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -