Hallo, ich habe mir aus dem Internet ein Modul mit dem CSRA64215 gekauft, da es I2S unterstützt. Als es heute angekommen ist, habe ich es erstmal an einen FPGA angeschlossen, der die Left Justified Daten von dem Modul als I2S an einen DAC weitergibt (In dem späteren Projekt sollen die Daten noch verarbeitet werden). Die Daten von dem Modul werden richtig weitergegeben (Siehe CSR_L.jpg), jedoch sind einige Störgeräusche in den Audiodaten, wie man in CSR_O sehen kann. Meine Fragen sind nun: Hat jemand von euch schon Erfahrung mit dem Modul gemacht? Hat jemand eine Idee was das Problem sein könnte? Gibt es einen anderen Bluetooth Chip mit digitalem Ausgang, der auch als Modul erhältlich ist? Vielen Dank im Voraus Datenblatt: http://www.tinyosshop.com/datasheet/CSRA64215%20QFN%20Data%20Sheet.pdf
:
Verschoben durch Moderator
Danke für den Rat! Ich habe wirklich die Einsynchronisierung vergessen, da ich das Modul so schnell wie möglich testen wollte.
Ich habe jetzt sck, ws und sd einsynchronisiert und das Signal wurde besser. Jedoch sind immernoch Störgeräusche in dem Signal. Ich habe etwas rumprobiert und die Geräuche gehen nur weg, wenn man sck, ws und sd direkt wieder ausgibt. Mein Programm für den DAC Ausgang hat eigentlich immer funktioniert. Also dürfte der Fehler bei dem Empfangen der Daten liegen. Hier ist mein Code um die Daten zu empfangen:
1 | process (clk) |
2 | begin |
3 | if rising_edge(clk) then |
4 | if (sck = '1' and l_sck = '0') then |
5 | if (ws /= l_ws) then |
6 | rx_bit <= 24; |
7 | else |
8 | if (rx_bit > 0) then |
9 | d (rx_bit-1) <= sd; |
10 | rx_bit <= rx_bit - 1; |
11 | else |
12 | if (ws = '0') then |
13 | bt_L <= d; |
14 | else |
15 | bt_R <= d; |
16 | end if; |
17 | end if; |
18 | end if; |
19 | l_ws <= ws; |
20 | end if; |
21 | l_sck <= sck; |
22 | end if; |
23 | end process; |
Ich benutze diesen Code, da er schon bei einem anderen ADC funktioniert hat. Der DAC funktioniert hier:
1 | sck_o <= sck; |
2 | ws_o <= ws; |
3 | sd_o <= sd; |
4 | |
5 | sck <= insrS(2); --(1) hat nicht funktioniert |
6 | ws <= insrW(2); |
7 | sd <= insrD(1); |
Der DAC Code ist das: (sck ist hier eigentlich 3.125 MHZ)
1 | if (sck = '0' and l_sck = '1') then |
2 | if (tx_bit > 0) then |
3 | din_d <= d (tx_bit-1); |
4 | end if; |
5 | elsif (sck = '1' and l_sck = '0') then |
6 | if (ws /= l_ws) then |
7 | tx_bit <= 24; |
8 | if (ws = '1') then |
9 | d <= out_R; |
10 | else |
11 | d <= out_L; |
12 | end if; |
13 | else |
14 | if (tx_bit > 0) then |
15 | tx_bit <= tx_bit - 1; |
16 | end if; |
17 | end if; |
18 | l_ws <= ws; |
19 | end if; |
Ich hab die Lösung gefunden: In dem Signal waren Schwingungen drin, die das Signal gestört haben. Um das zu lösen habe ich diese Implementation gewählt.
1 | process (clk) begin --Einsynchronisieren WE |
2 | if rising_edge(clk) then |
3 | if (insrW(1 downto 0) = "10" and ws_i = '1') then |
4 | insrW <= "11" & ws_i; |
5 | else |
6 | insrW <= insrW(1 downto 0) & ws_i; |
7 | end if; |
8 | end if; |
9 | end process; |
10 | |
11 | process (clk) begin --Einsynchronisieren SDBI |
12 | if rising_edge(clk) then |
13 | if (insrD(1 downto 0) = "10" and sd_bi = '1') then |
14 | insrD <= "11" & sd_bi; |
15 | else |
16 | insrD <= insrD(1 downto 0) & sd_bi; |
17 | end if; |
18 | end if; |
19 | end process; |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.