با سلام
مدتی بود دنبال یه سورس ساده واسه PDIUSBD12 که اگه دوستان باهاش آشنا باشن !! میگشتم
ولی خوب سورس هایی که به زبانهایی مثل اسمبلی و ... نوشته میشه رو بسختی میشه درک کرد
من اینجا یه سورس واسه این تراشه گذاشتم که به زبان بیسیک هست و خودم تست کردم و 100% جواب گرفتم
در ضمن من این سورس رو از روی سورسی که اساتید محترم زحمتشو کشیده بودن و به زبان سی نوشته بودن تبدیل کردم به سورس بیسیک
یه توضیح کوچولو هم واسه سخت افزارش میدم:
پورت A برای ارتباط با دیتای D12
پورت D.2 به پایه اینتراپت D12 وصل میشه که یه مقاومت بالاکش هم نیاز داره و یا میتونین مقاومت بالاکش خود میکرو رو فعال کنید
پورت D.3 به RD چیپ D12
پورت D.4 به WR
پورت D.5 به A0 چیپ D12 وصل میشه
دیگه چیز خاصی هم نداره فقط حتماً یادتون باشه برای USBD12 از یه کریستال 6 مگ استفاده میشه که باید حتماً با دو تا خازن 22 پیکو زمین بشه واگر نه درست عمل نمیکنه (البته کار میکنه ولی باگ زیادی پیش میاره)
برای بهتر کار کردنش هم میتونین از کابلهای یو اس بی نویز گیر دار استفاده کنید یا از فریت بید استفاده نمایید
و در ضمن بهتره رشته های شیلد کابل که به بدنه وصل میشه رو به زمین وصل کنید
دیگه موردی نبود
امیدوارم دوستانی که میخان تازه باهاش کار کنن بتونن از این چیزی یاد بگیرن و به دردشون بخوره
در ضمن برای درایورش هم از windriver jungo استفاده کنید (البته اگه حوصله DDK رو ندارید :mrgreen
من به زودی یه درایور همراه با یه فایل اکتیو ایکس مینویسم که بشه به راحتی با ویژوال بیسیک ارتباط برقرار کرد.
اینم کد
مدتی بود دنبال یه سورس ساده واسه PDIUSBD12 که اگه دوستان باهاش آشنا باشن !! میگشتم
ولی خوب سورس هایی که به زبانهایی مثل اسمبلی و ... نوشته میشه رو بسختی میشه درک کرد
من اینجا یه سورس واسه این تراشه گذاشتم که به زبان بیسیک هست و خودم تست کردم و 100% جواب گرفتم
در ضمن من این سورس رو از روی سورسی که اساتید محترم زحمتشو کشیده بودن و به زبان سی نوشته بودن تبدیل کردم به سورس بیسیک
یه توضیح کوچولو هم واسه سخت افزارش میدم:
پورت A برای ارتباط با دیتای D12
پورت D.2 به پایه اینتراپت D12 وصل میشه که یه مقاومت بالاکش هم نیاز داره و یا میتونین مقاومت بالاکش خود میکرو رو فعال کنید
پورت D.3 به RD چیپ D12
پورت D.4 به WR
پورت D.5 به A0 چیپ D12 وصل میشه
دیگه چیز خاصی هم نداره فقط حتماً یادتون باشه برای USBD12 از یه کریستال 6 مگ استفاده میشه که باید حتماً با دو تا خازن 22 پیکو زمین بشه واگر نه درست عمل نمیکنه (البته کار میکنه ولی باگ زیادی پیش میاره)
برای بهتر کار کردنش هم میتونین از کابلهای یو اس بی نویز گیر دار استفاده کنید یا از فریت بید استفاده نمایید
و در ضمن بهتره رشته های شیلد کابل که به بدنه وصل میشه رو به زمین وصل کنید
دیگه موردی نبود

امیدوارم دوستانی که میخان تازه باهاش کار کنن بتونن از این چیزی یاد بگیرن و به دردشون بخوره
در ضمن برای درایورش هم از windriver jungo استفاده کنید (البته اگه حوصله DDK رو ندارید :mrgreen

من به زودی یه درایور همراه با یه فایل اکتیو ایکس مینویسم که بشه به راحتی با ویژوال بیسیک ارتباط برقرار کرد.

اینم کد
کد:
'GRSRINFO@GMAI.COM
Declare Sub Write_command()
Declare Sub Int_pdi()
Declare Sub Write_data()
Declare Sub Bus_reset()
Dim Temp(16) As Byte
Dim Address_device As Byte
Declare Sub Read_data()
Declare Sub Endpoint_ctrl_out()
Declare Sub Endpoint_ctrl_in()
Declare Sub Standard_request()
Declare Sub Get_status()
Declare Sub Set_feature()
Declare Sub Clear_feature()
Declare Sub Set_address()
Declare Sub Get_descriptor()
Declare Sub Endpoint1_out()
Declare Sub On_datain()
Declare Sub Endpoint2_in()
Dim Bmrequesttype As Byte
Dim Brequest As Byte
Dim Wvalue As Word
Dim Windex As Word
Dim Wlengh As Word
Dim Ttmp As Byte
Dim Index As Byte
Dim Global_length As Word
Dim Index_descriptor As Word
Dim Device_descriptor(18) As Byte
Dim Configuration_discriptor(32) As Byte
Dim String_discriptor(50) As Byte
Dim P As Byte
Dim Bufferi(16) As Byte
Dim Buffero(64) As Byte
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600
Disable Interrupts
Buffero(1) = Asc( "S")
Buffero(2) = Asc( "a")
Buffero(3) = Asc( "l")
Buffero(4) = Asc( "a")
Buffero(5) = Asc( "m")
Device_descriptor(1) = 18
Device_descriptor(2) = 1
Device_descriptor(3) = &H00
Device_descriptor(4) = &H02
Device_descriptor(5) = 0
Device_descriptor(6) = 0
Device_descriptor(7) = 0
Device_descriptor(8) = 16
Device_descriptor(9) = &H71
Device_descriptor(10) = &H04
Device_descriptor(11) = &H64
Device_descriptor(12) = &H13
Device_descriptor(13) = 0
Device_descriptor(14) = 0
Device_descriptor(15) = 0
Device_descriptor(16) = 1
Device_descriptor(17) = 0
Device_descriptor(18) = 1
Configuration_discriptor(1) = 9
Configuration_discriptor(2) = 2
Configuration_discriptor(3) = &H20
Configuration_discriptor(4) = 0
Configuration_discriptor(5) = 1
Configuration_discriptor(6) = 1
Configuration_discriptor(7) = 0
Configuration_discriptor(8) = &H80
Configuration_discriptor(9) = &H32
'//
Configuration_discriptor(10) = 9
Configuration_discriptor(11) = 4
Configuration_discriptor(12) = 0
Configuration_discriptor(13) = 0
Configuration_discriptor(14) = 2
Configuration_discriptor(15) = &HFF
Configuration_discriptor(16) = &HFF
Configuration_discriptor(17) = &HFF
Configuration_discriptor(18) = 0
'//
Configuration_discriptor(19) = 7
Configuration_discriptor(20) = 5
Configuration_discriptor(21) = &H82
Configuration_discriptor(22) = 2
Configuration_discriptor(23) = 64
Configuration_discriptor(24) = 0
Configuration_discriptor(25) = 0
'//
Configuration_discriptor(26) = 7
Configuration_discriptor(27) = 5
Configuration_discriptor(28) = 1
Configuration_discriptor(29) = 2
Configuration_discriptor(30) = 16
Configuration_discriptor(31) = 0
Configuration_discriptor(32) = 0
String_discriptor(1) = 4
String_discriptor(2) = 3
String_discriptor(3) = &H9
String_discriptor(4) = 4
'//
String_discriptor(5) = 14
String_discriptor(6) = 3
String_discriptor(7) = Asc( "N")
String_discriptor(8) = 0
String_discriptor(9) = Asc( "a")
String_discriptor(10) = 0
String_discriptor(11) = Asc( "s")
String_discriptor(12) = 0
String_discriptor(13) = Asc( "s")
String_discriptor(14) = 0
String_discriptor(15) = Asc( "e")
String_discriptor(16) = 0
String_discriptor(17) = Asc( "r")
String_discriptor(18) = 0
String_discriptor(19) = Asc( " ")
String_discriptor(20) = 0
String_discriptor(21) = Asc( "U")
String_discriptor(22) = 0
String_discriptor(23) = Asc( "S")
String_discriptor(24) = 0
String_discriptor(25) = Asc( "B")
String_discriptor(26) = 0
String_discriptor(27) = Asc( " ")
String_discriptor(28) = 0
String_discriptor(29) = Asc( "T")
String_discriptor(30) = 0
String_discriptor(31) = Asc( "e")
String_discriptor(32) = 0
String_discriptor(33) = Asc( "s")
String_discriptor(34) = 0
String_discriptor(35) = Asc( "t")
String_discriptor(36) = 0
String_discriptor(37) = Asc( " ")
String_discriptor(38) = 0
String_discriptor(39) = Asc( " ")
String_discriptor(40) = 0
String_discriptor(41) = Asc( " ")
String_discriptor(42) = 0
String_discriptor(43) = Asc( " ")
String_discriptor(44) = 0
String_discriptor(45) = Asc( " ")
String_discriptor(46) = 0
String_discriptor(47) = Asc( " ")
String_discriptor(48) = 0
String_discriptor(49) = Asc( " ")
String_discriptor(50) = 0
'print ""
'print "Initialize MCU .... ";
Temp(1) = 0
Ddrd.2 = 0
Ddrd.3 = 1
Ddrd.4 = 1
Ddrd.5 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 0
'Gicr = &H40
'Mcucr = 0
'Mcucsr = 0
'Gifr = 40
Dim Ts As Bit
Ts = 0
'print "OK!"
Int_pdi
'Bus_reset
Config Int0 = Low Level
On Int0 Intr0
Enable Interrupts
Enable Int0
'Do
'If Ts = 1 Then
'End
'End If
'Loop
Do
Loop
End
Intr0:
Int_pdi
Return
Sub Int_pdi()
Ttmp = &HF4
Write_command
Ttmp = 2
Read_data
''print Temp(1)
If Temp(1).6 = 1 Then
'print "Bus_Reset .... ";
Bus_reset
'print "OK!"
Elseif Temp(1).7 = 1 Then
'print "Suspend_ch"
Elseif Temp(1).0 = 1 Then
'print "Endpoint_ctrl_out"
Endpoint_ctrl_out
Elseif Temp(1).1 = 1 Then
'print "Endpoint_ctrl_in"
Endpoint_ctrl_in
Elseif Temp(1).2 = 1 Then
'print "Endpoint1_Out"
Endpoint1_out
Elseif Temp(1).3 = 1 Then
'print "Endpoint1_In"
Elseif Temp(1).4 = 1 Then
'print "Endpoint2_Out"
Elseif Temp(1).5 = 1 Then
'print "Endpoint2_In"
Endpoint2_in
End If
Ts = 1
End Sub
Sub Bus_reset()
Address_device = 0
Ttmp = &HD0
Write_command
Ttmp = &H80
Write_data
Ttmp = &HD8
Write_command
Ttmp = &H01
Write_data
Ttmp = &HF3
Write_command
Ttmp = &H1E
Write_data
Ttmp = &H02
Write_data
'Waitms 10
'Write_command &HFB
'Write_data &HC0
End Sub
Sub Write_command()
Ddra = &HFF
Portd.3 = 1
Portd.5 = 1
Porta = Ttmp
Portd.4 = 0
Portd.4 = 1
Portd.5 = 0
End Sub
Sub Write_data()
Ddra = &HFF
Portd.3 = 1
Porta = Ttmp
Portd.4 = 0
Portd.4 = 1
End Sub
Sub Read_data()
Dim I As Byte
''print "NUM:";
''print ttmp
Portd.4 = 1
Ddra = 0
Porta = &HFF
For I = 1 To Ttmp
Portd.3 = 0
Temp(i) = Pina
''print "I:";
''print I
Portd.3 = 1
Next
End Sub
Sub Endpoint_ctrl_out()
Dim Ttp As Byte
Dim Data_packet(16) As Byte
Dim Tp As Byte
Ttmp = &H40
Write_command
Ttmp = 1
Read_data
Ttp = Temp(1)
''print "Ttp:";
''print Hex(ttp)
If Ttp.0 = 1 Then
If Ttp.5 = 1 Then
Ttmp = &H00
Write_command
Ttmp = &HF0
Write_command
Ttmp = 16
Read_data
Ttmp = &HF1
Write_command
Ttmp = &HF2
Write_command
Ttmp = &H41
Write_command
Ttmp = &HF1
Write_command
Ttmp = &HF2
Write_command
''print "Data_Packet:"
'For Tp = 1 To 16
''print Tp;
''print ":";
''print Hex(temp(tp));
''print " ";
'Next
''print ""
If Temp(2) = 8 Then
Bmrequesttype = Temp(3)
Brequest = Temp(4)
Wvalue = Temp(6)
Shift Wvalue , Left , 8
Wvalue = Wvalue Or Temp(5)
Windex = Temp(8)
Shift Windex , Left , 8
Windex = Windex Or Temp(7)
Wlengh = Temp(10)
Shift Wlengh , Left , 8
Wlengh = Wlengh Or Temp(9)
Tp = Bmrequesttype And &H60
If Tp = &H00 Then
Standard_request
Elseif Tp = &H20 Then
'print "Class_Request"
Elseif Tp = &H40 Then
'print "Vendor_Request"
Else
Ttmp = &H40
Write_command
Ttmp = &H1
Write_data
End If
Else
Ttmp = &H40
Write_command
Ttmp = &H1
Write_data
End If
End If
End If
End Sub
Sub Standard_request()
'print "Standard_Request"
Select Case Brequest
Case &H00
'print "Get_Status"
Get_status
Case &H01
'print "Clear_Feature"
Clear_feature
Case &H03
'print "Set_Feature"
Set_feature
Case &H05
'print "Set_Address"
Set_address
Case &H06
'print "Get_Discriptor"
Get_descriptor
Case &H07
'print "Set_Discriptor"
Case &H08
'print "Get_Configuration"
Case &H09
'print "Set_Configuration"
Case &H0A
'print "Get_Interface"
Case &H0B
'print "Set_Interface"
Case Else
Ttmp = &H40
Write_command
Ttmp = &H1
Write_data
End Select
End Sub
Sub Get_status()
Dim Dstt As Byte
Dstt = Bmrequesttype And 3
If Dstt < 3 Then
Ttmp = &HF0
Write_command
Ttmp = 0
Write_data
Ttmp = 2
Write_data
Ttmp = 0
Write_data
Ttmp = 0
Write_data
Ttmp = &HFA
Write_command
Else
Ttmp = &H41
Write_command
Ttmp = &H1
Write_data
End If
End Sub
Sub Set_feature()
Dim Stf As Byte
Stf = Bmrequesttype And 3
Select Case Stf
Case 0
If Wvalue = 1 Then
Ttmp = &H41
Write_command
Ttmp = &H1
Write_data
End If
Case 2
If Wvalue = 0 Then
Ttmp = &H40 + Low(windex)
Write_command
Ttmp = &H1
Write_data
Ttmp = &H01
Write_command
Ttmp = &HF0
Write_command
Ttmp = &H0
Write_data
Ttmp = &H0
Write_data
Ttmp = &HFA
Write_command
End If
Case Else
Ttmp = &H41
Write_command
Ttmp = &H1
Write_data
End Select
End Sub
Sub Clear_feature()
Dim Clf As Byte
Clf = Bmrequesttype And 3
Select Case Clf
Case 0
If Wvalue = 1 Then
Ttmp = &H41
Write_command
Ttmp = &H1
Write_data
End If
Case 2
If Wvalue = 0 Then
Ttmp = &H40 + Low(windex)
Write_command
Ttmp = &H0
Write_data
Ttmp = &H01
Write_command
Ttmp = &HF0
Write_command
Ttmp = &H0
Write_data
Ttmp = &H0
Write_data
Ttmp = &HFA
Write_command
End If
Case Else
Ttmp = &H41
Write_command
Ttmp = &H1
Write_data
End Select
End Sub
Sub Set_address()
Dim Ads As Byte
Address_device = Low(wvalue)
Ads = &H80 Or Address_device
Ttmp = &HD0
Write_command
Ttmp = Ads
Write_data
Ttmp = &H01
Write_command
Ttmp = &HF0
Write_command
Ttmp = 0
Write_data
Ttmp = 0
Write_data
Ttmp = &HFA
Write_command
End Sub
Sub Get_descriptor()
Dim Data_length As Word
Dim Type_descriptor As Byte
Dim Length As Byte
Dim Iig As Byte
Global_length = 0
Index = &H40
'print "Wlengh: ";
'print Hex(wlengh)
Data_length = Wlengh
'print "wvalue: ";
'print Hex(wvalue)
Type_descriptor = High(wvalue)
Iig = 1
'print "Type_descriptor: ";
'print Type_descriptor
Select Case Type_descriptor
Case 1
P = 1
Length = Device_descriptor(1)
Case 2
P = 2
Length = Configuration_discriptor(3)
Case 3
If Low(wvalue) = 1 Then
P = 4
Length = 14
Iig = 5
Else
P = 3
Length = 4
End If
Case 4
P = 5
Length = 9
Iig = 10
Case 5
P = 6
Length = 7
Iig = 19
End Select
If Data_length > Length Then
Data_length = Length
End If
Global_length = Data_length
Index_descriptor = Iig
If Global_length = 0 Then
Ttmp = &H40
Write_command
Ttmp = &H1
Write_data
Ttmp = &H41
Write_command
Ttmp = &H1
Write_data
Else
Endpoint_ctrl_in
End If
End Sub
Sub Endpoint_ctrl_in()
Dim Endlen As Byte
Dim Leng As Byte
Dim Tpe As Byte
Dim Ipe As Byte
Ttmp = &H41
Write_command
Ttmp = 1
Read_data
Tpe = Temp(1) And &H40
'print "TPE: ";
'print Tpe
'print "Temp: ";
'print Hex(temp(1))
'print "index: ";
'print Index
If Index <> Tpe Then
Index = Temp(1) And &H40
'print "Index: ";
'print Index
'print "Global_length: ";
'print Global_length
If Global_length > 16 Then
Leng = 16
Else
Leng = Global_length
End If
'print "Len: ";
'print Leng
Endlen = Leng + Index_descriptor
Endlen = Endlen - 1
'print "Endlen: ";
'print Endlen
Ttmp = &H01
Write_command
Ttmp = &HF0
Write_command
Ttmp = &H00
Write_data
Ttmp = Leng
Write_data
'print "Index_descriptor: ";
'print Index_descriptor
For Ipe = Index_descriptor To Endlen
If P = 1 Then
Ttmp = Device_descriptor(ipe)
'print "Device: ";
'print Ttmp
Elseif P = 2 Or P = 5 Or P = 6 Then
Ttmp = Configuration_discriptor(ipe)
'print "configuration: ";
'print Ttmp
Elseif P = 3 Or P = 4 Then
Ttmp = String_discriptor(ipe)
'print "string: ";
'print Ttmp
End If
Write_data
Global_length = Global_length - 1
Next
'print "Global_length: ";
'print Global_length
Index_descriptor = Endlen + 1
'print "Index_descriptor: ";
'print Index_descriptor
Ttmp = &HFA
Write_command
If Global_length = 0 Then
Ttmp = &H01
Write_command
Ttmp = &HF0
Write_command
Ttmp = 0
Write_data
Ttmp = &HFA
Write_command
End If
End If
End Sub
Sub Endpoint1_out()
Dim Ieo As Byte
Ttmp = &H42
Write_command
Ttmp = &H02
Write_command
Ttmp = &HF0
Write_command
Ttmp = 16
Read_data
Ttmp = &HF2
Write_command
For Ieo = 1 To 16
Bufferi(ieo) = Temp(ieo)
Next
On_datain
End Sub
Sub On_datain()
Dim Ion As Byte
Print "Data in:"
For Ion = 1 To 16
Print Ion;
Print ":";
Print Hex(bufferi(ion));
Print " ";
Next
Print ""
End Sub
Sub Endpoint2_in()
Dim Iei As Byte
Ttmp = &H45
Write_command
Ttmp = &H05
Write_command
Ttmp = &HF2
Write_command
Ttmp = &HF0
Write_command
Ttmp = 0
Write_data
Ttmp = 64
Write_data
For Iei = 1 To 16
Ttmp = Buffero(iei)
Write_data
Next
Ttmp = &HFA
Write_command
End Sub






دیدگاه