Hallo zusammen,
ich habe ein (hoffentlich einfach zu lösendes) Problem bezüglich der
Nutzung eines in VHDL programierten SPI-Slaves:
Ich nutze folgende Vorlage:
http://www.lothar-miller.de/s9y/archives/31-SPI-Slave-im-CPLD.html#extended
da ich die Nutzung des Schieberegisters sehr Elegant finde (im Vergleich
zu Lösungen mit Countern).
Das Empfangen mit dem Slave funktioniert wunderbar. Die paar Zeilen des
Sendens verursachen jedoch Warnings beim synthetisieren und führen zudem
nicht zum erhofften Ergebnis.
1 | entity cSpiSlave is
|
2 | Port (
|
3 | in_CLK : in STD_LOGIC := 'X';
|
4 | in_MOSI : in STD_LOGIC := 'X';
|
5 | in_CS : in STD_LOGIC := 'X';
|
6 | out_MISO: out STD_LOGIC := 'X';
|
7 | o_RxData : out STD_LOGIC_VECTOR (16-1 downto 0)
|
8 | );
|
9 | end cSpiSlave;
|
10 |
|
11 | architecture VERHALTEN of cSpiSlave is
|
12 |
|
13 | signal int_DataRx : STD_LOGIC_VECTOR (16-1 downto 0) := x"5554";
|
14 | signal int_DataTx : STD_LOGIC_VECTOR (16-1 downto 0);
|
15 |
|
16 | begin
|
17 |
|
18 | process(in_CLK,in_CS)
|
19 | begin
|
20 | if rising_edge(in_CLK) then
|
21 | if (in_CS = '0') then
|
22 | int_DataRx <= int_DataRx(16-2 downto 0) & in_MOSI;
|
23 | end if;
|
24 | end if;
|
25 | end process;
|
26 | ---------------------------------------------------------------------------
|
27 | o_RxData <= int_DataRx when in_CS='1' else x"4444";
|
28 |
|
29 |
|
30 | Bis hier klappt alles BESTENS! Aber dann kommt:
|
31 |
|
32 | process (in_CS, int_DataTx, in_CLK)
|
33 | begin
|
34 | if (in_CS='1') then
|
35 | int_DataTx <= x"FAFA";
|
36 | elsif falling_edge(in_CLK) then
|
37 | int_DataTx <= int_DataTx(16-2 downto 0) & '0';
|
38 | end if;
|
39 | end process;
|
40 | out_MISO <= int_DataTx(15) when in_CS='0' else 'Z';
|
Hier die Probleme:
1.) int_DataTx <= x"FFFF"; diese Zuweisung versursacht Warnings, wenn
nicht FFFF sonden Werte von 1 verschieden zugewiesen werden.
WARNING:Xst:1710 - FF/Latch <int_DataTx_0> (without init value) has a
constant value of 0 in block <SPI_inst1>. This FF/Latch will be trimmed
during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch
<int_DataTx_1> (without init value) has a constant value of 0 in block
<SPI_inst1>. This FF/Latch will be trimmed during the optimization
process.
2.) Auf Master-Seite kommen nicht die korrekten Informationen an. Hat
jemand eine Erklärung dafür? (Aus 0xFAFA wird beim Empfang 0xF7BD, aus
0xCF03 wird 0x9249 und aus 0xFFFF wird 0xFFFE??)