Index: firmware/FTM/ethernet/w5300_modul.vhd
===================================================================
--- firmware/FTM/ethernet/w5300_modul.vhd	(revision 10639)
+++ firmware/FTM/ethernet/w5300_modul.vhd	(revision 10740)
@@ -18,5 +18,4 @@
 --
 ----------------------------------------------------------------------------------
-
 LIBRARY IEEE;
 USE IEEE.STD_LOGIC_1164.all;
@@ -118,10 +117,10 @@
                            INIT, IM, MT, STX, STX1, STX2, STX3, SRX, SRX1, SRX2, SRX3, MAC, MAC1, MAC2, GW, GW1, SNM, SNM1, IP, IP1, TIMEOUT, RETRY,
                            SI, SI0, SI1, SI2, SI3, SI4, SI5, SI6, ESTABLISH, EST1, CONFIG, MAIN, MAIN1, MAIN2, MAIN3, CHK_RECEIVED, SEND_FTU_ERROR,
-                           READ_DATA, WRITE_TO_SD_ADDR, READ_FTU_ERROR, READ_FROM_SD_ADDR, READ_FROM_DD_ADDR, READ_FROM_FL_ADDR, READ_FROM_HEADER_MODUL);
+                           READ_DATA, WRITE_TO_SD_ADDR, READ_FTU_ERROR, READ_DD_BLOCK, READ_FROM_SD_ADDR, READ_FROM_DD_ADDR, READ_FROM_FL_ADDR, READ_FROM_HEADER_MODUL);
   type state_write_type is (WR_START, WR_LENGTH, WR_01, WR_02, WR_03, WR_04, WR_05, WR_06, WR_07, WR_08,
                             WR_WRITE_START_DEL, WR_GET_HEADER, WR_GET_HEADER_WAIT, WR_SD_ADDR, WR_FIFO_DATA, WR_FIFO_DATA_01, WR_FIFO_HEADER, WR_FIFO_HEADER_01, WR_WRITE_END_DEL); 
   type state_interrupt_1_type is (IR1_01, IR1_02, IR1_03, IR1_04);
   type state_interrupt_2_type is (IR2_01, IR2_02, IR2_03, IR2_04, IR2_05, IR2_06);
-  type state_read_data_type is (RD_1, RD_2, RD_3, RD_4, RD_5, RD_CMD, RD_CMD_PARSE, RD_PING, RD_WRITE_SD_ADDR, RD_READ_SD_ADDR, RD_READ_SD_BLOCK, RD_READ_DD_BLOCK, RD_WRITE_SD_BLOCK, RD_X_EVNTS,RD_END);
+  type state_read_data_type is (RD_1, RD_2, RD_3, RD_4, RD_5, RD_CMD, RD_CMD_PARSE, RD_PING, RD_WRITE_SD_ADDR, RD_READ_SD_ADDR, RD_READ_SD_BLOCK, RD_WRITE_SD_BLOCK, RD_X_EVNTS,RD_END);
   type state_write_sd_type is (WRITE_SD_START, WRITE_SD_WAIT, WRITE_SD_END);
   type state_read_sd_type is (READ_SD_START, READ_SD_WAIT, READ_SD_END);
@@ -131,4 +130,5 @@
   type state_read_dd_block_type is (READ_DD_BLOCK_START, READ_DD_BLOCK_WRITE_GENERAL, READ_DD_BLOCK_WRITE, READ_DD_BLOCK_END, READ_DD_BLOCK_INTERN);
   type state_send_ftu_error_type is (SFE_START, SFE_END);
+  type state_rd_x_evnts_type is (RD_X_01, RD_X_02, RD_X_03);
 
   signal RST_TIME : std_logic_vector(19 downto 0) := X"7A120";
@@ -153,5 +153,5 @@
   signal state_read_dd_block                     : state_read_dd_block_type      := READ_DD_BLOCK_START;
   signal state_send_ftu_error                    : state_send_ftu_error_type     := SFE_START;
-
+  signal state_rd_x_evnts                        : state_rd_x_evnts_type         := RD_X_01;
 
   signal interrupt_ignore : std_logic := '1';
@@ -460,5 +460,5 @@
           when SI =>
             par_addr   <= W5300_S0_MR + socket_cnt * W5300_S_INC;
-            par_data   <= X"0101";                    -- ALIGN, TCP
+            par_data   <= X"0101";                    -- 0x0101: ALIGN, TCP
             state_init <= WRITE_REG;
             next_state <= SI0;
@@ -554,16 +554,15 @@
             new_config <= '1';
             config_started_ack <= '0';
+            state_init <= MAIN;
+
+          -- main "loop"
+          when MAIN =>
             if (config_started = '1') then
               new_config <= '0';
               config_started_ack <= '1';
