PDA

View Full Version : Thắc mắc về UART (batbatdieu)


batbatdieu
17-08-2007, 09:50 AM
Nhận tiện cho em hỏi về cái này luôn :
Code :
#include <uart.h> // Module function for uart
//#define Fcy 29491200 // 7.3728 Mhz Crystal XTLxPLL 16
//#define Fcy 14746000 // 7.3728 Mhz Crystal XTLxPLL 8
//#define Fcy 16000000 // 8 Mhz Crystal XTLxPLL 8
#define Fcy 20000000 // 10 Mhz Crystal XTLxPLL 8
#define BAUDRATE 115200 // UART2
.....
.....
OpenUART2(0x8000, 0x400,((Fcy/BAUDRATE)/16) - 1);

với cùng 1 phần cứng và chương trình như trên khi sử dụng TA ngoài 7.3728 và 8Mhz thì UART truyền nhận tốt ,nhưng khi dùng TA 10Mhz thì UART lại không chạy ???

namqn
18-08-2007, 01:55 AM
Nhận tiện cho em hỏi về cái này luôn :
Code :
#include <uart.h> // Module function for uart
//#define Fcy 29491200 // 7.3728 Mhz Crystal XTLxPLL 16
//#define Fcy 14746000 // 7.3728 Mhz Crystal XTLxPLL 8
//#define Fcy 16000000 // 8 Mhz Crystal XTLxPLL 8
#define Fcy 20000000 // 10 Mhz Crystal XTLxPLL 8
#define BAUDRATE 115200 // UART2
.....
.....
OpenUART2(0x8000, 0x400,((Fcy/BAUDRATE)/16) - 1);

với cùng 1 phần cứng và chương trình như trên khi sử dụng TA ngoài 7.3728 và 8Mhz thì UART truyền nhận tốt ,nhưng khi dùng TA 10Mhz thì UART lại không chạy ???
Thạch anh 10 MHz không thích hợp để tạo ra baud rate 115200 bps. Công thức tổng quát trên sẽ cho ra giá trị đặt vào U2BRG là 9, trong khi giá trị cần thiết là 9.85. Do đó sẽ dẫn đến sai số khoảng 7.8%, dứt khoát không thể chấp nhận ngay cả cho trường hợp 7 bit dữ liệu.

Bạn chọn baud rate khác thấp hơn thì mới có thể dùng được thạch anh 10 MHz, chẳng hạn 19200 bps hay 38400 bps.

Thân,

batbatdieu
18-08-2007, 02:18 PM
thực tế em chọn baud từ bảng 19-1 ( Section 19 -UART Family Ref...)
Với BAUDRATE 115200 , Fcy ~ 30 Mhz (7.3728 Mhz Crystal XTLxPLL 16) chọn baud là 15 (sai số 1,9%) như trong bảng thì chạy OK , tương tự với Fcy = 16MHz (8 Mhz Crystal XTLxPLL 8) chọn baud = 8 ( sai số 3,38%) cũng OK , nhưng với Fcy = 20MHz (10 Mhz Crystal XTLxPLL 8) em chọn baud là 10 tức sai số chỉ 1,2% ,thấp hơn so với 2 cái ở trên lại không chạy ( chỉ module UART thôi ,các module khác như ADC, PWM ,..đều chạy bình thường ) :confused: :confused: :confused:

namqn
18-08-2007, 06:27 PM
Code của bạn trong post #34 sẽ có kết quả được làm tròn xuống đến số nguyên gần nhất, nên nó sẽ là 9 chứ không phải 10. Bạn đã thử đặt thẳng giá trị 10 vào đó chưa (10 là giá trị của tham số thứ ba trong lệnh gọi hàm OpenUART2())? Bạn có thử kiểm tra tần số Fcy chưa? Biết đâu nó không chính xác là 20 MHz.

Thân,

batbatdieu
18-08-2007, 08:14 PM
như em đã nói , thực tế em điền thẳng giá trị baudvalue vào hàm OpenUART2 ( cụ thể là 10 với Fcy = 20Mhz - tham khảo từ bảng 19-1 ( Section 19 -UART Family Ref...) ,chứ không dùng công thức như trên . Việc dspic có chạy đúng với tần số 20Mhz hay không em cũng vừa mới đo thử bằng máy osilloscope trên chân OSC1/CLKIN đúng 10Mhz và xuất thử 1 xung PWM và đo bằng máy luôn cũng cho kết quả rất tốt .Trước giờ toàn dùng TA ngoài < 8Mhz nên ko gặp trường hợp này .

namqn
18-08-2007, 10:57 PM
Đến đây thì cần phải xác định là bạn đang dùng chip nào. Có khả năng là silicon bug, cũng có khả năng code của bạn có điểm tới hạn, chỉ phát sinh lỗi ở một tần số đủ cao nào đó. Bạn có thể làm những việc sau:

- Xác định revision của lõi silicon và tìm errata sheet tương ứng để đọc.
- Thử xuất liên tục giá trị 0x55 hay 0xAA và dùng dao động ký đo tại chân TX của chip xem có gì bất ổn hay không.
- Rà soát lại code, rút gọn đến mức tối thiểu để cô lập phần gây lỗi.

Bạn nói rằng UART không chạy, nhưng đó là một từ rất chung chung. Trong trường hợp của bạn, nói rõ hơn về cái gọi là 'không chạy' đó sẽ có ích cho việc tìm lỗi (ví dụ không hề nhận được gì hay nhận được dữ liệu rác hay là một lỗi nào khác).

Thân,

batbatdieu
18-08-2007, 11:48 PM
Em dùng dspic30F4011 ,vấn đề silicon bug để em xem lại .
Đây là code đầy đủ để test UART của em .Với 7.3738 MHz 8xPLL và 8 MHz 8xPLL thì truyền nhận OK ,còn 10 MHz 8xPLL thì không được (Sau khi reset trên màn hình terminal ko nhận đc chuỗi nào , gõ 1 phím bất kì trên màn hình terminal cũng không nhận được kí tự nào ).
Việc phải dùng TA 10 MHz đối với em không quan trọng vì còn nhiều tùy chọn khác ,nhưng không hiểu sao nó lại không chạy mới ức chứ :confused:

namqn
19-08-2007, 12:40 AM
Tôi không có sẵn dsPIC30F4011 và thạch anh 10 MHz ở đây, nhưng vừa sửa lại code trong tập tin 'Vidu4-2.c' (1 trong những tập tin nguồn của dsPIC Tutorial 4) và đã thử với dsPIC30F3011 và bộ dao động ngoài tần số 10 MHz, đã dùng 8x PLL. Kết quả là chương trình chạy bình thường ở baud rate = 38400 bps. Tôi cho là 4011 và 3011 không khác gì nhau, còn tần số 10 MHz từ bộ dao động ngoài đưa qua 8x PLL cũng sẽ cho tần số Fcy = 20 MHz.

Tôi cũng đã thử ở baud rate = 115200 bps, chương trình chạy bình thường.

Bạn có thể dùng tập tin mẫu 'Vidu4-2.c' của tôi để thử.

Thân,