Я пытался установить связь с ЦАП LTC2426 через SPI, но безуспешно. Сейчас ищу помощи. Может ли кто-нибудь сказать мне, почему мой код не работает. CSDAC работает правильно, генерируется SCLK и отправляются 32 бита, но, возможно, я ошибся с синхронизацией. Я был бы очень благодарен, если бы кто-нибудь помог мне исправить код.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DAC is
port
(
CLK : in STD_LOGIC;
SCLK : out STD_LOGIC;
MOSI : out STD_LOGIC;
CSDAC : out STD_LOGIC := '1'
);
end DAC;
architecture Behavioral of DAC is
Signal Counter : Integer range 0 to 32 := 0;
Signal CurrentBit : Integer range 0 to 32 := 0;
Signal DataSent : STD_LOGIC := '1';
Constant Data : STD_LOGIC_VECTOR(31 downto 0) := X"0030FFF0";
Signal Slope : STD_LOGIC := '0';
begin
Prescaler : process(CLK)
begin
if rising_edge(CLK) then
if Counter = 5 then
Slope <= not(Slope);
Counter <= 0;
else
Counter <= Counter + 1;
end if;
end if;
end process;
SCLK <= SLOPE;
WriteDac : process(CLK)
begin
if rising_edge(CLK) then
if DataSent = '1' then
if CurrentBit <= 31 then
CSDAC <= '0';
MOSI <= Data(CurrentBit);
CurrentBit <= CurrentBit +1;
else
CSDAC <= '1';
DataSent <= '0';
end if;
end if;
end if;
end process;
end Behavioral;
РЕДАКТИРОВАТЬ: НОВЫЙ КОД
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DAC is
port
(
CLK : in STD_LOGIC;
SCLK : out STD_LOGIC;
MOSI : out STD_LOGIC;
DEBUG : out STD_LOGIC := '1';
CSDAC : out STD_LOGIC := '1'
);
end DAC;
architecture Behavioral of DAC is
Signal Counter : Integer range 0 to 6 := 0;
Signal Counter2 : Integer range 0 to 33 := 0;
Signal CurrentBit : Integer range 0 to 33 := 0;
Signal Fixed : STD_LOGIC := '0';
Signal DataSent : STD_LOGIC := '0';
Constant Data : STD_LOGIC_VECTOR(31 downto 0) := X"0FFF0C00";
Signal Slope_last : STD_LOGIC := '0';
Signal Slope : STD_LOGIC := '0';
Signal MSS : STD_LOGIC := '0';
begin
WriteDac : process(CLK)
begin
if rising_edge(CLK) then
if Counter = 5 then
Slope_last <= Slope;
Slope <= not(Slope);
if Slope_last = '1' and Slope = '0' then
if Fixed = '1' then
if DataSent = '0' then
if CurrentBit <= 31 then
CSDAC <= '0';
DEBUG <= '0';
MOSI <= Data(CurrentBit);
CurrentBit <= CurrentBit +1;
else
MOSI <= '0';
CSDAC <= '1';
DEBUG <= '1';
DataSent <= '1';
end if;
end if;
else
if Counter2 <= 31 then
CSDAC <= '1';
DEBUG <= '1';
Counter2 <= Counter2 + 1;
MSS <= not(MSS);
MOSI <= MSS;
else
Fixed <= '1';
MOSI <= '0';
end if;
end if;
end if;
else
Counter <= Counter + 1;
end if;
end if;
end process;
SCLK <= SLOPE;
end Behavioral;
Я запускаю MOSI, потому что когда я посылаю пару битов, SCLK восстанавливается. Сначала SCLK работает на частоте около 1,4 МГц, когда я запускаю mosi, он восстанавливается до 4,167 МГц, обратите внимание, что 1,4 МГц или около того может быть 1,5 МГц, я не могу вспомнить это слишком хорошо.