PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   USB có khủng khiếp như bạn nghĩ không? (http://www.picvietnam.com/forum/showthread.php?t=472)

bien_van_khat 16-06-2006 06:49 PM

USB có khủng khiếp như bạn nghĩ không?
 
1 Attachment(s)
Mục đích:
Chỉ có 1 mục đích duy nhất viết 1 firmware đơn giản nhất đến mức có thể cho 18F4550, đủ để nó enumerate + truyền nhận 1 vài gói dữ liệu nhỏ.

Bạn nên đọc:
+USB 2.0 spec ít nhất là chương 8, 9, 10
+USB complete chương 1, 2, 3, 4, 5, 6
+Nên đọc thêm USB design by example, USB in a nutshell.

Bạn cũng cần:
+Ít nhất 1 con 18F4550, 2550, 2455 hoặc 4455
+Mạch điện như sơ đồ đính kèm. Chú ý, vì USB hoạt động ở tốc độ cao, bạn nên sắp xếp để cái USB header hoặc điểm nối giữa cable USB vào board mạch của bạn càng gần con PIC càng tốt. Nếu bạn làm trên test board thì đặc biệt chú ý không để 2 dây nối vào đường D+ và D- chéo nhau.


------------------

16-4-2008: Microchip đã cho ra các dòng chip tích hợp usb embeded host + usb on-the-go, cùng với framework mới để hỗ trợ, các bạn quan tâm có thể tham khảo ở đây

http://www.microchip.com/stellent/id...param=en534494

bien_van_khat 16-06-2006 07:06 PM

1 Attachment(s)
Sau khi có phần cứng bạn có thể nạp ngay cái firmware đính kèm dưới đây để chạy thử.

Firmware bên dưới được sửa từ firmware của microchip bới Mat admin của site www.piccoder.co.uk. Tuy nhiên để chạy được cái chương trình trên máy tính bạn cần .NET framework 1.1 (source code = C#)

Bây giờ là vấn đề chính

Làm việc với USB tôi thấy có 2 điểm khó:
1. Chuẩn USB rất rất phức tạp, USB2.0 spec dài 650 trang, USB complete hơn 500 trang. Tất nhiên để thực hiện được như mục đích đề ra từ đầu bạn cần đọc ít trang hơn nhiều. Bạn hầu như không thể nhớ hết nổi thứ tự của các quá trình, do đó lúc này bạn cần 1 tài liệu tham khảo nhanh, khuyên bạn nên có cuốn "USB in a nutshell" (http://beyondlogic.org/)
2. Rất khó debug, nếu phần cứng của bạn enumerate sai hầu như không có cách gì để debug, trừ khi bạn có 1 thiết bị debug phần cứng giá tính = ngàn dollar.

bien_van_khat 16-06-2006 07:46 PM

Giao thức USB được thực hiện qua nhiều lớp, lớp thấp nhất do module USB (SIE) thực hiền, công việc của bạn là xử lý các yêu cầu dưới dạng các cờ do SIE bật mà thôi.
Để có đầy đủ các cờ bạn tham khảo datasheet. Thực tế bạn cần xử lý ít nhất 2 sự kiên sau:
+RESET (cờ URSTIF): host yêu cầu device reset, bạn bắt buộc thực hiện reset không được cãi. Reset đưa tất cả các enpoint từ 1 - 15 về trạng thái disable, riêng EP0 thiết lập thành control EP. Công việc này được thực hiện với các BUFFER DESCRIPTOR (BD) (xem datasheet).
Xóa thanh ghi UADDR về 0 (thanh ghi USB address). Xóa sạch 4 thanh ghi USB status (USTAT) (coi datasheet chỗ này).
+Transaction complete (TRNIF): Công việc nằm ở đây.
. Xác định xem EP nào vừa xong, từ đó xác định BD nào chứa dữ liệu mới nhận được
. Dựa vào BD.status xác định loại TOKEN vừa được yêu cầu: SETUP, IN, OUT?

bien_van_khat 16-06-2006 08:13 PM

+SETUP TOKEN: cụ thể xem spec
. Xác định loại REQUEST: tối thiểu phải xử lý standard_request.

+STANDARD_REQUEST: Tối thiểu phải xử lý 2 request sau:
GET_DESCRIPTOR, SET_ADDRESS

+SET_ADDRESS: cụ thể xem Spec

+GET_DESCRIPTOR: Tối thiểu bạn phải send DEVICE_DESCRIPTOR và CONFIGURATION_DESCRIPTOR.

vậy bạn send dữ liệu như thế nào khi host yêu cầu?

Ví dụ nó yêu cầu DEVICE_DESCRIPTOR (trong quá trình enumerate bằng GET_DESCRIPTOR request với descriptor type = 1), bạn đưa 8 byte đầu của DEVICE_DESCRIPTOR vào bộ đệm của EP0 (cụ thể coi datasheet phần BUFFER DESCRIPTOR), đảo bit kiểm tra DATA0 - DATA1 nếu cần, set bit UOWN (SIE own buffer descriptor). SIE tự trả lời dùm bạn. Sau khi host nhận được 8 byte nó có thể gửi tiếp 1 IN TOKEN yêu cầu "chưa đủ tui muốn nữa", và bạn phải tiếp tục đẩy dữ liệu vào, đảo bit kiểm tra DATA0 - 1, set UOWN, là dữ liệu lại đi tiếp.

Nếu host muốn gửi dữ liệu cho bạn? nó sẽ gửi 1 OUT TOKEN.

Quá trình enumerate ko sử dụng OUT TOKEN, dữ liệu bạn nhận được đều được đính kèm trong SETUP TOKEN. Vì vậy OUT TOKEN chỉ xày ra sau khi enumerate thành công, trong quá trình truyền nhận dữ liệu thông thường. Khi có 1 OUT TOKEN bạn xác định ở trên EP nào, sau đó nhận dữ liệu ở bộ đệm tương ứng, đảo bit kiểm tra DATA0 - 1, xử lý dữ liệu.

bien_van_khat 16-06-2006 08:41 PM

DATA0 và DATA1: cụ thể xem spec.

Đây là chỗ rất rắc rối, và khó hiểu, nhưng nói chung bạn chú ý điểm này

Gói dữ liệu đầu tiên đi kèm SETUP TOKEN luôn luôn là DATA0, và phase dữ liệu bạn đáp trả bắt buộc là DATA1 ko cần quan tâm tới phase dữ liệu cuối của SETUP TOKEN là DATA0 hay DATA1. Nói cách khác trên EP0 khi xảy ra SETUP TOKEN thì chu trình bị reset lại từ đầu (bạn bắt buộc phải ngừng mọi công việc để xử lý cái TOKEN này, và gói dữ liều đầu tiên mà bạn nhận hoặc sẽ phải gửi là hoàn toàn biết trước loại nào).


Vì tôi viết bài này hơi có 1 chút ... hứng nên một số điểm đưa ra không có dẫn chứng. Tuy nhiên mục tiêu nhắm tới là để mọi người cùng thảo luận để có 1 tut thật dẽ hiểu cho 1 vấn đề rất phức tạp.

Toàn bộ bài viết ko hề giải thích bất kỳ khái niệm nào về giao thức USB mà chỉ nhấn vào 1 mục đích: viết firmware cho 18F4550 phải làm những gì. Do đó để có thể thảo luận hiệu quả bạn nên đọc những e-book mà tôi giới thiệu, tránh những câu hỏi như "DATA0 là gì?" - xin lỗi nhé bạn nên tự tìm hiểu tự hơn!!!

falleaf 16-06-2006 10:22 PM

Chân thành cảm ơn các bài viết của bienvankhat.

Có lẽ từ đây chúng ta sẽ có nhiều điều hay để thảo luận về USB với PIC, vì mọi người sẽ bắt đầu thử nghiệm những gì bạn cung cấp.

Chúc vui.

ntc 17-06-2006 12:43 PM

Em có thấy anh bien_van_khat bên diễn đàn USB của Microchip. :D

Trong giai đoạn sắp tới, em sẽ có cơ hội tiếp xúc và làm việc với USB, hy vọng sẽ có nhiều vấn đề để trao đổi với anh.

Em cũng có ý định tương tự như anh sau giai đoạn này, đó là một tut cực kì đơn giản về USB, nhưng anh làm trước rồi. :D

bien_van_khat 17-06-2006 09:34 PM

hì hì, chính xác thì chưa làm xong mà. Mọi người mà ko góp tay thì chẳng bao giờ xong.

Hỏi trên microchip vừa nhanh vừa được trả lời kỹ, nhưng nếu mình hỏi "ngu" quá nó lại ko thèm trả lời. Đành chịu, nên kiếm anh em thảo luận thì vui hơn.

doianhve 18-06-2006 11:49 AM

USB muỗi !
 
Bạn muốn làm USB của 18f2455/18f24550... thì chẳng có gì khó cả.Chỉ cần có bản CCS bản quyền (Có chứa trong đĩa ICD2) là có ngay ví dụ cho firmware.Cố gắng đọc , sửa và chèn mã code là chạy ngon.Tôi làm cách này chạy ầm ĩ .Dùng hai phần mềm sau để TEST.USBio_demo hay WinDriver.(Chúng có khả năng tự sinh mã code nguồn VB hoặc VC++).Nếu bạn là sinh vien ĐHBKHN nếu cần mang USB đến chỗ tôi,tôi sẽ cho bạn các phần mềm đó.Nhưng phải gửi Mail trước.
why1884@yahoo.com
Chúc bạn thành công.

bien_van_khat 18-06-2006 01:17 PM

Vậy hay quá, sao bạn ko up lên mạng đi. Jungo WinDriver 8.01 thì tôi có rồi, có cả crack nhưng chưa giới thiệu cho anh em, vì tôi nghĩ chưa phải lúc. Còn CCS C như bạn nói thì chưa có. Nếu có thể bạn tạo file ISO cái đĩa của bạn, nén lại, rồi chia nhỏ sau đó upload lên rapidshare.com để mọi người cùng tải về, chứ rất nhiều người không ở Hà Nội cũng muốn được xài. Nếu bạn có host khác nhanh hơn thì càng tốt.

falleaf 18-06-2006 02:58 PM

Cứ là hoạt động chia sẻ, picvietnam sẽ hỗ trợ host cho các bạn làm việc. Hoàn toàn không có vấn đề gì.

Chúc vui

ntc 21-06-2006 07:10 PM

Không biết hôm nay mình đọc được cái chữ USB mắc dịch bao nhiêu lần.

:mad:

Nhức đầu quá.

Hehe, nhưng cũng có một số manh mối rồi.

Bang chủ thông cảm, em đang đóng cửa tu luyện USB, nên không có nhiều thời gian cho diễn đàn lắm.

Sẽ cố gắng viết cho PIC bang một cái TUT về USB.

Lại là cái chữ USB mắc dịch.

:mad:

ntc 21-06-2006 07:11 PM

Anh "doianhve" chia xe cho tụi em một mớ công cụ đi chớ.

Chờ anh bữa giờ.

:D

solua 19-07-2006 04:13 PM

Cám ơn bien_van_khat
đệ cũng đang lam USB. Connect vao ổ cứng(ATA) lấy dữ liệu ma làm mãi vẫn vướng.

bien_van_khat 19-07-2006 09:20 PM

Trước đây khá lâu tớ có thử giao tiếp với cái ổ cứng 2G cũ của tớ. Phần khó nhất là truy xuất file trên trên FAT16. Tính viết một tập các hàm để truy xuất file, nhưng mà phức tạp quá + với ko có thời gian đầu tư cho nó nên đành bỏ ngõ.


Múi giờ GMT. Hiện tại là 05:38 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam