logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Komunikacja USB-RS232 z ATmega16 na PL2303x w Linux - problem z połączeniem

fikufik 29 Sty 2008 20:49 4409 7
REKLAMA
  • #1 4749744
    fikufik
    Poziom 2  
    Posty: 4
    Witam wszystkich.
    Mam taki problem na którym stoję już kilka dni.
    Mianowicie tak:
    Posiadam przejściówkę USB-RS opartą o układ PL2303x przez którą to chcę się komunikować z ATmegą16. Przejściówka była dorzucona do zakupionej na wiadomym serwisie aukcyjnym płytki testowej do mikroprocesora.
    Po podłączeniu przejściówki do portu usb w PC generalnie wszystko wygląda OK:

    wycinek lsusb -v
    
    Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               1.10
      bDeviceClass            0 (Defined at Interface level)
      bDeviceSubClass         0 
      bDeviceProtocol         0 
      bMaxPacketSize0        64
      idVendor           0x067b Prolific Technology, Inc.
      idProduct          0x2303 PL2303 Serial Port
      bcdDevice            3.00
      iManufacturer           1 
      iProduct                2 
      iSerial                 0 
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           39
        bNumInterfaces          1
        bConfigurationValue     1
        iConfiguration          0 
        bmAttributes         0xa0
          (Bus Powered)
          Remote Wakeup
        MaxPower              100mA
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           3
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass      0 
          bInterfaceProtocol      0 
          iInterface              0 
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x000a  1x 10 bytes
            bInterval               1
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x02  EP 2 OUT
            bmAttributes            2
    Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x83  EP 3 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               0
    
    


    dmesg po odłączeniu i podpięciu urządzenia:

    
    [46572.937508] usb 1-2: USB disconnect, address 4
    [46572.937718] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0
    [46572.937735] pl2303 1-2:1.0: device disconnected
    [46581.496600] usb 1-2: new full speed USB device using ohci_hcd and address 6
    [46581.602918] usb 1-2: configuration #1 chosen from 1 choice
    [46581.604366] pl2303 1-2:1.0: pl2303 converter detected
    [46581.604554] usb 1-2: pl2303 converter now attached to ttyUSB0
    


    Tak więc chcąc sprawdzić czy kabelek w ogóle działa, zwieram Tx i Rx odpalam CuteCom podpięty pod /dev/ttyUSB0 i patrzę czy jest echo, echo jest więc OK. Dla pewności sprawdzam też pod GTKterm, echo działa.

    W ten sposób chyba mam pewność, że z kabelkiem mimo, że pewnie chiński wyrób wyrobopodobny, to jednak wszystko jest ok ?

    No to podłączam kabelek do ATMegi, Tx z kabelka do PD0 (Rx), a Rx z kabelka do PD1 (Tx), no i masa oczywiście.

    Ładuję do procesora taki program:
    
    #include <avr/io.h>
    
    #define USART_BAUDRATE 9600
    #define F_CPU 8000000UL
    #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
    
    int main (void)
    {
      char ReceivedByte;
    
      UCSRB |= (1 << RXEN) | (1 << TXEN);   // Turn on the transmission and reception circuitry                                                                  
      UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes                                                                          
    
      UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register                                                  
      UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register                                          
    
      for (;;) // Loop forever                                                                                                                                   
        {
          while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR                                     
          ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived"                                                                  
    
          while ( (UCSRA & (1 << UDRE)) == 0 ) {}; // Do nothing until UDR is ready for more data to be written to it                                            
          UDR = ReceivedByte; // Echo back the received byte back to the computer                                                                                
        }
    }
    
    

    Skopiowany z tutoriala na avrfraks (bo doszedłem do wniosku, że może ja sam coś źle napisałem i stąd nie działa).
    Jak widać program ma zwracać echo. To co dostał w UDR ma wysłać z powrotem, nic wielkiego.

    No i tu jest problem bo i owszem wysyła z powrotem to co dostał ale wysyła też bardzo dużo znaków NUL (0x00). Bez znaczenia czy coś wysyłam z PC czy nie, zaraz po resecie ATMega zaczyna wysyłać non stop NUL, czasem dorzuca jeszcze jakiś losowy bit. Udaje się co jakąś chwilę zwrócić wysłany z klawiatury znak, no ale to nie za bardzo mnie zadawala ;)

    Jak program miał na celu tylko wysyłanie znaku to było podobnie, cały czas wysyłane były znaki NUL, a ten znak który miał być wysłany był przekłamany (znaczy przy odbiorze nie był tym znakiem ;))

    Dodam, że fuses są dobrze ustawione: na RC 8MHz.
    Inne bity były domyślnie z płytką więc nie zmieniałem (lowF: 0xE4 highF: 0xC1 zgodnie z http://palmavr.sourceforge.net/cgi-bin/fc.cgi
    ).
    Baudrate ustawiony na taki sam w PC jak i w procesorze, transmisja 8n1.

    Wygrzebałem (http://koti.mbnet.fi/lonnberg/pl2303x.html), że do pl2303x w kernelach do 2.6.8 bodajże włącznie potrzebny był patch na driver, no ale w kolejnych kernelach już niby nie było problemu, stąd wykluczam błąd w sterowniku.

    Wszelkie sugestie mile widziane, bo mi już się skończyły pomysły ;)
  • REKLAMA
  • #2 4755340
    zagwizdow
    Poziom 17  
    Posty: 177
    Pomógł: 21
    Ocena: 7
    Moze sie procek resetuje , w 128 mam takie cos ze jak wylaczam zasilanie to z reguly jakies smiecie wysyla .
    Mozesz tez sprawdzic czy czasem na innej predkosci nie nadaje, (x2 lub /2) zmieniajac w terminalu predkosc.
  • REKLAMA
  • #3 4755518
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Cytat:
    The USART has to be initialized before any communication can take place. The initialization process
    normally consists of setting the baud rate, setting frame format and enabling the
    Transmitter or the Receiver depending on the usage. For interrupt driven USART operation, the
    Global Interrupt Flag should be cleared (and interrupts globally disabled) when doing the
    initialization.
    Before doing a re-initialization with changed baud rate or frame format, be sure that there are no
    ongoing transmissions during the period the registers are changed. The TXC Flag can be used
    to check that the Transmitter has completed all transfers, and the RXC Flag can be used to
    check that there are no unread data in the receive buffer. Note that the TXC Flag must be
    cleared before each transmission (before UDR is written) if it is used for this purpose.

    Cytat z dokumentacji.
    najpierw musisz ustawić uart a później aktywować odbiornik i nadajnik.
  • REKLAMA
  • #4 4755984
    fikufik
    Poziom 2  
    Posty: 4
    @zagwizdow:
    Ale to byłby non stop reset w takim razie? Da się to jakoś sprawdzić, znaczy sprawdzić czy się resetuje i jak z tym walczyć? ;)
    Popróbowałem wszystkie możliwe baud rate, bez żadnych pozytywnych skutków.

    @Robot_:

    Czytałem noty, generalnie wiem, że ten kod co jest powyżej działa, zamieniłem jednak kolejność (Tx i Rx ustawiam po inicjalizacji), nic to niestety nie dało.
  • REKLAMA
  • #5 4756316
    zagwizdow
    Poziom 17  
    Posty: 177
    Pomógł: 21
    Ocena: 7
    sprobuj wlaczyc fusa od "brown-out-detectio.." (poziom i wlaczenie) .
    Dobrze by bylo podlaczyc jakąś diodke zeby powoli mrugala lub liczyć ( na dwoch diodkach) zeby zobaczyc czy wogole chodzi program.
    a nie ma czasem zwarcia na rx'ie procka,
  • #6 4756909
    tajwoj
    Poziom 26  
    Posty: 560
    Pomógł: 106
    Ocena: 102
    Hej,
    Może spróbuj podłączyć kwarc 8MHz.
  • #7 4757096
    fikufik
    Poziom 2  
    Posty: 4
    @zagwizdow:

    Motyw z diodami potwierdził, że zdecydowanie przyciśniecie jakiegokolwiek klawisza na klawiaturze "ożywia" układ (świecą się diody podpięte pod piny Rx i Tx ATMegi). Dodatkowo podczas wykonywania programu nie jest nic dodatkowo wysyłane bo dioda nie mruga, stąd wnioskuję, że te zerowe bajty czytane przez pl2303x wynikają z uwalonego układu w kablu.
    Sprawdzę komunikację po zwykłym RS232 tylko muszę nabyć MAX232, ale wnioskuję, że wszystko zadziała.
    No przynajmniej wiem, że te śmieci nie są wysyłane przez procka ;)

    @tajwoj:

    To też spróbuję, muszę się wybrać do sklepu ;)
  • #8 4757557
    MarasK
    Poziom 18  
    Posty: 231
    Pomógł: 19
    Ocena: 4
    a bity startu/stopu dobrze ustawiłeś?

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczy komunikacji USB-RS232 między mikrokontrolerem ATmega16 a konwerterem USB-RS opartym na układzie PL2303x pod systemem Linux. Po podłączeniu przejściówki do portu USB urządzenie jest wykrywane poprawnie (ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port), jednak pojawiają się problemy z odbiorem danych – odczytywane są zerowe bajty lub "śmieci". Podejrzewane są różne przyczyny: resetowanie mikrokontrolera, nieprawidłowa konfiguracja UART (kolejność inicjalizacji, ustawienia prędkości transmisji, bity startu/stopu), brak stabilnego zasilania (propozycja włączenia fusa brown-out detection), ewentualne zwarcie na linii Rx, brak kwarcu 8 MHz oraz uszkodzony kabel. Testy z diodami LED potwierdziły, że mikrokontroler nie wysyła niepożądanych danych, a układ "ożywia się" po naciśnięciu klawisza na klawiaturze, co wskazuje na problem sprzętowy lub z kablem. Planowane jest sprawdzenie komunikacji przez standardowy interfejs RS232 z użyciem układu MAX232, aby wyeliminować problem z konwerterem PL2303x lub kablem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA