?? module1.bas
字號:
Attribute VB_Name = "Module1"
Public Const MAX_DATA_SIZE As Long = 56 ' 單次命令處理的最大數(shù)據(jù)長度'有效值是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
' ****************************************************************************************************
' 計(jì)算機(jī)接口子程序源程序
''Const MAX_DATA_SIZE As Long = 16 ' 單次命令處理的最大數(shù)據(jù)長度'有效值是1到56
Type Parastruct
mByte(3) As Byte ' 通用參數(shù)
'mWord(2) As Integer ' 通用參數(shù)'低字節(jié)在前'Little-Endian
'mDword As Long ' 通用參數(shù)'低字節(jié)在前'Little-Endian
'mAddress(1) As Byte ' 讀寫操作的起始地址'低字節(jié)在前'Little-Endian
End Type
Type USB_DOWN_PKT ' 下傳的數(shù)據(jù)包結(jié)構(gòu)'用于命令/寫數(shù)據(jù)
mCommand As Byte ' 命令碼'見下面的定義
mCommandNot As Byte ' 命令碼的反碼'用于校驗(yàn)下傳數(shù)據(jù)包
'u As Parastruct
mByte(3) As Byte ' 通用參數(shù)'低字節(jié)在前'Little-Endian
mLength As Byte ' 下面的緩沖區(qū)的長度'讀寫操作的字節(jié)數(shù)
mBuffer(MAX_DATA_SIZE) As Byte ' 數(shù)據(jù)緩沖區(qū)
End Type
Type USB_UP_PKT ' 上傳的數(shù)據(jù)包結(jié)構(gòu)'用于狀態(tài)/讀數(shù)據(jù)
mStatus As Byte ' 狀態(tài)碼'見下面的定義
mCommandNot As Byte ' 命令碼的反碼'用于校驗(yàn)上傳數(shù)據(jù)包
mReserved(3) As Byte
mLength As Byte ' 下面的緩沖區(qū)的長度'讀操作的字節(jié)數(shù)
mBuffer(MAX_DATA_SIZE) As Byte ' 數(shù)據(jù)緩沖區(qū)
End Type
' 命令碼定義'按位說明
' 位7為命令類型: 0=實(shí)現(xiàn)特定功能' 1=存儲(chǔ)器和SFR讀寫
'對于"實(shí)現(xiàn)特定功能"命令類型:
'位6 -位0為定義的具體命令碼 ' 命令碼為00H-7FH' 其中: 00H-3FH為通用標(biāo)準(zhǔn)命令' 40H-7FH為與應(yīng)用系統(tǒng)有關(guān)的特定命令
'目前版本定義了以下通用標(biāo)準(zhǔn)命令:
'0 H: 獲取調(diào)試固件程序的版本 ' 并取消未完成的上傳數(shù)據(jù)塊
'10 H: 獲取當(dāng)前應(yīng)用系統(tǒng)的版本和說明字符串
' 對于"存儲(chǔ)器和SFR讀寫"命令類型:
'位6為數(shù)據(jù)傳輸方向: 0=讀操作/上傳' 1=寫操作/下傳
'位5-位4為數(shù)據(jù)讀寫寬度: 00=以字節(jié)為單位/8位' 01=以字為單位/16位' 10=以雙字為單位/32位' 11=以位為單位/1位
'位1-位0為存儲(chǔ)器空間: 00=存取SFR' 01=存取內(nèi)部RAM' 10=存取外部RAM' 11=存取程序ROM
'例如: 命令碼80H為讀SFR ' 命令碼83H為讀程序ROM' 命令碼C1H為寫內(nèi)部RAM' 命令碼C2H為寫外部RAM
' 狀態(tài)碼定義: 00H為操作成功' 080H為命令不支持' 0FFH為未定義的錯(cuò)誤
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設(shè)備序號
Public CH375DBG_Opened As Boolean ' CH372/CH375設(shè)備被打開標(biāo)志
' 應(yīng)用程序啟動(dòng)后'在所有操作之前'必須首先調(diào)用一次下面的CH375DBG_GetFirmwareInfo子程序
'獲取調(diào)試固件程序的版本'并取消未完成的上傳數(shù)據(jù)塊
Public Function CH375DBG_GetFirmwareInfo(ver As Byte) As Boolean
' 輸入?yún)?shù): ver 指向一個(gè)字節(jié)變量單元'用于存放獲取的版本號
Dim Leng As Long
CH375DBG_GetFirmwareInfo = False
If CH375OpenDevice(CH375DBG_Index) <> 0 Then ' 打開CH375設(shè)備
CH375DBG_Opened = True ' 打開CH375設(shè)備
GetFirmwareInfo = True
Else
CH375DBG_Opened = False '打開CH375設(shè)備失敗
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
' 讀取應(yīng)答塊
If ((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot) And (Up.mLength >= 1)) Then
' 操作成功,并且返回?cái)?shù)據(jù)
ver = Up.mBuffer(0) ' 返回版本號 ''''modi
CH375DBG_GetFirmwareInfo = True
End If
End If
Else
GetFirmwareInfo = False
GetFirmwareInfo = True
End If
End Function
' 應(yīng)用程序退出前'在所有操作之后'應(yīng)該調(diào)用一次下面的CH375DBG_CloseExit子程序
Public Function CH375DBG_CloseExit() '關(guān)閉CH372/CH375設(shè)備
' 關(guān)閉CH372/CH375設(shè)備
CH375DBG_Opened = False
CH375CloseDevice (CH375DBG_Index)
End Function
'獲取當(dāng)前應(yīng)用系統(tǒng)的版本和說明字符串
Public Function CH375DBG_GetAppSysInfo(ver As Byte, StringBuffer() As Byte) As Boolean
' 輸入?yún)?shù): ver 指向一個(gè)字節(jié)變量單元'用于存放獲取的版本號
' StringBuffer 指向一個(gè)足夠大的字符串緩沖區(qū)'用于存放獲取的說明字符串
'獲取當(dāng)前應(yīng)用系統(tǒng)的版本和說明字符串
'輸入?yún)?shù): ver 指向一個(gè)字節(jié)變量單元,用于存放獲取的版本號
' StringBuffer 指向一個(gè)足夠大的字符串緩沖區(qū),用于存放獲取的說明字符串
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
'讀取應(yīng)答塊
'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
'操作成功,并且返回?cái)?shù)據(jù)
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一個(gè)單元讀取數(shù)據(jù)
' 輸入?yún)?shù): addr 指定SFR的地址
' data 指向一個(gè)字節(jié)變量單元'用于存放讀出的數(shù)據(jù)
' 從SFR一個(gè)單元讀取數(shù)據(jù)
' 輸入?yún)?shù): addr 指定SFR的地址
' data 指向一個(gè)字節(jié)變量單元,用于存放讀出的數(shù)據(jù)
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
' 讀取應(yīng)答塊
If (((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot)) And (Up.mLength >= 1)) Then
' 操作成功,并且返回?cái)?shù)據(jù)
Data = Up.mBuffer(0) ' 返回?cái)?shù)據(jù) '!date是動(dòng)態(tài)數(shù)組
CH375DBG_ReadSFR = True
End If
End If
End If
End Function
Public Function CH375DBG_WriteSFR(Addr As Long, Data As Byte) As Boolean '向SFR一個(gè)單元寫入數(shù)據(jù)
' 輸入?yún)?shù): addr 指定SFR的地址
' data 指定準(zhǔn)備寫入的數(shù)據(jù)
' 向SFR一個(gè)單元寫入數(shù)據(jù)
' 輸入?yún)?shù): addr 指定SFR的地址
' data 指定準(zhǔn)備寫入的數(shù)據(jù)
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
' 讀取應(yīng)答塊
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 '從內(nèi)部RAM讀取數(shù)據(jù)塊
' 輸入?yún)?shù): StartAddr 指定內(nèi)部RAM的起始地址
' buffer 指向一個(gè)足夠大的數(shù)據(jù)緩沖區(qū)'用于存放讀出的數(shù)據(jù)塊
' count 指定讀取的字節(jié)數(shù)
' 從內(nèi)部RAM讀取數(shù)據(jù)塊
' 輸入?yún)?shù): StartAddr 指定內(nèi)部RAM的起始地址
' buffer 指向一個(gè)足夠大的數(shù)據(jù)緩沖區(qū),用于存放讀出的數(shù)據(jù)塊
' count 指定讀取的字節(jié)數(shù)
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 ' 限制單次處理的數(shù)據(jù)長度,可以與單片機(jī)程序的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
' 讀取應(yīng)答塊
If ((Up.mStatus = ERR_SUCCESS) And (Up.mCommandNot = Down.mCommandNot) And (Up.mLength >= Count)) Then
' 操作成功,并且返回?cái)?shù)據(jù)
For i = 0 To (Count - 1)
Buffer(i) = Up.mBuffer(i) ' 返回?cái)?shù)據(jù)
Next i
CH375DBG_ReadIRAM = True
End If
End If
End If
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -