| Author |
Message
|
fikufik Poziom 2

Joined: 23 Jun 2005 Posts: 4 Location: Gdańsk
|
#1
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

|
#
29 Jan 2008 21:49 |
|
|
|
|
|
| Back to top |
|
 |
zagwizdow Poziom 12

Joined: 04 Feb 2005 Posts: 107 Location: zagwizdow
|
#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

Joined: 03 Jun 2004 Posts: 277 Location: Zabrzeg
|
#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

|
#
31 Jan 2008 16:02 |
|
|
|
|
|
| Back to top |
|
 |
fikufik Poziom 2

Joined: 23 Jun 2005 Posts: 4 Location: Gdańsk
|
#4
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

Joined: 04 Feb 2005 Posts: 107 Location: zagwizdow
|
#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

|
#
31 Jan 2008 19:44 |
|
|
|
|
|
| Back to top |
|
 |
tajwoj Poziom 16

Joined: 31 Jan 2005 Posts: 341 Location: Radom
|
#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

Joined: 23 Jun 2005 Posts: 4 Location: Gdańsk
|
#7
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

Joined: 23 Jun 2005 Posts: 230 Location: Bydgoszcz
|
#8
01 Feb 2008 00:57 Re: USB<->RS232 na PL2303x. Linux. |
|
|
|
a bity startu/stopu dobrze ustawiłeś?
|
|
| Back to top |
|
 |