Перейти к содержанию

jenya7

Участник
  • Публикаций

    1 820
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о jenya7

  • Звание
    Профессионал

Посетители профиля

4 780 просмотров профиля
  1. STM32 CAN фильтр.

    по моему я понял где проблема. STID находиться в HIGH половине региста, сдвинутый на 5 влево. то есть если я хочу получать данные для ID = 0xXX64 (XX - don't care) - нужно настраивать HIGH. CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0064 << 5; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x00FF << 5; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure);
  2. я работаю с этим компонентом. в реальном проекте он ведет себя нормально а в тестбенче нет. как так?
  3. где косяк? скорее всего тестбенч написан неправильно.
  4. так другие сигналы тоже не отражают написанное в тестбенче testbench.vhd
  5. его формирует модуль СПИ мастер. это клок для СПИ слейв.
  6. есть тестбенч begin --начало архитектуры clk_process :process begin s_clk <= '0'; wait for clk_period/2; s_clk <= '1'; wait for clk_period/2; end process; stim_proc: process begin s_mspi_cs <= '0'; --chip select low s_mspi1_wr_done_clr <= '0'; s_mspi1_wr_data <= X"0010"; --WORD_READ s_mspi1_wr_start_trig <= '1'; --send a byte while (s_mspi1_wr_done = '1') loop s_mspi1_wr_start_trig <= '0'; s_mspi1_wr_done_clr <= '0'; end loop; s_mspi1_wr_done_clr <= '1'; s_mspi1_wr_data <= X"0000"; --ADDR_MSB s_mspi1_wr_start_trig <= '1'; --send a byte while (s_mspi1_wr_done = '1') loop s_mspi1_wr_start_trig <= '0'; s_mspi1_wr_done_clr <= '0'; end loop; s_mspi1_wr_done_clr <= '1'; s_mspi1_wr_data <= X"0002"; --ADDR_LSB s_mspi1_wr_start_trig <= '1'; --send a byte while (s_mspi1_wr_done = '1') loop s_mspi1_wr_start_trig <= '0'; s_mspi1_wr_done_clr <= '0'; end loop; s_mspi1_wr_done_clr <= '1'; s_mspi1_wr_data <= X"0000"; --DUMMY s_mspi1_wr_start_trig <= '1'; --send a byte while (s_mspi1_wr_done = '1') loop s_mspi1_wr_start_trig <= '0'; s_mspi1_wr_done_clr <= '0'; end loop; s_mspi1_wr_done_clr <= '1'; s_mspi1_wr_data <= X"0000"; --DUMMY s_mspi1_wr_start_trig <= '1'; --send a byte while (s_mspi1_wr_done = '1') loop s_mspi1_wr_start_trig <= '0'; s_mspi1_wr_done_clr <= '0'; end loop; s_mspi1_wr_done_clr <= '1'; s_mspi_cs <= '1'; --chip select high wait; end process stim_proc; end; --конец архитектуры но если посмотреть на результат симуляции - полная фигня. делитель клока = 1 а s_mspi_clk не равен s_clk. ну и другие сигналы никак не отражают написанного в тестбенче.
  7. попробую сделать тестбенч. довольно емкий тестбенч получается. а как в тестбенче подождать поднятие флага? так - wait for (s_mspi1_wr_done = '1'); - выдает ошибку нашел while (s_mspi1_wr_done = '1') loop end loop;
  8. тут 100% есть рассинхрон посылаемых дами байт и возвращаемого значения. не получается синхронизировать
  9. Я посылаю команду прочесть переменную. Переменная два байта а SPI 8-битный. В первом процесе я принимаю команду case SspiState is when ST_SSPI_IDLE => sital_command <= (others => '0'); if (cs2 = '0') then --falling edge SspiState <= ST_SSPI_COM; end if; when ST_SSPI_COM => if(rx_rdy4 = '1') then sspi_command <= sspi_data; SspiState <= ST_SSPI_ADDR1; end if; when ST_SSPI_ADDR1 => if(rx_rdy4 = '1') then sspi_addr2 <= sspi_data; --MSB first SspiState <= ST_SSPI_ADDR2; end if; when ST_SSPI_ADDR2 => --LSB if(rx_rdy4 = '1') then sspi_addr1 <= sspi_data; case sspi_command is when X"10" => --word read sital_command <= WORD_READ; SspiState <= ST_SSPI_WAIT; when X"12" => --continius read sital_command <= CONT_READ; SspiState <= ST_SSPI_WAIT; when others => SspiState <= ST_SSPI_DATA1; end case; end if; when ST_SSPI_DATA1 => if(rx_rdy4 = '1') then sspi_data2 <= sspi_data; --MSB first SspiState <= ST_SSPI_DATA2; end if; when ST_SSPI_DATA2 => --LSB if(rx_rdy4 = '1') then sspi_data1 <= sspi_data; SspiState <= ST_SSPI_WAIT; case sspi_command is when X"11" => --word write sital_command <= WORD_WRITE; when others => SspiState <= ST_SSPI_WAIT; end case; end if; when ST_SSPI_WAIT => sital_command <= (others => '0'); if (cs2 = '1') then SspiState <= ST_SSPI_IDLE; end if; when others => SspiState <= ST_SSPI_IDLE; end case; Во втором выбираю переменную и выдаю ее наружу when ST_WORD_READ => when X"0002" => sspi_data_out <= X"0306"; -- buld in test, return constant when X"0004" => sspi_data_out <= X"5555"; -- buld in test, return constant when X"0006" => sspi_data_out <= X"AAAA"; -- buld in test, return constant when X"0020" => sspi_data_out <= "0000000000" & REG_F_LPTG_IN; dbg_val2 <= "00" & REG_F_LPTG_IN; State <= ST_SET_READ_1; when ST_SET_READ_1 => SSPI_TX_DATA <= sspi_data_out(15 downto 8); State <= ST_SET_READ_2; when ST_SET_READ_2 => SSPI_TX_DATA <= sspi_data_out(7 downto 0); dbg_val3 <= sspi_data_out(7 downto 0); State <= ST_IDLE; Но данные обновляются только на втором запросе. Выставил на входе 2 Opcode addr_msb addr_lsb dummy dummy response WORD_READ 00 20 00 00 0 //старое значение WORD_READ 00 20 00 00 2 WORD_READ 00 20 00 00 2 Выставил на входе 3 WORD_READ 00 20 00 00 2 //старое значение WORD_READ 00 20 00 00 3 WORD_READ 00 20 00 00 3 Причем dbg_val2 и dbg_val3 я вывожу на дисплей и вижу правильное обновление в той же посылке. а если считываю переменную по адресу 2 WORD_READ 00 04 - 03 00 WORD_READ 00 04 - 03 06 то есть второй байт sspi_data_out(7 downto 0); обновляется только на втором запросе. Не могу отловить проблему.
  10. я покопался в старых проектах, писанных до меня и нашел модуль SMI. я его еще не тестировал, так что не могу сказать насколько он рабочий. А что есть разница какой PHY? Протокол вроде универсальный. В данном случае я должен говорить с MARVELL Ethernet switch.
  11. как чувствовал. :) у меня эти выходы с entity мапируются на выходы в топ entity.
  12. спасибо. я читал что стоит избегать использование inout.
  13. я и сделал через промежуточный сигнал. все равно ошибка. этого я и хочу избежать.
  14. У меня в entity есть выходы REG_OUT_SEL1 : out std_logic_vector(5 downto 0); REG_OUT_SEL2 : out std_logic_vector(5 downto 0); мне нужно через интерфейс (SPI) писать туда значения и считывать текущее состояние выходов signal out_sel1 : std_logic_vector(5 downto 0); signal out_sel2 : std_logic_vector(5 downto 0); out_sel1 <= REG_OUT_SEL1; out_sel2 <= REG_OUT_SEL2; when ST_WORD_READ => when X"0022" => sspi_data_out <= "0000000000" & out_sel1; when X"0023" => sspi_data_out <= "0000000000" & out_sel2; when ST_WORD_WRITE => when X"0022" => REG_OUT_SEL1 <= sspi_data_in(5 downto 0); when X"0023" => REG_OUT_SEL2 <= sspi_data_in(5 downto 0); получаю ошибку но мне не хочется делать REG_OUT_SEL1 : inout std_logic_vector(5 downto 0); есть другое решение?
  15. я учитываю это. я приложил документ более подробно описывающий весь процесс. в любом случае CFM1 size = 188415 - 16384 = 172031 bytes. а размер файла output_file_cfm1_auto.rpd в несколько раз больше. Rpd File Programming Process.doc