IF i2c_clock_50'EVENT AND i2c_clock_50 = '1' THEN IF (i2c_clk_en = '1') THEN i2c_scl <= clk_i2c; ELSE i2c_scl <= '1'; END IF; -- ack on SCL = HIGH IF (ack_en = '1') THEN CASE i2c_fsm IS WHEN st3 => -- get ack IF (i2c_sda = '0') THEN i2c_fsm <= st4; --ack data_index <= 15; ELSE i2c_clk_en <= '0'; i2c_fsm <= st0; --nack END IF; WHEN st5 => -- get ack IF (i2c_sda = '0') THEN i2c_fsm <= st6; --ack data_index <= 7; ELSE i2c_fsm <= st0; --nack i2c_clk_en <= '0'; END IF; WHEN st7 => -- get ack IF (i2c_sda = '0') THEN i2c_fsm <= st8; -- ack --st8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ELSE i2c_fsm <= st0; --nack i2c_clk_en <= '0'; END IF; WHEN OTHERS => NULL; END CASE; END IF; IF (clk_en = '1') THEN CASE i2c_fsm IS WHEN st0 => -- stand by i2c_sda <= '1'; i2c_busy <= '0'; i2c_done <= '0'; IF (i2c_send_flag = '1') THEN i2c_fsm <= st1; i2c_busy <= '1'; END IF; WHEN st1 => -- start condition i2c_sda <= '0'; i2c_fsm <= st2; data_index <= 7; WHEN st2 => -- send addr i2c_clk_en <= '1'; --start clocking i2c_scl IF (data_index > 0) THEN data_index <= data_index - 1; i2c_sda <= i2c_addr(data_index); ELSE i2c_sda <= i2c_addr(data_index); get_ack <= '1'; END IF; IF (get_ack = '1') THEN get_ack <= '0'; i2c_fsm <= st3; i2c_sda <= 'Z'; END IF; WHEN st4 => -- send 1st 8 bit IF (data_index > 8) THEN data_index <= data_index - 1; i2c_sda <= i2c_data(data_index); ELSE i2c_sda <= i2c_data(data_index); get_ack <= '1'; END IF; IF (get_ack = '1') THEN get_ack <= '0'; i2c_fsm <= st5; i2c_sda <= 'Z'; END IF; WHEN st6 => -- send 2nd 8 bit IF (data_index >0) THEN data_index <= data_index - 1; i2c_sda <= i2c_data(data_index); ELSE i2c_sda <= i2c_data(data_index); get_ack <= '1'; END IF; IF (get_ack = '1') THEN get_ack <= '0'; i2c_fsm <= st7; i2c_sda <= 'Z'; END IF; WHEN st8 => -- stop condition i2c_clk_en <= '0'; i2c_sda <= '0'; i2c_fsm <= st0; i2c_done <= '1'; WHEN OTHERS => NULL; END CASE; END IF;