PDA

View Full Version : Lại nói về USB.


billydragon
28-03-2007, 03:27 AM
Tôi cũng mới tìm hiểu về USB. Đọc nhiều bài thấy các bạn băn khoăn, khó xử với cơ cấu và kết cấu khi thiết kế thiết bị dùng với USB. Không cần nói đến dùng IC gì, PIC hay AVR hay Cypess v.v... qua kinh nghiệm của cá nhân, tôi có chút dóng góp như sau:

Nếu bạn muốn dùng USB để giao tiếp, đầu tiên nên tìm hiểu nó hoạt động như thế nào từ phía ngừoi dùng. Sau đó, từ phía người phát triển. Tôi có 1 số kinh nghiệm như sau:

- Mục đích bạn muốn dùng USB để làm gì? Ứng dụng của bạn thuộc loại ngốn tốc độ hay không?

Nếu chỉ để thay thế các giao tiếp gửi/nhận dữ liệu mà trước kia bạn dùng bằng cổng RS-232, LPT, GamePad/joystick thì bạn khỏi cần nghiên cứu nhiều.
Hãy dùng firrmware của hãng cung cấp. cốt loi của vấn đề là bạn dùng HID hay vender config. HID là chuẩn mà Bill gate đã đưa ra để ứng dụng USB như các thiết bị chuẩn được hỗ trợ bời hệ điều hành. NGhĩa là bạn chỉ cần sủa Report (báo cáo) mà thiết bị của bạn cần gửi về cho Host (là PC). TRong report nói lên những ddiefu bạn muốn gửi, bạn (Device - thiết bị, có mã số VID và PID) Cũng giống như Internet, gói dữ liệu bạn gửi sẽ lang thang trên bus USB ai đó có nhu cầu nhận nó thì nhận, không nhận thì thoi, nó chét. Đó là điểm khác xa với kết nối RS-232 và LPT. Khi bạn gia nhập vào USB bus bạn phải khai bao bạn là ai? tên tuoir, nghiệp vụ chức năng v.v... và hệ thống cấp cho bạn 1 địa chỉ để dùng với hệ thống đó. Khi bạn ra khoirheej thống, địa chỉ đó cũng mất luôn. Khi bạn vào lại sẽ ở chỗ khác, không phải ở chỗ vừa rồi.

Nhưng nó cũng không quan trọng.

Hãy đơn giản hóa tất cả mọi vấn đề. Bạn là người Việt, sang TQ làm ăn, bạn khg nhất thiết phải biết tiếng TQ, bạn cần biết các yếu tố sau:

1. thủ tục khai nhập cảnh, khai hải quan, tìm khách sạn và tìm người phiên dịch tiếng Việt<>Trung.

2. Làm những điều bạn muốn làm với TQ,

USB cũng vậy. đừng quan tâm đến nó hoạt động thế nào. hãy làm việc bạn muốn làm bằng cách học cách đăng nhập, khai báo
sau đó gửi dữ kiệu và nhận. Mọi viec đẻ firmware làm.

Tôi mất kg quá vài ngày để học cách làm báo cáo gửi cho PC và nhận lại từ PC dữ liệu. Thủ tục gửi nhận, thông qua các hàm của firrmware.

------
Còn tiếp.

thaithienanh
28-03-2007, 07:46 PM
hay quá tương lai loạt pót bài về USB có lẽ nhiều bạn thích đây:) .

panda
28-03-2007, 08:25 PM
nhưng nếu mình muốn là truyền nhận không liên quan gì đến máy tính cả!
chẳng hạn truyền từ flash usb sang rs232 thì phải như thế nào! mình chưa hình dung được là firmware đó có hiểu được không

billydragon
28-03-2007, 08:53 PM
Khi sử dụng HID class thì việc tạo ra report là quan trọng nhất, nó cho hệ thống biết thiết bị gửi những gì, bao nhiêu byte v.v... sau đó bạn chỉ việc gửi cho đúng cấu trúc đó. Ví dụ tôi làm report về thiết bị chuyển dổi tín hiệu bộ phát điều khiển từ xa dùng cho máy bay mô hình. Dữ liệu tôi cần gửi đi có quãng cách 10ms/1 lần report, mỗi lần gửi 8 byte thì report như sau:

