با سلام
مدتی بود دنبال یه سورس ساده واسه 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
دیدگاه