![]() |
|
Tài trợ cho PIC Vietnam |
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 |
|
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: May 2005
Bài gửi: 14
: |
không thấy diễn đàn này nói về kiến trúc máy tính nhỉ !!!
He he he !!! Không thấy các bạn nói về kiến trúc máy tính mà chỉ thấy nói về RS232 với USB phải chăng các bạn định giải bài toán hộp đen chắc ???
|
![]() |
![]() |
![]() |
#2 |
Nhập môn đệ tử
Tham gia ngày: Sep 2005
Bài gửi: 8
: |
ok với ý kiến của bác bvk. Để bàn về USB, mọi người đều cần fải có hiểu biết về giao diện vật lý, giao thức truyền, các bước điểm danh để nhận thiết bị USB của Host USB (tất nhiên có sơ qua chút ít lquan đến kiến trúc máy tính). Sau khi đã làm được cái mạch test cắm vào cổng USB của máy tính (fw nạp vào) mà nó chạy ngon lành rồi chúng mình cùng phân tích để viết nên một Tu. về USB. Chứ cứ bàn về chủ đề TL thì...chậc... chậc ...chán như con gián chết. mông lung tung lắm.
Theo ý kiến cá nhân tui, USB Spe.. đọc là ok rồi. Cấu trúc của USB và giao thức USB cũng có thể được phân tích ra theo mô hình OSI (như bác ntc nói đó) tui xin mạn phép phân tích và gửi file kèm theo sau. Ai đã nạp fw rồi, chúgn mình cùng share nhé, tui nạp cái fw chạy ầm ầm, dùng Tiousb hay wdriver cũng được, cái chính là tui chưa hiểu rõ lắm về code của nó. Đã ai làm bằng cách này chưa? bàn bạc giúp với. mình có thể viết một cái driver cho USB được đấy. |
![]() |
![]() |
![]() |
#3 |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Bác này có vẻ hăng hái về USB quá nhỉ, hà hà. Quan điểm của tớ là ko làm driver chỉ làm fw nên thật ra tớ chẳng biết gì về driver hết. Toàn xài đồ làm sẵn thôi. Fw thì ko khó tớ làm rồi, bắt đầu hoàn toàn từ con số 0, nhưng chưa hoàn thiện, chỉ ở mức sơ khai mà thôi. Nêu bác có ý định bắt đầu với fw trước thì tớ có thể góp ý với bác được. Vì cũng mong là có được cái tut USB do hồi mới bắt đầu làm lùng sục khắp net cũng chẳng thấy được cái nào.
|
![]() |
![]() |
![]() |
#4 | |
Nhập môn đệ tử
Tham gia ngày: Sep 2005
Bài gửi: 8
: |
![]() Trích:
![]() Bác bvk chỉ giáo giúp nhé. Bắt đầu với fw. tui mới tập tễnh vào USB thôi. |
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 1 túi
|
Mình đang học về USB mong mọi người giúp đỡ.
Xin hỏi cách sử dụng thư viện mpusbapi.dll của Microchip. Để sử dụng thì cần dùng firmware nào ? Mình down file MicrochipCustomDriver về setup rồi mà chưa biết sử dụng thế nào. |
![]() |
![]() |
![]() |
#6 |
Đệ tử 8 túi
|
http://www.comvcon.com/default.asp
Bạn vào đây để đọc thêm. Trong đó có cả một số ví dụ để sử dụng thư viện liên kết động mpusbapi.dll. Trong đó có 4 phần hướng dẫn sử dụng thư viện. Phải đọc hết. Chịu khó đọc kĩ một chút. ![]() Về MicrochipCustomDriver, phải tìm hiểu code thật kĩ mới sử dụng được. Đó là cái sườn cơ bản cho firmware giao tiếp USB, tìm hiểu đến nơi đến chốn bạn sẽ biết được việc chèn thêm code của mình vào chỗ nào để phát triển các ứng dụng cho riêng mình. thay đổi nội dung bởi: ntc, 12-12-2006 lúc 06:40 PM. |
![]() |
![]() |
![]() |
#7 |
Đệ tử 1 túi
|
Cảm ơn ntc, trang web đó có hướng dẫn thật tuyệt. Mình làm theo ok rồi.
Mình đã sửa file user.c để có thêm request của mình. Nhưng sao tốc độ chậm thế nhỉ, mình cho truyền liên tục từ firmware lên chỉ đạt 16KByte/s (mở EP1, chế độ Bulk, 64 bytes) Đọc trên forum của Microchip thấy có người dùng mpusbapi.dll này được 0.5Mbits/s (~62.6 KBytes/s). Làm thế nào để nâng cao tốc độ nhỉ? Các bạn đã làm thực tế ở đây đạt được tốc độ là bao nhiêu? Theo bạn thì để có tốc độ cao thì nên làm theo cách nào? + Mở nhiều endpoint ? (cái này mình còn mơ hồ về cách truyền nhận khi có nhiều endpoint) + Dùng class khác ? (CDC, Custom?) .... |
![]() |
![]() |
![]() |
#8 | |
Đệ tử 3 túi
Tham gia ngày: Jun 2005
Bài gửi: 56
: |
Trích:
Nếu bạn dùng CDC thì tốc độ đạt gần 1Mbits nhưng sẽ gặp vấn đề chương trình giao tiếp với COM trên PC, viết bằng VB thì mình chưa thấy thằng nào hỗ trợ ở tốc độ đó. Delphi thì no problem. Để hiểu thêm về giao tiếp qua EP, bạn có thể dùng WinDriver, nó giao tiếp qua EndPoint đó, khi khởi tạo bạn chọn EPIN, OUT, khi lập trình bạn tương tác với các EP này. |
|
![]() |
![]() |
![]() |
#9 |
Đệ tử 8 túi
|
Trong cái ví dụ sử dụng thư viện dll, người ta xây dựng theo kiểu truyền đi, xong chờ nhận lại kết quả, rồi mới tính tiếp, mỗi lần truyền nhận như vậy delay tới 1s, do đó không thể nhanh được.
Bạn thử hạ thời gian delay xem thế nào, xem thử hạ tới đâu thì vẫn còn hoạt động tốt, xong rồi thông báo kết quả lên đây, để anh em thảo luận thêm. Làm theo vi dụ này, có thể tạm ứng dụng trong điều khiển với dung lượng dữ liệu cần truyền nhận nhỏ. |
![]() |
![]() |
![]() |
#10 | |
Đệ tử 3 túi
Tham gia ngày: Jun 2005
Bài gửi: 56
: |
Trích:
![]() Em thử hạ thời gian xuống, cỡ trên 10ms thì ổn định. Còn nếu <10ms thì lỗi độ dài dữ liệu nhân được < độ dài được chỉ định. |
|
![]() |
![]() |
![]() |
#11 |
Trưởng lão PIC bang
Tham gia ngày: Jun 2006
Bài gửi: 39
: |
Tôi phân tích tiếp xem thế nào nhé
![]() Cái ví dụ của microchip dùng trễ 100ms MPUSBRead(myInPipe,ReceiveData,ExpectedReceiveLeng th,ReceiveLength,100); bây giờ dịch tìm cái nguồn của hàm này, buộc dịch lại dll. trong file nguồn ta thấy: /////////////////////////////////////////////////////////////////////////////// // MPUSBRead : // // handle - Identifies the endpoint pipe to be read. The pipe handle must // have been created with MP_READ access attribute. // // pData - Points to the buffer that receives the data read from the pipe. // // dwLen - Specifies the number of bytes to be read from the pipe. // // pLength - Points to the number of bytes read. MPUSBRead sets this value to // zero before doing any work or error checking. // // dwMilliseconds // - Specifies the time-out interval, in milliseconds. The function // returns if the interval elapses, even if the operation is // incomplete. If dwMilliseconds is zero, the function tests the // data pipe and returns immediately. If dwMilliseconds is INFINITE, // the function's time-out interval never elapses. // // Note that "input" and "output" refer to the parameter designations in calls // to this function, which are the opposite of common sense from the // perspective of an application making the calls. // DWORD MPUSBRead(HANDLE handle, // Input PVOID pData, // Output DWORD dwLen, // Input PDWORD pLength, // Output DWORD dwMilliseconds) // Input { BOOL bResult; DWORD nBytesRead; OVERLAPPED gOverlapped; DWORD dwResult; dwResult = MPUSB_FAIL; // set up overlapped structure fields gOverlapped.Internal = 0; gOverlapped.InternalHigh = 0; gOverlapped.Offset = 0; gOverlapped.OffsetHigh = 0; gOverlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if(pLength != NULL)*pLength = 0; // attempt an asynchronous read operation bResult = ReadFile(handle,pData,dwLen,&nBytesRead,&gOverlapp ed); if(!bResult) { // deal with the error code switch (GetLastError()) { case ERROR_HANDLE_EOF: { // we have reached the end of the file // during the call to ReadFile break; } case ERROR_IO_PENDING: { // asynchronous i/o is still in progress switch(WaitForSingleObject(gOverlapped.hEvent, dwMilliseconds)) ... tôi trích đến đây vì thấy hàm WaitForSingleObject(...). Tham khảo link sau để thấy nó làm gì http://msdn.microsoft.com/library/de...ngleobject.asp như vậy ta có thể thử với biến dwMilliseconds, Các bạn tiếp tục xem thế nào. |
![]() |
![]() |
![]() |
#12 |
Đệ tử 1 túi
|
Dùng cái thư viện dll đó đúng là kiểu hỏi đáp nên tốc độ chậm thật. Còn cái tham số delay là thời gian để hàm timeout nên ko cài thiện tốc độ gì cả.
Mình lọ mọ trên forum của Microchip thấy có topic hay quá. Tác giả Brad Minch đã xây dựng 1 firmware nhỏ gọn mà dễ hiểu. Chỉ duy nhất 1 file .c và 1 file .h thôi. Thành ra đọc rất dễ hiểu. Lại viết theo kiểu xử lý tuần tự từng request nên đọc hiểu được rất nhiều về USB. Các bạn mới bắt đầu như tớ nên đọc cái này trước. Topic: http://forum.microchip.com/tm.aspx?m=89669 Website: http://pe.ece.olin.edu/ece/ Đảm bảo dễ hiểu hơn firmware của Microchip. Mình đã dịch bằng C18, chạy với PIC8F4550 20Mhz rất tốt. |
![]() |
![]() |
![]() |
#13 | |||
Đệ tử 8 túi
|
Trích:
Nhưng mà mấy byte cũng được, quan trọng là dựa vào số byte truyền và thời gian truyền nhận, mình có thể cân đối thời gian delay một cách hợp lí để tăng tốc độ truyền nhận lên. Trích:
![]() Trích:
![]() |
|||
![]() |
![]() |
![]() |
#14 |
Trưởng lão PIC bang
Tham gia ngày: Jun 2006
Bài gửi: 39
: |
sau khi dọc bằng lệnh
// attempt an asynchronous read operation bResult = ReadFile(handle,pData,dwLen,&nBytesRead,&gOverlapp ed); người ta kiểm tra kết quả trả về if(!bResult) { KL1 } else { KL2 } Mục đích của KL1 là nếu đọc chưa được thì đợi, đọc và cập nhật lại bResult. Do đó sủ dụng lệnh WaitForSingleObject(gOverlapped.hEvent, dwMilliseconds) Như vậy tốc độ < 1Khz. Nhưng ngay cả khi minh lấy dwMilliseconds=10, truyền 10Byte vẫn lỗi. Bây giờ ý mình là ko đợi nữa, if(!bResult) { CancelIo(handle); break; } else { KL2 } ResetEvent(gOverlapped.hEvent); CloseHandle(gOverlapped.hEvent); Có ok không nhỉ ? |
![]() |
![]() |
![]() |
#15 | |
Đệ tử 8 túi
|
Trích:
![]() Mình không cần delay, chỉ cần hỏi vòng trị trả về của hàm MPUSBRead. Làm như vậy sẽ tận dụng được tối đa khả năng truyền nhận, và giảm bớt khoảng thời gian delay thừa. Ví dụ, mình cần nhận 10 byte, mình chọn thời gian delay là 10 ms. Giả sử sau khi time out (hết 10 ms), mới đọc được có 9 byte, thì vẫn phải tiếp tục delay thêm 10 ms chỉ để đọc nốt 1 byte còn lại, như vậy thời gian delay thừa sẽ phát sinh. Cái này giống như kiểu, ngư một giấc, thức dậy hỏi, xong chưa? chưa xong hả? ngủ tiếp! thức dậy hỏi ... Mình cứ break, kệ nó, cho nó đọc thoải mái, chỉ cần biết là đã xong hay chưa thôi (dựa vào trị trả về của hàm MPUSBRead) để xử lí tiếp. Như vậy ta có thể xác định chính xác hơn thời điểm kết thúc truyền nhận, và tận dụng được tối đa khả năng truyền nhận. Cái này giống như kiểu, hỏi liên tục, xong chưa? xong chưa? chưa xong hả? làm tiếp đi? xong chưa? ... Nhưng nhiều khi cái thời gian hỏi lòng vòng lại nhiều hơn thời gian delay ấy nhỉ. ![]() |
|
![]() |
![]() |