-              state_init <= MAIN;
             end if;
-
-          -- main "loop"
-          when MAIN =>
             chk_recv_cntr <= chk_recv_cntr + 1;
             if (chk_recv_cntr = 1000) then
               chk_recv_cntr   <= 0;
-              state_read_data <= RD_1;
               state_init      <= READ_DATA;
               busy            <= '1';
@@ -575,6 +574,5 @@
                 state_read_dd_block <= READ_DD_BLOCK_END;
               end if;
-              state_read_data <= RD_READ_DD_BLOCK;
-              state_init <= READ_DATA;
+              state_init <= READ_DD_BLOCK;
             elsif ((ftu_error_send = '1') and (wait_for_data_flag = '0')) then
               ftu_error_send_ack <= '1';
@@ -587,4 +585,53 @@
 
 
+          -- read dynamic data block and write it to ethernet
+          when READ_DD_BLOCK =>
+            case state_read_dd_block is
+              when READ_DD_BLOCK_START =>
+                dd_block_start <= '1';
+                dd_block_ready <= '0';
+                if (dd_block_start_ack = '1') then
+                  dd_block_start <= '0';
+                  state_read_dd_block <= READ_DD_BLOCK_WRITE_GENERAL;
+                end if;
+              -- write on-time counter and tempertures to dd-block
+              when READ_DD_BLOCK_WRITE_GENERAL =>
+                dd_write_general <= '1';
+                if (dd_write_general_started = '1') then
+                  dd_write_general <= '0';
+                  state_read_dd_block <= READ_DD_BLOCK_WRITE;
+                end if;
+              -- write dd-block to ethernet when on-time counter and temperatures are ready
+              when READ_DD_BLOCK_WRITE =>
+                if (dd_write_general_ready = '1') then
+                  data_package_type <= FTM_PACKAGE_TYPE_DD;
+                  data_package_length <= DD_BLOCK_SIZE + 1; -- +1 := package end
+                  read_addr_state <= READ_FROM_DD_ADDR;
+                  local_sd_addr <= X"000"; -- start at address 0x000
+                  local_write_length <= "00000" & DD_BLOCK_SIZE;
+                  state_read_dd_block <= READ_DD_BLOCK_END;
+                  next_state <= READ_DD_BLOCK;
+                  state_init <= WRITE_DATA;
+                end if;
+              when READ_DD_BLOCK_END =>
+                dd_block_ready <= '1';
+                if (internal_cmd = '1') then
+                  state_read_dd_block <= READ_DD_BLOCK_INTERN;
+                else
+                  next_state_read_data <= RD_CMD;
+                  state_read_dd_block <= READ_DD_BLOCK_START;
+                  state_init <= READ_DATA;
+                  state_read_data <= RD_5;
+                end if;
+              when READ_DD_BLOCK_INTERN =>
+                if (dd_send = '0') then
+                  dd_send_ready <= '1';
+                  dd_send_ack <= '0';
+                  internal_cmd <= '0';
+                  state_read_dd_block <= READ_DD_BLOCK_START;
+                  state_init <= MAIN;
+                end if;
+            end case; -- state_read_dd_block
+                     
           -- send FTU error message
           when SEND_FTU_ERROR =>
@@ -632,4 +679,5 @@
                 else
                   busy       <= '0';
+                  state_read_data <= RD_1;
                   state_init <= MAIN;
                 end if;
@@ -646,4 +694,5 @@
 
               when RD_END =>
+                state_read_data <= RD_1;
                 if (new_config_flag = '1') then
                   new_config_flag <= '0';
@@ -652,12 +701,7 @@
                   next_state <= MAIN;
                 end if;
-                if (internal_cmd = '0') then
-                  par_addr   <= W5300_S0_CR;
-                  par_data   <= X"0040";  -- RECV
-                  state_init <= WRITE_REG;
-                else
-                  internal_cmd <= '0';
-                  state_init <= MAIN;
-                end if;
+                par_addr   <= W5300_S0_CR;
+                par_data   <= X"0040";  -- RECV
+                state_init <= WRITE_REG;
 
 
@@ -701,4 +745,6 @@
                           start_run <= '0';
                           state_read_data <= RD_5;
+                        else
+                          state_init <= MAIN;
                         end if;
                       -- start run an take X events
@@ -716,4 +762,6 @@
                       stop_run <= '0';
                       state_read_data <= RD_5;
+                    else
+                      state_init <= MAIN;
                     end if;
                     
@@ -724,4 +772,6 @@
                       crate_reset <= '0';
                       state_read_data <= RD_5;
+                    else
+                      state_init <= MAIN;
                     end if;
 
@@ -754,5 +804,6 @@
                       -- read dynamic data block
                       when PAR_READ_DD =>
-                        state_read_data <= RD_READ_DD_BLOCK;
+                        state_init <= READ_DD_BLOCK;
+                        state_read_data <= RD_5;
                       when others =>
                         state_read_data <= RD_5;
@@ -788,8 +839,12 @@
                       ping_ftu_start <= '0';
                       state_ping <= PING_WAIT;
+                    else
+                      state_init <= MAIN;
                     end if;
                   when PING_WAIT =>
                     if (ping_ftu_ready = '1') then
                       state_ping <= PING_WRITE_LIST;
+                    else
+                      state_init <= MAIN;
                     end if;
                   when PING_WRITE_LIST =>
@@ -803,53 +858,4 @@
                     next_state <= READ_DATA;
                     state_init <= WRITE_DATA;
-                end case;
-
-              -- read dynamic data block and write it to ethernet
-              when RD_READ_DD_BLOCK =>
-                case state_read_dd_block is
-                  when READ_DD_BLOCK_START =>
-                    dd_block_start <= '1';
-                    dd_block_ready <= '0';
-                    if (dd_block_start_ack = '1') then
-                      dd_block_start <= '0';
-                      state_read_dd_block <= READ_DD_BLOCK_WRITE_GENERAL;
-                    end if;
-                  -- write on-time counter and tempertures to dd-block
-                  when READ_DD_BLOCK_WRITE_GENERAL =>
-                    dd_write_general <= '1';
-                    if (dd_write_general_started = '1') then
-                      dd_write_general <= '0';
-                      state_read_dd_block <= READ_DD_BLOCK_WRITE;
-                    end if;
-                  -- write dd-block to ethernet when on-time counter and temperatures are ready
-                  when READ_DD_BLOCK_WRITE =>
-                    if (dd_write_general_ready = '1') then
-                      data_package_type <= FTM_PACKAGE_TYPE_DD;
-                      data_package_length <= DD_BLOCK_SIZE + 1; -- +1 := package end
-                      read_addr_state <= READ_FROM_DD_ADDR;
-                      local_sd_addr <= X"000"; -- start at address 0x000
-                      local_write_length <= "00000" & DD_BLOCK_SIZE;
-                      state_read_dd_block <= READ_DD_BLOCK_END;
-                      next_state <= READ_DATA;
-                      state_init <= WRITE_DATA;
-                    end if;
-                  when READ_DD_BLOCK_END =>
-                    dd_block_ready <= '1';
-                    next_state_read_data <= RD_CMD;
-                    -- 
-                    if (internal_cmd = '1') then
-                      state_read_dd_block <= READ_DD_BLOCK_INTERN;
-                    else
-                      state_read_dd_block <= READ_DD_BLOCK_START;
-                      state_read_data <= RD_5;
-                    end if;
-                  when READ_DD_BLOCK_INTERN =>
-                    if (dd_send = '0') then
-                      dd_send_ready <= '1';
-                      dd_send_ack <= '0';
-                      state_read_dd_block <= READ_DD_BLOCK_START;
-                      state_read_data <= RD_5;
-                    end if;
-                     
                 end case;
 
@@ -913,19 +919,26 @@
               -- read X events
               when RD_X_EVNTS =>
-                if (next_packet_data_cnt = 0) then
-                  start_run_num_events (31 downto 16) <= data_read;
-                else
-                  start_run_num_events (15 downto 0) <= data_read;
-                  start_run_param <= cmd_array (2);
-                  start_run <= '1';
-                  if (start_run_ack = '1') then
-                    start_run <= '0';
-                    next_packet_data_cnt <= 0;
+                case state_rd_x_evnts is
+                  when RD_X_01 =>
+                    start_run_num_events (31 downto 16) <= data_read;
+                    state_read_data <= RD_5;
+                    state_rd_x_evnts <= RD_X_02;
+                  when RD_X_02 =>
+                    start_run_num_events (15 downto 0) <= data_read;
+                    start_run_param <= cmd_array (2);
+                    start_run <= '1';
                     wait_for_data_flag <= '0';
-                    next_state_read_data <= RD_CMD;
-                    state_read_data <= RD_5;
-                  end if;
-                end if;
-
+                    state_rd_x_evnts <= RD_X_03;
+                  when RD_X_03 =>
+                    if (start_run_ack = '1') then
+                      start_run <= '0';
+                      state_rd_x_evnts <= RD_X_01;
+                      next_state_read_data <= RD_CMD;
+                      state_read_data <= RD_5;
+                    else
+                      state_init <= MAIN;
+                    end if;
+                end case;
+              
             end case;  -- state_read_data
             
