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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 22-06-2006, 04:38 PM   #1
thancongbao
Đệ 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 ???
thancongbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-10-2006, 10:40 AM   #2
thuyanh
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.
thuyanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-11-2006, 10:09 PM   #3
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
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.
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-11-2006, 10:37 AM   #4
thuyanh
Nhập môn đệ tử
 
Tham gia ngày: Sep 2005
Bài gửi: 8
:
Arrow

Trích:
Nguyên văn bởi bien_van_khat View Post
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.
OK! Tui thì muốn làm cả bộ, nhưng trước mắt tui cần hoàn thiện cái fw trước, rồi mới đến cái driver. Nhưng thú thực là tui chưa rõ lắm mấy cái driver, mặc dù xài nó suốt, nhưng muốn biết cụ tỉ hơn một chút, biết đâu... trong quá trình hì hục với fw...

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.
thuyanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-12-2006, 09:09 AM   #5
RedRose
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 21
:
Send a message via Yahoo to RedRose
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.
RedRose vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-12-2006, 06:34 PM   #6
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
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.
ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-12-2006, 08:43 AM   #7
RedRose
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 21
:
Send a message via Yahoo to RedRose
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?)
....
RedRose vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-12-2006, 12:01 PM   #8
phamthaihoa
Đệ tử 3 túi
 
Tham gia ngày: Jun 2005
Bài gửi: 56
:
Trích:
Nguyên văn bởi RedRose View Post
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?)
....
Khi bạn dùng file mpusbapi.dll thì bạn đang dùng custom driver rồi đó, mình cũng thất ngạc nhiên vì cao thủ nào đã đạt 0.5Mbits với file này, chắc truyền cả 64byte, huy động cả 15 EP. Thực chất cái file Microchip cho này mang tính demo thì hơn thì hàm truyền nhận của nó đều dính hàm delay bên trong, không nhanh được.
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.
phamthaihoa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-12-2006, 01:04 PM   #9
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
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ỏ.
__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-12-2006, 10:10 AM   #10
phamthaihoa
Đệ tử 3 túi
 
Tham gia ngày: Jun 2005
Bài gửi: 56
:
Trích:
Nguyên văn bởi ntc View Post
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ỏ.
Hạ thời gian xuống không có tác dụng, thế mới đểu 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.
phamthaihoa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-12-2006, 12:27 PM   #11
hungbkhn
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.
hungbkhn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-12-2006, 04:57 PM   #12
RedRose
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 21
:
Send a message via Yahoo to RedRose
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.
RedRose vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-12-2006, 10:21 AM   #13
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
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.
Chắc là dưới 10 ms thì không đủ thời gian cho nó truyền. Mà Hòa thử truyền nhận bao nhiêu byte. 64 byte hả.

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:
Hạ thời gian xuống không có tác dụng, thế mới đểu chứ
Có chứ nhỉ. mình nghĩ thế, trong trường hợp truyền nhận liên tục. Chứ mình giảm thời gian delay từ 1s xuống còn cỡ 10 ms, nhưng mà sau mỗi 2s mình mới truyền một lần, thì không có tác dụng là đúng rồi.

Trích:
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.
Em chưa hiểu ý của anh lắm, vì biến dwMilliseconds cũng chính là cái giá trị delay mà tụi em đang thử.
__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-12-2006, 09:59 AM   #14
hungbkhn
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ỉ ?
hungbkhn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-12-2006, 01:13 PM   #15
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Trích:
Có ok không nhỉ ?
Em nghĩ là ok.

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ỉ.

__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


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à 03:25 AM.


Đượ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