PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 28-03-2007, 08:53 PM   #4
billydragon
Nhập môn đệ tử
 
Tham gia ngày: Oct 2005
Bài gửi: 8
:
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:
PHP Code:
rom struct{byte report[HID_RPT01_SIZE];}hid_rpt01={
        
0x050x01,                        //    USAGE_PAGE(Generic Desktop)
        
0x090x04,                        //    USAGE(Joystick)
        
0xA10x01,                        //    COLLECTON(Application)
                                          //
        
0x1600,                        //        LOGICAL_MINIMUM (0)  
        
0x260xFF,0x04,                //        LOGICAL_MAXIMUM (CH_MAX-CH_MIN) 11402-6601 =4801 =  0x12C1
        
0x750x10,                        //        REPORT_SIZE(16)
        
0x950x01,                        //        REPORT_COUNT(1)
        
0x090x30,                        //        USAGE(X)
        
0x810x02,                        //        INPUT(Data,Var,Abs)
        
0x090x31,                        //        USAGE(Y)
        
0x810x02,                        //        INPUT(Data,Var,Abs)
        
0x090x32,                        //        USAGE(Z)
        
0x810x02,                        //        INPUT(Data,Var,Abs)
        
0x090x33,                        //        USAGE(Rx)
        
0x810x02,                        //        INPUT(Data,Var,Abs)
        
0x090x34,                        //        USAGE(Ry)
        
0x810x02,                        //        INPUT(Data,Var,Abs)
        
0x090x35,                        //        USAGE(Rz)
        
0x810x02,                        //        INPUT(Data,Var,Abs)
        
0x090x37,                        //        USAGE(Dial)
        
0x810x02,                        //        INPUT(Data,Var,Abs)
        
0x090x36,                        //        USAGE(Slider)
        
0x810x02,                        //        INPUT(Data,Var,Abs)
                                          //
        
0x050x09,                        //        USAGE_PAGE (Button)
        
0x190x01,                        //       USAGE_MINIMUM (Button 1)
        
0x290x08,                        //       USAGE_MAXIMUM (Button 8)
        
0x150x00,                        //        LOGICAL_MINIMUM (0)
        
0x250x01,                        //        LOGICAL_MAXIMUM (1)
        
0x750x01,                        //        REPORT_SIZE (1)
        
0x950x08,                        //        REPORT_COUNT (8)
        
0x810x02,                        //        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:

PHP Code:
    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.
billydragon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 07:36 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam