Как настроить adv7513? - PullRequest
       39

Как настроить adv7513?

0 голосов
/ 02 июня 2019

Я устанавливаю adv7513 на стартовый комплект altera GX. Данные, которые я прочитал из регистров после установки, отличаются от данных, которые я отправил.

Я пытался разделить записи на отдельные регистры вместо одной длинной транзакции и изменить порядок записи и чтения, но я всегда читаю 0x03 из 0x98 и 0x00 из остальных регистров.

Я использовал этот контроллер i2c: https://www.digikey.com/eewiki/pages/viewpage.action?pageId=10125324

и я создал конечный автомат в VHDL для управления им и записи данных, сохраненных в

if rising_edge(clk) then

    case state is
    when idle =>
        if (beg='1') then
        state <= start;
        else
        state <= idle;
        end if;
    when start =>
        rom_addr <= count;
        state <= lut_addr_i2c;
    when lut_addr_i2c =>
        ena <= '1'; 
        rw <= '0';
        addr <= "0111001";
        data_wr <= lut_data(15 downto 8);
        state <= lut_data_i2c;
    when lut_data_i2c =>
        if (busy='1' and busy_prev='0') then
        data_wr <= lut_data(7 downto 0);
        state <= cleanup;
        count <= count+1;
        end if;
    when cleanup =>
        if (busy='1' and busy_prev='0') then
        state <= next_lut;
        end if;
    when next_lut =>
        if (count = 31) then
        state <= rd;
        ena <= '0';
        else 
        state <= start;
        end if;
    when rd =>
        ready <= '1';
        count <= 0;
        if (rd_delay = 10000) then
        state <= start_rd;
        else 
        rd_delay <= rd_delay+1;
        state <= rd;
        end if;
    when start_rd =>
        rom_addr <= count;
        if (next_rd = 20000) then
        state <= rd_lut_addr;
        next_rd <= 0;
        else 
        next_rd <= next_rd+1;
        state <= start_rd;
        end if;
    when rd_lut_addr =>
        ena <= '1'; 
        rw <= '0';
        addr <= "0111001";
        data_wr <= lut_data(15 downto 8);
        state <= rd_lut;
    when rd_lut =>
        if (busy='1' and busy_prev='0') then
        rw <= '1';
        count <= count+1;
        state <= rd_cleanup;
        end if;
    when rd_cleanup =>
        if (busy='1' and busy_prev='0') then
        state <= rd_next_lut;
        end if;
    when rd_next_lut => 
        if (count = 31) then
        state <= fin;
        ena <= '0';
        else 
        state <= start_rd;
        ena <= '0';
        end if;
    when fin =>
        state <= fin;
    end case;
    end if;

сигнал крана, что я пишу

сигнал, что я прочитал

1 Ответ

0 голосов
/ 02 июня 2019

Я думаю, что ваша проблема в том, что вы просто переполняете ведомого i2c. Вам следует подождать, пока not busy в вашем состоянии очистки, не позднее, чем вы предоставите второй байт данных.

Ваш код вообще не ждет not busy?

...