私が持っているデュアルチャネルADCから値を読み取るには、継続的なSPI通信を行う必要があり、そうするための一種のステートマシンを作成しました。しかし、2番目のチャンネルを読み取る状態にはなっていないようで、その理由がわかりません。これが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バッファに送信され、最後に受信したデータの値が信号に書き込まれ、7セグメントディスプレイに出力されます。転送を開始するにはSPI_sendからのパルスが必要であり、開始すると、転送が完了するまでSPI_busyがハイに設定されます。
現時点では、SPIを介してquery_xのみを送信します。スコープで確認できるため、これを知ることができます。ただし、興味深いことに、両方のディスプレイに同じ値が出力されているため、出力されているTxデータは変更されていませんが、まだREAD_Y状態になっていると思います。
私はこのコードを何時間も見つめていますが、理解できません。新鮮な目で生活が楽になることもあるので、何か見つけたら教えてください。また、私はこれに対処するためのより良い方法の提案を非常に受け入れています。私はVHDLを学んでいるだけなので、ほとんど正しい方法で物事を行っているかどうかさえわかりません。