我需要进行持续的 SPI 通信以从我拥有的双通道 ADC 读取值,并且为此编写了一个状态机。但是,它似乎没有进入读取第二个通道的状态,我不知道为什么。这是VHDL ...
SPI_read: process (mclk)
--command bits: Start.Single.Ch.MSBF....
constant query_x: unsigned(ADC_datawidth-1 downto 0) := "11010000000000000"; -- Query ADC Ch0 ( inclinometer x-axis)
constant query_y: unsigned(ADC_datawidth-1 downto 0) := "11110000000000000"; -- Query ADC Ch1 ( inclinometer y-axis)
begin
if rising_edge(mclk) then
-- when SPI is not busy, change state and latch Rx data from last communication
if (SPI_busy = '0') then
case SPI_action is
when SETUP =>
SPI_pol <= '0'; -- Clk low when not active
SPI_pha <= 1; -- First edge is half an SCLK period after CS activated
SPI_action <= READ_X;
when READ_X =>
SPI_Tx_buf <= query_x; -- Load in command
y_data <= "00000" & SPI_Rx_buf(11 downto 1);
SPI_send <= '1';
SPI_action <= READ_Y;
when READ_Y =>
SPI_Tx_buf <= query_y; -- Load in command
x_data <= "00000" & SPI_Rx_buf(11 downto 1);
SPI_send <= '1';
SPI_action <= READ_X;
end case;
else
SPI_send <= '0'; -- Deassert send pin
end if;
end if;
end process SPI_read;
该命令被发送到 Tx 缓冲区,最后接收到的数据的值被写入一个信号,该信号输出到一些七段显示器。需要来自 SPI_send 的脉冲来启动传输,启动时,SPI_busy 设置为高电平,直到传输完成。
现在它只会通过 SPI 发送 query_x,我可以知道这一点,因为我可以在示波器上看到它。然而,有趣的是,它向两个显示器输出相同的值,这让我认为它仍在进入它的 READ_Y 状态,但没有改变它输出的 Tx 数据。
我已经盯着这段代码好几个小时了,我想不通。有时一双新鲜的眼睛会让生活更轻松,所以如果你发现了什么,请告诉我。此外,我对处理这个问题的更好方法的建议非常开放,我只是在学习 VHDL,所以我什至不确定我是否以正确的方式做事!