rom struct{byte report[HID_RPT01_SIZE];}hid_rpt01={
0x05, 0x01, // USAGE_PAGE(Generic Desktop)
0x09, 0x04, // USAGE(Joystick)
0xA1, 0x01, // COLLECTON(Application)
//
0x16, 0, 0, // LOGICAL_MINIMUM (0)
0x26, 0xFF,0x04, // LOGICAL_MAXIMUM (CH_MAX-CH_MIN) 11402-6601 =4801 = 0x12C1
0x75, 0x10, // REPORT_SIZE(16)
0x95, 0x01, // REPORT_COUNT(1)
0x09, 0x30, // USAGE(X)
0x81, 0x02, // INPUT(Data,Var,Abs)
0x09, 0x31, // USAGE(Y)
0x81, 0x02, // INPUT(Data,Var,Abs)
0x09, 0x32, // USAGE(Z)
0x81, 0x02, // INPUT(Data,Var,Abs)
0x09, 0x33, // USAGE(Rx)
0x81, 0x02, // INPUT(Data,Var,Abs)
0x09, 0x34, // USAGE(Ry)
0x81, 0x02, // INPUT(Data,Var,Abs)
0x09, 0x35, // USAGE(Rz)
0x81, 0x02, // INPUT(Data,Var,Abs)
0x09, 0x37, // USAGE(Dial)
0x81, 0x02, // INPUT(Data,Var,Abs)
0x09, 0x36, // USAGE(Slider)
0x81, 0x02, // INPUT(Data,Var,Abs)
//
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xC0 // END_COLLECTION
};/* End Collection,End Collection */

Các USAGE(X), Y, Z v.v... chính là tôi khai báo dữ liệu của tôi dùng làm gì, ở đây, nó truyền đạt dữ liệu của các trục X,Y,Z v.. của joystick. Ngoài ra, tùy thuộc độ lớn của dữ liệu, có thể là 1 byte hoặc 2 byte. Ở đây tôi truyền mỗi giá trị là 16 bits tức là 2 byte. Có 8 trục tất cả và 8 nút bất, mỗi nút tương ứng với 1 bits của Byte REPORT_SIZE(16) thể hiện là 16 bit. Như vậy tổng cộng dũ liệu của tôi cần truyền là 17 byte. Trong đó byte 1-16 thể hiện là 8 x 2 byte dùng cho các trục x,y,z v.v... nhìn tổng quát nó như sau:

Byte0 Byte1 Byte2 Byte3 ...... Byte 17
Xlow Xhigh Ylow Yhigh 11111111

Dữ liệu phải đặt byte thấy trước Byte Cao,

Với vài sửa đổi đơn gian như độ dài config, descriptor, report v.v... bạn đã có thể dịch lại mẫu ví dụ của Microchip và trở thành Joystick. Việc còn lại và xử lý dữ liệu tức là chuyển đổi ADC hay PPM để có dữ liệu các trục X, Y, Z để gửi đi mà thôi. Khỏi cần đọc nhiều USB làm gì, như thế nào. Cái bạn cần đọc là HID CLASS mà thôi.

ĐỐi với USB <> RS-232 sử dụng CDC class, có ví dụ sẵn trong firmware của Microchip rồi. bạn cũng phải dùng cấu trúc report theo mẫu, và khi cắm thiết bị vào hệ thống, bạn sẽ phải cài driver của Microchip (có kèm theo firmware)

Tôi dùng libUSB win32 làm thư viện chính thì cũng làm được việc nhận gửi dữ liệu 2 chiều. Tôi viết giao diện để cho PIC nhận dữ liệu với lệnh OUTPUT(Data,Var,Abs). Mọi việc cũng khá đơn giản.

gurkebox
30-03-2007, 02:38 PM
http://mihd.net/m9wnva

falleaf
30-03-2007, 03:02 PM
http://kho.tailieuvietnam.net/index.php?option=com_docman&task=doc_details&gid=375&Itemid=2

Download cuốn này tại Tài liệu Việt Nam cũng có.

Chúc vui