FAQ | Points | Add... | Recent posts | Search | Register | Log in


USB<->RS232 na PL2303x. Linux.


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> USB<->RS232 na PL2303x. Linux.
Author
Message
fikufik
Poziom 2
Poziom 2


Joined: 23 Jun 2005
Posts: 4
Location: Gdańsk

Post#1 Post from the author of the topic 29 Jan 2008 21:49   

USB<->RS232 na PL2303x. Linux.


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
Code:

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:

Code:

[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:
Code:

#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 ;)
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 29 Jan 2008 21:49   





Back to top
   
zagwizdow
Poziom 12
Poziom 12


Joined: 04 Feb 2005
Posts: 107
Location: zagwizdow

Post#2 31 Jan 2008 15:01   

Re: USB<->RS232 na PL2303x. Linux.


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.
Back to top
   
Robot_
Poziom 16
Poziom 16


Joined: 03 Jun 2004
Posts: 277
Location: Zabrzeg

Post#3 31 Jan 2008 16:02   

Re: USB<->RS232 na PL2303x. Linux.


Quote:
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.
Back to top
   
Google

Google Adsense


Post# 31 Jan 2008 16:02   





Back to top
   
fikufik
Poziom 2
Poziom 2


Joined: 23 Jun 2005
Posts: 4
Location: Gdańsk

Post#4 Post from the author of the topic 31 Jan 2008 18:20   

Re: USB<->RS232 na PL2303x. Linux.


@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.
Back to top
   
zagwizdow
Poziom 12
Poziom 12


Joined: 04 Feb 2005
Posts: 107
Location: zagwizdow

Post#5 31 Jan 2008 19:44   

Re: USB<->RS232 na PL2303x. Linux.


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,
Back to top
   
Google

Google Adsense


Post# 31 Jan 2008 19:44   





Back to top
   
tajwoj
Poziom 16
Poziom 16


Joined: 31 Jan 2005
Posts: 341
Location: Radom

Post#6 31 Jan 2008 22:08   

Re: USB<->RS232 na PL2303x. Linux.


Hej,
Może spróbuj podłączyć kwarc 8MHz.
Back to top
   
fikufik
Poziom 2
Poziom 2


Joined: 23 Jun 2005
Posts: 4
Location: Gdańsk

Post#7 Post from the author of the topic 31 Jan 2008 22:48   

Re: USB<->RS232 na PL2303x. Linux.


@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 ;)
Back to top
   
MarasK
Poziom 15
Poziom 15


Joined: 23 Jun 2005
Posts: 230
Location: Bydgoszcz

Post#8 01 Feb 2008 00:57   

Re: USB<->RS232 na PL2303x. Linux.


a bity startu/stopu dobrze ustawiłeś?
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> USB<->RS232 na PL2303x. Linux.
Page 1 of 1
Similar topics
sterownik Mitshubishi linux rs232 (1)
[C][linux] rs232 i krzaki w terminalu (9)
[c] Port rs232 w linux (2)
Terminal RS232 Linux (5)
linux & rs232 (5)
Rs232 linux C (7)
Atmega 16 praca z RS232, adapter USB-RS232. (9)
Przejściówka USB->RS232[FTDI] => obsługa w C [linux] (1)
[C/Python] Obsługa RS232 - Linux (2)
Programowanie RS232 w Linux | uP -> serwer -> log -> (14)

Page generation time: 0.125 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed