Witam.
W oczekiwaniu na płytki do innego projektu postanowiłem zacząć coś nowego - kartę dźwiękową USB na STM32F103C8T6 (blue pill) i przetworniku cyfrowo-analogowym TDA1543 który akurat miałem.
Nie żeby mi taka kombinacja była potrzebna, chciałem po prostu zobaczyć jak wygląda komunikacja audio po USB a "blue pill" był akurat pod ręką. Docelowo całość będzie prawdopodobnie na STM32F4 i wzmacniaczu z wejściem cyfrowym wbudowana w głośniki.
Soft łącznie ze stosem USB napisałem sam. Całość zajmuje 1884 bajtów flasha Częstotliwość próbkowania wynosi 96kHz, stereo, 16bit.
Układ przetestowałem pod Linuxem i W10.
Podłączenie TDA1543 do "blue pill":
PA7 = DATA
PA6 = WS
PA5 = BCLK
================ update 28.08.2020 ================
v0.4 pracuje w trybie asynchronicznym
Załączniki:
stm32 tda1543 USB sound v0.4 by piotr_go.tar.gz(4.64 KB)
Musisz być zalogowany, aby pobrać ten załącznik.
stm32 tda1543 USB sound v0.3 by piotr_go.tar.gz(4.33 KB)
Musisz być zalogowany, aby pobrać ten załącznik.
A w drugą stronę się da? Tzn. ADC -> BluePill->USB PC.
Powinno się dać. Tylko lepiej na STM32F4, bo obecnie I2S generuję softwarowo i z innymi przetwornikami może nie działać (mam przerwy w generowaniu zegara).
Standardowe parametry muzyki na CD.
Próbowałem 96kHz ale USB w procku się chyba nie wyrabia.
Jak nazbieram nowych chęci to przetestuję na F4. Na razie mam dość.
Jeśli pisałeś w C to jak wyglądała optymalizacja pamięci programu? Chodzi mi tu głównie o ograniczanie wielkości bibliotek standardowych, pisanie skryptu linkera itp. Znasz jakieś ciekawe sposoby albo możesz podrzucić parę linków czy tytuł książki?
Chodzi mi tu głównie o ograniczanie wielkości bibliotek standardowych
Nie używam. Operacje bezpośrednio na rejestrach. Startup, konfiguracja taktowania własne. Jedynie *.h z rejestrami od producenta.
Jest z tym trochę roboty, ale całość działa szybko i tak jak chcę.
Książki nie polecę bo żadnej (poza tymi o assemblerze c51) na oczy nie widziałem.
Grzebię głównie w PDFach i przykładach producentów. Czasem szukam po necie jak utknę.
Mnie tym razem forma i treści od Kolegi Piotra nie satysfakcjonuje - szczególnie w kontekście innych wpisów na elektrodzie. Nie mogę zrozumieć czemu ta prezentacja miałaby służyć. Brakuje ewidentnie konkretnych walorów edukacyjnych, na pewno dla takiego amatora jak ja, być może jest to dobra inspiracja zaawansowanych użytkowników, ale szczerze wątpię. No i na koniec jeszcze te punkty za hexy i biny - niby komu te pliki mają się przydać?
Ponarzekałem sobie, być może słabszy dzień , ale żeby nie było całkiem niemerytorycznie:
Marcin15357 napisał:
Jeśli pisałeś w C to jak wyglądała optymalizacja pamięci programu?
piotr_go napisał:
C. Sam się zdziwiłem. Bootloader USB który kiedyś napisałem zajmował prawie 2*tyle.
Cóż w tym dziwnego, że tak mało skoro "większość stosu" jest zawarta właśnie w rejestrach i tylko należy je "odpowiednio poukładać". "Tylko" to oczywiście figura retoryczna, bo jednak działanie USB oraz implementacje w STM32 trzeba dobrze znać i mieć odpowiednią wiedzę w programowaniu, a stosy w HAL to ponoć same zło. Sam niestety nie mam aż takich umiejętności jednak w ostateczności potrafiłem spożytkować prace innych, żeby stworzyć urządzenie HID na stm32f042, które razem z resztą projektu zajmuje 2.4KB flash, przy optymalizacji Os. Mogę się mylić, ale zrobienie z tego karty dźwiękowej to tylko odpowiednia modyfikacja deskryptorów i klasy urządzenia oraz oprogramowanie endpoitów, działania te nie powinny zwiększyć znacznie tego kodu. Zresztą użycie F042F6P to chyba najtańsze, najmniejsze urządzenie ze sprzętowym USB dostępne dla "zwykłego śmiertelnika - programisty".
To jest chyba dobra pora, żeby odmitologizować szczególną trudność programowania STM32 w trybie USB device. Żeby to zrobić to warto spojrzeć na pewien nienajgorszy opis jak to zrobić:
https://forum.lothar-team.pl/viewtopic.php?f=9&t=520 (potrzebna rejestracja na forum).
Opis składa się z 5 części, dzięki którym wypociłem takie coś jak w załączniku. Jest to proste urządzenie klasy HID - klawiatura, trzon oparty na szablonach z CubeIDE_1.3.0. Oczywiście nie należy oczekiwać, że znajdziecie tam jakiś wypasiony kod, szczególnie po moich modyfikacjach, dodatkowo to tylko pewien pogląd na projekt tego typu, ale może komuś pomoże to wraz z opisem, do którego odnośnik pokazałem.
Jak robić prosty przykład urządzenia audio z zewnętrznymi przetwornikami DAC oraz ADC po interfejsie I2S, wraz z implementacją filtrów FIR można znaleźć tu:
https://www.youtube.com/watch?v=lNBrGOk0XzE Są kody, schematy blokowe, tłumaczenia, wszystko co prawda na HAL, ale konfiguracja jest prosta. Łatwo wygenerować kod LL, żeby mieć pogląd jak to zrobić na rejestrach.
Mam nadzieję, że walor edukacyjny wpisu się podniósł, Piotra przepraszam za wcinanie się "z butami" do wątku , ale raczej to rozszerzenie nie zasługuje na nowy wątek.
Załączniki:
STM32F042F6Px_CID_REG_USB.zip(375.76 KB)
Musisz być zalogowany, aby pobrać ten załącznik.
"You do not have access to the posts in this forum."
Przepraszam nie wiedziałem, że to nie jest ogólnodostępne, ale wystarczy zarejestrować się na forum (to zresztą dawne sunduino.pl) by mieć dostęp - tak mi się wydaje - dodam adnotację do mojego postu oraz zapytam admina, czy to tak specjalnie czy błąd na forum.
Przetestowałem pod Windows 10. Soft wymagał drobnej poprawki więc uaktualniłem binarki na początku tematu.
Teraz działa pod Linuxem i pod W10. Nie wymaga dodatkowych sterowników.
Od siebie polecam ChibiOS i jego hala z implementacją USB. Całość mozna bardzo mocno odchudzić wyłączając zbędne rzeczy. a API jest proste w użyciu. Gratuluję obsługi i2s bez sprzetowego i2s, ale obawiam się że jednak jakość dźwięku na tym słyszalnie ucierpiała (jitter).
Gratuluję obsługi i2s bez sprzetowego i2s, ale obawiam się że jednak jakość dźwięku na tym słyszalnie ucierpiała (jitter).
Samo wysyłanie nie powinno być problemem. Obecnie transmisję inicjuję timerem przez DMA, tak że częstotliwość próbek powinna być stała.
Jedynie różnica zegarów między PC a STMem jest problemem. Obecnie w ciągu 1ms na kilkadziesiąt lekko modyfikuję taktowanie DACa.
Wynik wydaje mi się fatalny, pewnie tandetny kwarc. Muszę zmienić i sprawdzić. Oczekiwałem różnicy na poziomie modyfikacji 1ms na sekundę.
(nie chodzi o +- 1ms a o odchyłkę częstotliwości tylko przez 1ms)
Przerobię to później na feedback, wtedy STM będzie ustalał częstotliwość.
Dodałem wersję v0.3.
Udało mi się zwiększyć częstotliwość do 96kHz. Poprawiłem buforowanie. Dodałem DMA do wysyłania danych i zmiany stanu pinu WS.
Soft łącznie ze stosem USB napisałem sam. Całość zajmuje 1884 bajtów flasha
Gratuluję podejścia. Kiedyś też zawzięcie uważałem, że nie należy korzystać z gotowców a pisać od nowa. Pisałem na rejestrach, nie wspomagałem się standardowymi bibliotekami z błędami. Ale mi przeszło Tzn, jeśli mam coś prostego, piszę z ręki, po swojemu, na rejestrach, jednak od kiedy przestałem mieć czas na zabawę a każdy projekt który robię to moja praca, przeliczam każdą godzinę na pieniądze i wogóle się to nie opłaca siedzieć dłużej tylko po to, aby mieć więcej satysfakcji Nie mniej jednak nie namawiam do takiego podejścia, ponieważ po takim projekcie w którym się pewne elementy napisało od zera samemu, zostaje pewna wiedza która może się w przyszłości przydać.
Z gotowymi bibliotekami bywa różnie. Zwykle jak coś chcę zrobić inaczej to okazuje się że szybciej napiszę od nowa jak uda mi się dowiedzieć o co chodzi i zmodyfikować gotowca.
Bywa też że gotowiec nie chce wcale działać. Miałem tak ostatnio z bibliotekami USB do CH554. Niby coś się "ruszało", ale finalnie żadnego efektu. Żaden z hubów który podłączałem nie chciał działać.
A właśnie, huby... Pamiętam że jak próbowałem z gotowcem na STMa to nie było ich obsługi.
Wolę jednak wiedzieć co i jak, i zazwyczaj korzystam tylko z własnych bibliotek.
Zdarza mi się użyć fatFS czy dekodera MP3 (na mp3 się nie planuję porywać ), ale to jak na razie było tyle.
Aaaaaa, wymieniłem kwarc i kondensatory w bluepill, odchyłka spadła do spodziewanego poziomu (96000Hz +- 1...2Hz).
Owszem, z bibliotekami bywa różnie, ale jak nie ma czasu to warto spróbować. Ja ostatnio potrzebowałem zrobić urządzenie które podłączam do kompa i zgłasza się jako port szeregowy, wysyłasz do niego komendy a urządzenie wykonuje pewne działania na pinach. Niby proste, ale napisać od początku na pichotę mimo wszystko troszkę czasu zajmie (zależy jakie się rozwiązanie przyjmie). Wziąłem BluePill, odpaliłem CUBE, wyklikałem port szeregowy na USB, dopisałem parę linijek kodu i po 5 minutach urządzenie gotowe. Czasami się opłaca. Zależy co komu sprawia więcej satysfakcji, zdobyta wiedza podczas pracy czy zarobiony pieniądz w krótkim czasie. Etap ze zdobytą wiedzą już przerabiałem, teraz przerabiam ten drugi Może później wrócę do pierwszego, albo odkryję jeszcze inny
Czasami warto brać też pod uwagę powtarzalność. Jeśli wiesz że dany kawałek wykorzystasz wiele razy i dużo pracujesz z daną rodziną, to warto pogrzebać. Jak to jednorazówka, to czasem i tak trzeba, a czasem nie warto kopać się z koniem
Równie dobrze mogło by tego tematu nie być bo każdy ogarnięty i tak wie, że technicznie wykonanie takiego urządzenia jest możliwe więc nikt tu Ameryki nie odkrywa. Ja osobiście nie rozumiem celu prezentacji tego typu konstrukcji nie udostępniając kodu źródłowego. Cały post i temat z mojego punktu widzenia nie mają żadnego sensu skoro nie mam możliwości podejrzeć istoty rozwiązania. Chyba, że autor jedynie chce się pochwalić, że coś zrobił ... Gdyby nie wpisy kolegi SIMW to przeczytanie tematu byłoby zwykłą stratą czasu.
Tłumaczenie się "pracą za darmo" jest dziecinne bo przecież i tak nawet grosza na tej konstrukcji nie zarobisz.
Równie dobrze mogło by tego tematu nie być bo każdy ogarnięty i tak wie, że to da się to zrobić.
Hehe, i potem powstaje projekt gdzie kupiona karta dźwiękowa albo chiński moduł zostaje przyklejony termoglutem w jakimś pudełku. (tak wiem, użyłem chińskiego modułu, i nawet bez pudełka )
katakrowa napisał:
Chyba, że autor jedynie chce się pochwalić, że coś zrobił
Tak, dokładnie, masz coś przeciwko?
Nie wiem jak ty, ale ja jak czytam o jakimś projekcie to się zastanawiam jak bym sam to zrobił.
Nigdy nie używałem żadnego kodu który ludzie tu zamieszczają. Wystarcza mi inspiracja.
Hehe, i potem powstaje projekt gdzie kupiona karta dźwiękowa albo chiński moduł zostaje przyklejony termoglutem w jakimś pudełku. (tak wiem, użyłem chińskiego modułu, i nawet bez pudełka )
Tak już widzę te tłumy czychające na Twój kod z polskojęzycznej strony.
Wskaż mi tylko jeden taki przykład w którym ktoś uruchomił produkcję jakiegokolwiek urządzenia bazując na kodzie użytkownika z elektrody... Do tego w Chinach.
Wskaż mi tylko jeden taki przykład w którym ktoś uruchomił produkcję jakiegokolwiek urządzenia bazując na kodzie użytkownika z elektrody... Do tego w Chinach.
Przecież tam linkują do Twojego filmy na YT. Ja raczej bym się cieszył, że ktoś skorzystał z mojego rozwiązania zamiast robić z siebie ofiarę za kilka euro - bo pewnie taka jest skala tego procederu ale to oczywiście kwestia osobistego podejścia i nie mam zamiaru wymuszać na Tobie jakiejkolwiek zmiany.
Od lat śledzę Twoje projekty i wiem, że masz wiedzę i umiejętności, którymi warto podzielić się z innymi (nie każdy to złodziej) z drugiej strony obiektywnie na nie patrząc nie robisz nic odkrywczego aby popadać w paranoję. Dlatego podtrzymuję swoje zdanie, że wartość Twoich postów jest dużo mniejsza właśnie z powodu braku kodów. Np taka implementacja VGA na 8051 - sam jak jeszcze bardziej byłem związany z elektroniką chciałem takie coś zrobić. Dziś taki projekt poza tym, że jest ciekawostką nie ma żadnej wartości ... po co to "chronić" jednocześnie odbierając temu całą wartość edukacyjną i merytoryczną. Ja bym sobie to chętnie pooglądał z ciekawości a nie chęci okradania kogokolwiek.
Sam żyję z wytwarzania Oprogramowania i nawet w swoich rozwiązaniach nie ukrywamy przed klientami kodu "oczywistego" (jak np. wspomniany zegarek). Daleki też jestem od propagowania idei open-source bo także uważam, że praca kosztuje ... Spójrz jednak na to wszystko z innej strony. Nie jestem elektronikiem a zajmuję się tym jedynie hobbystycznie, Jestem natomiast analitykiem systemów i także programuję ale na zupełnie innym poziomie abstrakcji niż dzieje się to w elektronice. Język C nie jest moim ulubionym nie umiem go a do tego nie lubię. Na co dzień programuję w innych językach. Hobbystycznie zajmuję się różnymi projektami audio, którymi dzielę się także na tym forum. Od dwóch lat pracuję nad systemem przetwarzania dźwięku w czasie rzeczywistym bazującym na algorytmach genetycznych i sieciach neuronowych i co ciekawe z tą częścią nie mam problemów bo na tym akurat się znam ... Mam natomiast dużo problemów z samym wdrożeniem się w STM ( bo właśnie to uC wybrałem jako docelową platformę ). Wchodząc w Twój temat niezmiernie się ucieszyłem bo poniekąd mógł on być pomocą w rozwiązaniu kilku upierdliwych problemów, które muszę rozwiązać aby wszystko połączyć w całość ... a tu kicha nie ma kodu. Z Twoim kodem czy bez i tak to zrobię - pewnie zajmie mi to więcej czasu, który wolałbym poświęcić na dopracowanie części analizującej dane ale trudno. Finalnym rozwiązaniem i kodem na 100% podzielę się ze społecznością i obojętne jest mi to w jaki sposób i czy zostanie to dalej wykorzystane bo to tylko DIY i hobby, któremu do sensownych komercyjnych rozwiązań i tak bardzo daleko ... Gdybym uważał, że to co robię jest tak bardzo wyjątkowe, że trzeba to chronić to bym zrobił z tego produkt i nawet HEX`a nie udostępniał a skoro już udostępniam to wszystko.
Zauważ, że Ci co "ukradli" Twój HEX zegarka są na tyle słabi i bezczelni, że pewnie nawet jak byś udostępnił kod to by z niego nie skorzystali bo ich interesował włąśnie ten HEX. Gdyby mieli pojęcie o programowaniu to by raczej napisali to sami po swojemu.
Także podsumowując myślę, że więcej dobrego byś dla świata i ogólnego rozwoju elektroniki wniósł udostępniając to co piszesz bo te faktyczne straty finansowe chyba nie są tak ogromne by warte były Twoich nerwów czy nawet uwagi - złodzieje na świecie byli są i będą. Około 20 lat temu mi też bezczelnie ukradli skompilowany program, podmienili w exe dane autora i sprzedawali taniej a to tego jeszcze do allegro zgłosili mnie jako oszusta co skutkowało zablokowaniem mojego konta Jak widać nie miało znaczenia czy bym kod udostępnił czy nie. Zanim się przed allegro wytłumaczyłem to już legalna konkurencja napisała swoje rozwiązanie po swojemu ... Program kosztował 25 zł a w ciągu 3 dni zarobiłem na nim 4000zł ... Pewnie zarobiłbym 3 albo 4 razy tyle gdyby nie wspomniany incydent. Był to gotowy program do podziału łącza internetowego SDI - wówczas bardzo popularnego. Sama jego idea była jednak prosta a liczył się pomysł więc mądra konkurencja szybko to zrobiła po swojemu. Trochę jak z tym zegarkiem ... To nie są produkty czy rozwiązania na których będziesz zarabiał latami ...
No widzisz, mnie za to nie płacą więc kodu nie ma i nie będzie.
No cóż szkoda. Mnie uczyli żeby nie być jak "pies ogrodnika" co sam nie zje ale drugiemu nie da. Niestety jak widać moje argumenty Cię nie przekonują czego nie rozumiem tym bardziej, że w przypadku prezentacji własnej pracy sam odbierasz jej ogromy walor edukacyjny.
Dla bezpieczeństwa sugeruję też nie rozdawać skompilowanych wsadów bo to one a nie kod źródłowy są celem potencjalnych "złodziei" ( przynajmniej tych, z którymi miałeś do czynienia ).
Poza tym życzę kolejnych udanych projektów i dobrej zabawy podczas ich tworzenia.
Hehe, i potem powstaje projekt gdzie kupiona karta dźwiękowa albo chiński moduł zostaje przyklejony termoglutem w jakimś pudełku. (tak wiem, użyłem chińskiego modułu, i nawet bez pudełka )
Tak już widzę te tłumy czychające na Twój kod z polskojęzycznej strony.
Wskaż mi tylko jeden taki przykład w którym ktoś uruchomił produkcję jakiegokolwiek urządzenia bazując na kodzie użytkownika z elektrody... Do tego w Chinach.
Proszę bardzo, ja byłem ofiarą takiego działania nauka drogo kosztowała, niech inni się uczą na moich błędach i nie popełniają swoich.
BTW piotr_go - bardzo fajny i zgrabny projekcik, gratuluję
EDIT teraz dopiero doczytałem, że już podałeś mój przykład - czyli nie ma co się tu za dużo ani tłumaczyć ani rozwijać, po prostu mądrze jest chronic swoją własność i tyle
EDIT teraz dopiero doczytałem, że już podałeś mój przykład - czyli nie ma co się tu za dużo ani tłumaczyć ani rozwijać, po prostu mądrze chronic swoją własność i tyle
W takim razie w kontekście podanych przykładów udostępnianie HEX'ów i PCB mądre nie jest. Dla własnego bezpieczeństwa i spokoju ducha nie powinniście udostępniać nic bo przecież mogą Wam ukraść. Poza tym wg mnie to "kradzieże mienia" na poziomie Jasia, który w piaskownicy zabrał łopatkę Zosi ... Ale oczywiście macie prawo nawet takie coś chronić. Dla mnie to jednak śmieszne.
To tak jakby zaprezentować wzmacniacz nie pokazując jego środka a jedynie mówić, że jest zrobiony super i gra doskonale.
Tak już widzę te tłumy czychające na Twój kod z polskojęzycznej strony. Wskaż mi tylko jeden taki przykład w którym ktoś uruchomił produkcję jakiegokolwiek urządzenia bazując na kodzie użytkownika z elektrody... Do tego w Chinach.
Mój, ale w Polsce i mam to gdzieś, bo to śladowy biznes.
✨ W dyskusji poruszono projekt karty dźwiękowej USB opartej na mikrokontrolerze STM32F103C8T6 (blue pill) oraz przetworniku cyfrowo-analogowym TDA1543. Użytkownik zaprezentował swoje osiągnięcia w zakresie komunikacji audio przez USB, podkreślając, że stworzył własne oprogramowanie, które zajmuje 1884 bajty pamięci flash. Częstotliwość próbkowania wynosi 96 kHz, stereo, 16 bit. W odpowiedziach omawiano możliwości implementacji filtrów, optymalizację kodu, a także problemy z transferami izochronicznymi w STM32F4. Użytkownicy dzielili się doświadczeniami związanymi z programowaniem, używaniem bibliotek oraz wyzwaniami związanymi z jakością dźwięku. Pojawiły się również pytania o możliwość uzyskania wsadu do STM'a oraz o przyszłe projekty z wykorzystaniem innych mikrokontrolerów, takich jak SAMD21. Wygenerowane przez model językowy.