Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32 P103] - [C/CrossWorks] Komunikacja RS232

Dowik 24 Lip 2012 02:14 2788 12
  • #1 24 Lip 2012 02:14
    Dowik
    Poziom 7  

    Napisałem program obsługujący komunikację RS232 dla płytki STM32 P103:
    - dokumentacja płytki https://www.olimex.com/dev/pdf/ARM/ST/STM32-P103.pdf
    - schemat https://www.olimex.com/dev/images/ARM/ST/STM32-P103-sch.gif

    Niestety łącząc docelowo przez konwerter RS232 -> RS485 i podłączając do serwomechanizmu RS28 dynamixel podłączyłem raz zasilanie 15V, 1.2A na lini danych RSa...

    I tu pierwsze pytanie... możliwe, że szlak trafił konwerter i RS232 na płytce? Sama płytka działa bo inne programy, które napisałem na nią wcześniej działają jak powinny. A co do konwertera to próbowałem podłączyć z komputera wyjście szeregowe do konwertera i wysyłać przez terminal portu COM. Było głucho ale nigdy mi to nie działało więc mam nadzieję, że to coś programowego a nie usmażony sprzęt.

    Ale mniejsza o problemy z serwomechanizmem póki co, jeśli RS232 na płytce się nie usmażył to mam problem z moim programem:
    uwaga kod trochę przydługi mi wyszedł!

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod

    W mainie tylko ustawiam zawartość pakietu i używam USART_Init(USART1, 0x00); i USART_Send_Enable();
    Zdaję sobię sprawę, że USART_Bytes_Send będzie się zmieniać i muszę je dać globalnie a USART_Send() wymaga dopracowania :P Jak coś mi się uda przesłać w końcu to dopracuję.
    Próbowałem się łączyć z terminalem portu COM przez port szeregowy komputera ale bezskutecznie a nawet zewrzeć TX z RXem (wepchnąłem kabelek w odpwiednie dziurki wtyczki po prostu) i też nic. Przerwania zgłaszane są prawidłowo tylko... no nic się nie dzieje ;/ Tzn. terminal portu COM nic nie odbiera a i ja nigdy nie otrzymuję żadnych danych.
    Oprócz tego nie jestem pewien, który USART (1-3) odpowiada za RS232? W dokumentacji płytki piszą jakby mógł to być dowolny z nich ale nie jestem do końca pewien.

    edit:
    type.h, GPIO.h i USART_reg.h są również mojego autorstwa i mogę też je tu wkleić. GPIO.h używałem już wcześniej więc powinno działać, type.h tylko definiuje kilka typów, których używam (byte = 1 bajt, word = 2 bajty, dword = 4bajty, null wiadomo i typ bool) a USART_reg.h zrobilem sam przepisując z STM32 reference manual nazwy flag i na którym są bicie.

    0 12
  • #2 24 Lip 2012 08:09
    mickpr
    Poziom 39  

    Tak sobie patrzę na kod od końca:

    Dowik napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    i dlaczego przy 'default' nie zwracasz wartości funkcji (byte)?

    0
  • #3 24 Lip 2012 19:18
    Dowik
    Poziom 7  

    Za switchem jest return zwracający wartość oznaczającą, że wystąpił błąd... rzeczywiście ładniej to będzie wyglądać jak dam go w default ale działać będzie tak samo.
    edit:
    Sprawdziłem miernikiem kabel, którym łączyłem się z PC (male/female) i chyba jest popsuty (nie płynął prąd)... ale drugi, którym łączę się z konwerterem (male/male) niby działa jak trzeba a też nie działa chociaż jak zamieniłem TX z RX z jednej strony (male/male jakiś mało popularny i ciężko było znaleźć to po znajomości został dla mnie zrobiony i podobno źle kabelki były bo właśnie RX jednej strony to TX drugiej) to na USART2 (ciągle nie wiem dlaczego akurat ten?) odbieram w nieskończoność bzdurne bajty danych. Ah tym drugim kablem nie mogę się łączyć z komputerem (ma 2 wyjścia male tylko) więc to jest wariant łączenia z RX28 przez konwerter więc cholera wie co tam się dzieje po drodze.

    0
  • #4 25 Lip 2012 20:48
    Dowik
    Poziom 7  

    Szczęśliwie wszystko to była wina popsutego kabla (albo nieszczęśliwie bo kilka dni mi zeszło na ustalenie tego...) i po zakupieniu nowego komunikacja działa pięknie w obie strony i co najwyżej mogę narzekać na to, że podczas konfiguracji przesyłane są jakieś bzdurne (???) dane po RSie ;)

    0
  • #5 25 Lip 2012 22:10
    LordBlick
    VIP Zasłużony dla elektroda

    Dowik napisał:
    co najwyżej mogę narzekać na to, że podczas konfiguracji przesyłane są jakieś bzdurne (???) dane po RSie
    A jak podciągniesz do Vcc linię TxD ?

    0
  • #6 26 Lip 2012 00:06
    Dowik
    Poziom 7  

    Vcc? Zasilanie mam tylko od strony RS485 konwertera. A nowsze wtyczki kabli szeregowych nie przewidują specjalnie ich rozbierania (no i na mojej rozpisce PINów komunikacji szeregowej nie ma nic takiego).
    W kwestiach sprzętowo technicznych trzeba mi łopatologicznie napisać bo do niedawna jedyny mój kontakt sprzętowy to było włożenie wtyczki gdzie trzeba i przerabianie wtyczek/układów i rozumienie jak to elektrycznie działa ciągle jest dla mnie czarną magią :P
    A co do tych bzdurnych danych to są nawet w komunikacji STM32 P103 -> PC ale w małej ilości (jak w debugerze przeszedłem powoli krok po kroku to było ich więcej i pojawiały się przy konfiguracji GPIO oraz ustawiani rejestrów USART).
    Za to przy przesyłaniu PC - > konwerter albo STM32 P103 -> konwerter lubi na starcie przesłać parędziesiąt bajtów dziwnych danych ale potem działa normalnie.

    Ale jak już jest temat to konwerter mam taki:
    [IMG=http://www.image-share.com/upload/1640/119.jpg]
    Wyjścia Tx+ i Rx+ zwarte (D+?), Tx- i Rx- zwarte (D-?), GND do GND, i napięcie (Vcc?) do napięcia (tylko podpisali 5-12V a moje ma 15V...). Dzisiaj udało mi się komunikacje przez to cudo z PC zrobić ale nie znam się więc apropo mojego podłączenia mogę tylko powiedzieć, że szły dane jak miały xD
    edit:
    chociaż konwerter się grzeje jak diabli z podłączonym napięciem.
    edit2:
    nie trzeba podłączać napięcia jednak bo działa na samym D+, D- i GND.

    0
  • #7 26 Lip 2012 08:18
    LordBlick
    VIP Zasłużony dla elektroda

    Dowik napisał:
    chociaż konwerter się grzeje jak diabli z podłączonym napięciem.
    Och i ach... Podciąganie polega na podłączeniu rezystora (4,7kΩ) między Vcc, a linię.

    0
  • #8 26 Lip 2012 23:29
    Dowik
    Poziom 7  

    Nowy problem jest... działa komunikacja STM32 P103 -> PC i PC -> STM32 P103 jak również PC -> serwomechanizm i serwomechanizm -> PC.

    Jednak STM32 P103 -> serwomechanizm już nie :/ Wymyśliłem, że to wina braku wyprowadzenia wszystkich PINów RS232 tak jak jest to w dokumentacji. Tylko TxD, RxD, CTS, RTS i GND są wyprowadzone. A w opisie konwertera RS232->RS485 napisali "It uses a particular pump to gain power from RS-232 signals (RTS, DTR, TXD)..." gdzie DTR nie jest wyprowadzone do wtyczki na STM32 P103.

    Wie ktoś może jak można by taki problem rozwiązać? Przerabianie płytki raczej nie wchodzi w grę jak pisałem dla mnie sprawy techniczne to czarna magia i prędzej popsuje niż naprawię. Może zwarcie jakichś sygnałów w przewodzie RS232 starczy? Podłączenie zasilania od strony RS485 nic nie zmieniło niestety. W ostateczności jakiś inny konwerter może dać radę? Tylko już tyle kupowałem "ekstra" części, że mogłoby zadziałać :(

    0
  • #9 27 Lip 2012 00:23
    LordBlick
    VIP Zasłużony dla elektroda

    Każdy problem trzeba opisać tak, aby nie trzeba było wróżyć. Jak coś łączysz, to pisz co z czym. A najlepiej schemat.

    0
  • #10 27 Lip 2012 01:07
    Dowik
    Poziom 7  

    Teraz chodzi o PINy RS232... normalny ich układ:
    1) DCD
    2) RXD
    3) TXD
    4) DTR
    5) GND
    6) DSR
    7) RTS
    8) CTS
    9) RI

    A STM32 P103 według dokumentacji ma:
    1) NC (not connected)
    2) TXD
    3) RXD
    4) NC
    5) GND
    6) NC
    7) CTS
    8) RTS
    9) NC

    Tymczasem konwerter RS232->RS485 bierze zasilanie z RTS,DTR,TXD z czego DTR jak pisałem nie ma na wyjściu STM32 P103.

    Pytanie: Co można z tym fantem zrobić? Zewrzeć RTS z DTR np. i jakoś wyciągnie konwerter wymagane napięcie z jednego PINu?

    0
  • #11 27 Lip 2012 09:45
    LordBlick
    VIP Zasłużony dla elektroda

    Nie wiem, co za konwerter używasz bo go nie widziałem na oczy, ale obciążanie linii RS232 w celu zasilania czegoś nie jest normalną praktyką, takie schematy robią początkujący. Jeśli układ ma działać niezawodnie, używa się zasilaczy lub zasilania bateryjnego. Pokaż schemat tego konwertera, to może wtedy uda się ustalić jak to zasilić prawidłowo. Osobiście nie używam MAX232, a SN75176 połączony sygnałowo przez transoptory zasilam z 5V.

    0
  • #12 27 Lip 2012 20:12
    Dowik
    Poziom 7  

    Nie mam pojęcia czy to ten schemat bo każdy sprzedawca prawie ma inaczej wyglądający konwerter ale schemat chociażby jest tutaj:
    http://www.rs232-to-rs485.com/
    A co do zasilania z innych lini RS232 to podobno jest to zwyczajna praktyka:
    http://en.wikipedia.org/wiki/Data_Terminal_Ready
    Akapit na końcu "used as a power pin" apropo DTR i RTS. Co do tego czy tak powinno czy nie powinno się robić to wierzę na słowo ja tu jestem tylko skromnym programistą, a że sprzęt działa jak powinien wierzę na słowo sprzedawcy i potwierdzam potem empirycznie xD

    0
  • #13 28 Lip 2012 09:57
    LordBlick
    VIP Zasłużony dla elektroda

    Schemat na http://www.rs232-to-rs485.com/ jest fałszywy, transoptory od RXD i RTS normalnie stosuje się zamienione - 6N137 na linię danych i PC817 na linię przełączania kierunku transmisji.
    Jak dla mnie, w twoim przypadku, pakowanie po drodze MAX232 jest zbędne.
    Teraz tylko kwestia, czy potrzebujesz optoizolacji, czy nie. Jak nie, to sobie podłączasz odpowiednio albo MAX485, albo SN7516 bezpośrednio do mikrokontrolera.
    Poniżej schemat, który działa niezawodnie w wielu egzemplarzach pewnego urządzenia:
    [STM32 P103] - [C/CrossWorks] Komunikacja RS232

    0