'W5300 UDP-test from Jurgen - works on EVB from Wiznet $regfile = "m128def.dat" $crystal = 8000000 $baud = 9600 $hwstack = 128 $swstack = 128 $framesize = 128 Config Xram = Enabled 'alias Led1 Alias Portb.4 Led2 Alias Portb.5 Led3 Alias Portb.6 Led4 Alias Portb.7 Switch7 Alias Porte.5 Switch8 Alias Porte.6 Config Led1 = Output Config Led2 = Output Config Led3 = Output Config Led4 = Output Config Switch7 = Input Config Switch8 = Input $include "w5300.inc" Const Udp_debug = 1 'Dim Socket_mode As Byte 'Dim Socket As Byte 'Dim Port As Integer Dim Adres As Word Dim Adresl As Byte At Adres Overlay Dim Adresh As Byte At Adres + 1 Overlay Dim S_port As Word Dim S_portl As Byte At S_port Overlay Dim S_porth As Byte At S_port + 1 Overlay Dim Data_len As Word Dim Data_lenl As Byte At Data_len Overlay Dim Data_lenh As Byte At Data_len + 1 Overlay Dim Adres32 As Long Dim Adres32a1 As Byte At Adres32 Overlay Dim Adres32a2 As Byte At Adres32 + 1 Overlay Dim Adres32a3 As Byte At Adres32 + 2 Overlay Dim Adres32a4 As Byte At Adres32 + 3 Overlay Dim Leng As Long Dim Buf As String * 1460 Dim Buff(1460) As Byte At Buf Overlay Dim Myip(4) As Byte Dim Mygw(4) As Byte Dim Mymac(6) As Byte Dim Mymsk(4) As Byte Dim Mydestip(4) As Byte Declare Sub Wiz_reset() Declare Sub Wiz_init() Declare Sub Wiz_write(byval A As Word , Byval B As Byte) Declare Function Wiz_read(byval A As Word) As Byte Declare Sub Read_ip() Declare Sub Print_ip() Declare Sub Read_mac() Declare Sub Print_mac() Declare Sub Read_mask() Declare Sub Print_mask() Declare Sub Read_gw() Declare Sub Print_gw() Declare Sub Write_ip() Declare Sub Write_mask() Declare Sub Write_gw() Declare Sub Read_destip() Declare Sub Write_destip() Declare Sub Write_mac() Declare Sub New_start() Declare Sub Loopback_udp(byval Socket As Byte , Byval P As Long , Byval Socket_mode As Byte) Declare Function Gets0_ssr() As Byte Declare Function Gets0_rx_rsr() As Long Declare Sub Wiz_read_databuf() Declare Sub Wiz_read_head() Declare Sub Socket_close() Declare Sub Socket_open() Declare Sub Wiz_write_buf() Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Porte.7 , Rs = Porte.2 Config Porte.3 = Output ' LCD R/W Reset Porte.3 Config Lcd = 16 * 2 Open "Com1:" For Binary As #1 Print #1 , "W5300 UDP-test" Initlcd Cls Reset Led1 Reset Led2 Reset Led3 Reset Led4 Buf = "" Myip(1) = 192 Myip(2) = 168 Myip(3) = 0 Myip(4) = 90 Mymsk(1) = 255 Mymsk(2) = 255 Mymsk(3) = 255 Mymsk(4) = 0 Mygw(1) = 192 Mygw(2) = 168 Mygw(3) = 0 Mygw(4) = 1 Mydestip(1) = 192 Mydestip(2) = 168 Mydestip(3) = 0 Mydestip(4) = 70 Mymac(1) = &H0 Mymac(2) = &H8 Mymac(3) = &HDC Mymac(4) = &H14 Mymac(5) = &H83 Mymac(6) = &HA0 Call Wiz_init Do Call Loopback_udp(0 , 48713 , 0) Loop End Sub Wiz_init() Local X As Byte 'Register reset Call Wiz_reset 'Set Mr As Little -endian X = Wiz_read(w5300_mr0) Set X.0 Call Wiz_write(w5300_mr0 , X) 'Set gateway adress Call Wiz_write(w5300_gar0 , Mygw(1)) Call Wiz_write(w5300_gar1 , Mygw(2)) Call Wiz_write(w5300_gar2 , Mygw(3)) Call Wiz_write(w5300_gar3 , Mygw(4)) 'Set Mask Call Wiz_write(w5300_subr0 , Mymsk(1)) Call Wiz_write(w5300_subr1 , Mymsk(2)) Call Wiz_write(w5300_subr2 , Mymsk(3)) Call Wiz_write(w5300_subr3 , Mymsk(4)) 'Set Ip adress Call Wiz_write(w5300_sipr0 , Myip(1)) Call Wiz_write(w5300_sipr1 , Myip(2)) Call Wiz_write(w5300_sipr2 , Myip(3)) Call Wiz_write(w5300_sipr3 , Myip(4)) 'Set Mac adress Call Wiz_write(w5300_shar0 , Mymac(1)) Call Wiz_write(w5300_shar1 , Mymac(2)) Call Wiz_write(w5300_shar2 , Mymac(3)) Call Wiz_write(w5300_shar3 , Mymac(4)) Call Wiz_write(w5300_shar4 , Mymac(5)) Call Wiz_write(w5300_shar5 , Mymac(6)) 'Set TCP Call Wiz_write(w5300_s0_mr , Sn_mr_tcp) 'Set Port number Call Wiz_write(w5300_s0_portr0 , 0) Call Wiz_write(w5300_s0_portr1 , 80) 'Set memory Call Wiz_write(w5300_mtyper0 , 0) Call Wiz_write(w5300_mtyper1 , &HFF) Call Wiz_write(w5300_tmsr0 , 8) Call Wiz_write(w5300_tmsr1 , 8) Call Wiz_write(w5300_tmsr2 , 8) Call Wiz_write(w5300_tmsr3 , 8) Call Wiz_write(w5300_tmsr4 , 8) Call Wiz_write(w5300_tmsr5 , 8) Call Wiz_write(w5300_tmsr6 , 8) Call Wiz_write(w5300_tmsr7 , 8) Call Wiz_write(w5300_rmsr0 , 8) Call Wiz_write(w5300_rmsr1 , 8) Call Wiz_write(w5300_rmsr2 , 8) Call Wiz_write(w5300_rmsr3 , 8) Call Wiz_write(w5300_rmsr4 , 8) Call Wiz_write(w5300_rmsr5 , 8) Call Wiz_write(w5300_rmsr6 , 8) Call Wiz_write(w5300_rmsr7 , 8) Cls Home Lcd "W5300 UDP test" Lowerline Lcd "loopback 48713" End Sub '**************** Reset *********************** Sub Wiz_reset() Call Wiz_write(w5300_mr1 , &H80) Waitms 5 End Sub '*************** Wiznet Write ****************** Sub Wiz_write(byval A As Word , Byval B As Byte) Out A , B End Sub '************** Wiznet Read ****************** Function Wiz_read(byval A As Word) As Byte Local Z As Byte Z = Inp(a) Wiz_read = Z End Function '************** Wiznet Read Data-Buf ****************** Sub Wiz_read_databuf() Local T As Byte Local L As Word Local K As Byte Local X As Integer Local Z As Byte Local Y As Byte Buf = "" L = Data_len 'FIFO buffer i 16 bit K = L And &H1 L = L + K Data_len = L For X = 2 To L Step 2 Z = Inp(w5300_s0_rx_fifor0) Y = Inp(w5300_s0_rx_fifor1) Buf = Buf + Chr(y) Buf = Buf + Chr(z) Next L = Len(buf) If K = 1 Then Buff(l) = 0 End If #if Udp_debug Print #1 , "K: " ; K Print #1 , "L: " ; L Print #1 , "Buf: " ; Buf Print #1 , "Data_len: " ; Data_len #endif End Sub '************** Wiznet Read Head ****************** Sub Wiz_read_head() Local Z As Byte Local Y As Byte 'Read 8 bytes head information Z = Inp(w5300_s0_rx_fifor0) Y = Inp(w5300_s0_rx_fifor1) 'Dest IP Mydestip(2) = Z Mydestip(1) = Y 'Dest IP Z = Inp(w5300_s0_rx_fifor0) Y = Inp(w5300_s0_rx_fifor1) Mydestip(3) = Y Mydestip(4) = Z Z = Inp(w5300_s0_rx_fifor0) Y = Inp(w5300_s0_rx_fifor1) S_portl = Z S_porth = Y Z = Inp(w5300_s0_rx_fifor0) Y = Inp(w5300_s0_rx_fifor1) Data_lenl = Z Data_lenh = Y #if Udp_debug Print #1 , "S_port: " ; S_port Print #1 , "S_porth: " ; S_porth Print #1 , "S_portl: " ; S_portl Print #1, Print #1 , "--------------- Incomming message ---------------" Print #1 , "Data_len: " ; Data_len Print #1 , "UDP Head info" Print #1 , "Dest Port: " ; S_port Print #1 , "Dest IP: " ; Mydestip(1) ; "." ; Mydestip(2) ; "." ; Mydestip(3) ; "." ; Mydestip(4) #endif End Sub '*********************** Wiznet Send To ********************************* Sub Wiz_write_buf() Local Max_buffer_size As Word Local X As Byte Local Y As Byte Local F As Word Local D As Integer Local V As Integer F = 1024 X = Wiz_read(w5300_tmsr0) 'Buffer size socket 0 Max_buffer_size = X * F If Data_len > Max_buffer_size Then Data_len = Max_buffer_size End If Call Wiz_write(w5300_s0_dipr0 , Mydestip(1)) 'set Dest IP Call Wiz_write(w5300_s0_dipr1 , Mydestip(2)) Call Wiz_write(w5300_s0_dipr2 , Mydestip(3)) Call Wiz_write(w5300_s0_dipr3 , Mydestip(4)) Call Wiz_write(w5300_s0_dportr0 , S_porth) 'Set Dest Port Call Wiz_write(w5300_s0_dportr1 , S_portl) V = 2 For D = 1 To Data_len Step 2 Call Wiz_write(w5300_s0_tx_fifor0 , Buff(v)) 'High adress Call Wiz_write(w5300_s0_tx_fifor1 , Buff(d)) 'low adress V = V + 2 Next #if Udp_debug Adres32a4 = Inp(w5300_s0_tx_fsr0) Adres32a3 = Inp(w5300_s0_tx_fsr1) Adres32a2 = Inp(w5300_s0_tx_fsr2) Adres32a1 = Inp(w5300_s0_tx_fsr3) Print #1 , "Max Buffer size: " ; Max_buffer_size Print #1 , "Data_len: " ; Data_len Print #1 , "Socket Lenght: " ; Leng Print #1 , "Buf: " ; Buf Print #1 , "TX Buffer left: " ; Adres32 #endif Adres = Data_len Call Wiz_write(w5300_s0_tx_wrsr0 , &H0) Call Wiz_write(w5300_s0_tx_wrsr1 , &H0) Call Wiz_write(w5300_s0_tx_wrsr2 , Adresh) Call Wiz_write(w5300_s0_tx_wrsr3 , Adresl) Call Wiz_write(w5300_s0_cr1 , Sn_cr_send) X = 0 While X = 0 X = Inp(w5300_s0_ir1) X = X And Sn_ir_sendok Wend Print "Send Finished Ok" Call Wiz_write(w5300_s0_ir1 , 0) End Sub Sub Loopback_udp(byval Socket As Byte , Byval P As Long , Byval Socket_mode As Byte) Local X As Byte Local L As Long X = Gets0_ssr() S_port = P Select Case X Case Sock_udp Leng = Gets0_rx_rsr() If Leng > 0 Then Call Wiz_read_head Call Wiz_read_databuf Call Wiz_write_buf End If Exit Sub Case Sock_closed Call Socket_close Call Socket_open Exit Sub End Select End Sub 'Get Socket status Function Gets0_ssr() As Byte Local X As Byte Local Y As Byte X = Inp(w5300_s0_ssr1) Do Y = Inp(w5300_s0_ssr1) If X = Y Then Exit Do X = Y Loop Gets0_ssr = X End Function 'Get Rx Size Function Gets0_rx_rsr() As Long Local Rec_size As Byte Local Temp As Long Do Rec_size = Wiz_read(w5300_s0_rx_rsr0) Adres32a1 = 0 Rec_size = Wiz_read(w5300_s0_rx_rsr1) Adres32a3 = Rec_size Rec_size = Wiz_read(w5300_s0_rx_rsr2) Adres32a2 = Rec_size Rec_size = Wiz_read(w5300_s0_rx_rsr3) Adres32a1 = Rec_size If Adres32 = Temp Then Exit Do Temp = Adres32 Loop Gets0_rx_rsr = Adres32 End Function '*********************** Close Socket ********************************* Sub Socket_close() Call Wiz_write(w5300_s0_ir1 , &HFF) 'Clear all interupt Call Wiz_write(w5300_s0_cr1 , Sn_cr_close) 'close socket End Sub '*********************** Open Socket ********************************** Sub Socket_open() Call Wiz_write(w5300_s0_mr0 , &H00) 'UDP Mode Call Wiz_write(w5300_s0_mr1 , Sn_mr_udp) Call Wiz_write(w5300_s0_portr1 , S_portl) 'Set Port Call Wiz_write(w5300_s0_portr0 , S_porth) Call Wiz_write(w5300_s0_cr1 , Sn_cr_open) 'Open End Sub