Phần 1: Tổng quan về PIC và các trình biên dịch C cho PIC
I) Tổng quan về vi điều khiển PIC
II) Phần đánh giá trên forum của CCS
III) Phần đánh giá trên forum của microchip
IV) Quyết định loại trình biên dịch
Phần 2: Giao tiếp USB
Phần 3: Thiết kế mạch giao tiếp USB thuộc lớp HID
I) Mục tiêu
II) Thi công mạch
III) Viết firmware
Phần 4: Viết ứng dụng giao tiếp chuẩn USB trên host
I) Giới thiệu chung về lập trình ứng dụng trên host
II) Các quy trình để nhận biết một thiết bị USB
III) Các hàm Read và Write
Giáo viên HD: Bùi Văn Hiếu
53 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3062 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Thiết kế và thi công mạch hẹn giờ đa năng có thể cấu hình qua cổng USB, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
át hiện và xử lý lỗi:
Nếu một thiết bị không trả về bắt tay, host sẽ thử gửi lại thêm 2 lần nữa. Nếu sau đó
vẫn không nhận được bắt tay như mong đợi, host sẽ chấm dứt việc giao tiếp với thiết bi
cho đến khi lỗi trên được làm rõ. Nếu thiết bị cứ trả về NAK thì host sẽ tiếp tục gửi lại
cho đến khi nào nhận được ACK mới dừng. Truyền ngắt có thể sử dụng data toggle bit để
chắc chắn dữ liệu không thất lạc trong lúc truyền nhận. Tuy nhiên nếu ứng dụng chỉ quan
tâm đến thời gian trễ không quan tâm đến dữ liệu nhận được nó không dùng data toggle
bit.
4.Truyền đồng bộ(isochronous transfers):
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 26
-Truyền đồng bộ như dòng chảy, một kiểu truyền thời gian thực. Kiểu truyền này thích
hợp nhất với các ứng dụng cần truyền dữ liệu với một tốc độ nhất định, hay một thời gian
đã được xác định trước, với mức độ bỏ qua lỗi có thể chấp nhận được. Ở tốc độ full
truyền đồng bộ truyền nhiều dữ liệu trên một frame hơn truyền ngắt. Nhưng bù lại kiểu
truyền này không cung cấp cơ chế truyền lại các gói dữ liệu khi xảy ra lỗi như mất gói dữ
liệu, nhận sai dữ liệu. Các ứng dụng sử dụng truyền đồng bộ như là giải mã âm thanh và
âm nhạc được vận hành ở thời gian thực.
-Thực tế là dữ liệu trong truyền đồng bô không được truyền ở một tốc độ cố định,
Truyền đồng bộ chỉ là phương thức bảo đảm cho việc truyền một khối lượng lớn dữ liệu
được truyền nhanh chóng trong lúc bus không còn nhiều băng thông, ngay cả khi kiểu
truyền này không bắt buộc phải vận chuyển ở thời gian thực. Không giống như kiểu
truyền bulk, khi một lần truyền đồng bộ được bắt đầu, host phải bảo đảm thời gian tích
cực để có thể gửi dữ liệu tại một tốc độ cố định, vì nguyên nhân này nên việc kiểm tra tốc
độ trên đường truyền xảy ra định kỳ trong những khoảng thời gian rất nhỏ.
a)Tính sẵn sàng:
Kiểu truyền này chỉ thực hiện được ở tốc độ cao hoặc tốc độ full. Giống như truyền
bulk kiểu truyền này không bắt buộc tất cả các thiết bị phải hỗ trợ. Một vài lớp thiết bị
chuyên biệt hỗ trợ kiểu truyền này theo mục đích của người sử dụng.
b)Cấu trúc:
-Do kiểu truyền có tên là đồng bộ nên nó có khả năng truyền với một tốc độ cố định,
với một số định nghĩa trước số byte được truyền trên mỗi frame hoặc microframe. Ngoài
truyền đồng bộ ra thì không có kiểu truyền nào có thể truyền số byte được định nghĩa
trước trên mỗi frame(ngoại trừ truyền ngắt có khả năng đảm bảo thời gian trễ ngắn nhất.
-Truyền đồng bộ hoạt động ở tốc độ full bao gồm một giao dịch IN hoặc OUT trên
một hoặc nhiều frame có khoảng cách bằng nhau. Khi hoạt động ở tốc độ cao thì kiểu
truyền có nhiều tính năng hơn, một yêu cầu có ba giao dịch trên một frame, và có thể nhỏ
hơn khi 1 giao dịch truyền trên 32,768 microframe. Truyền đồng bộ vận chuyển dữ liệu
theo 1 hướng nhất định. Tất cả các truyền chỉ có thể là gồm giao dịch IN hoặc là giao
dịch OUT thôi. Nếu người sử dụng có nhu cầu cấu hình kiểu truyền theo 2 hướng thì phải
chia truyền và đường ống thành 2 phần cho mỗi hướng.
-Trước khi cấu hình 1 đường ống, host phải so sánh kích thước buffer(buffer size)
được yêu cầu với vùng buffer tích cực còn lại, băng thông đang được sử dụng trong
đường bus để quyết định khi nào băng thông yêu cầu được sẵn sàng sử dụng. Một lần
truyền đồng bộ ở tốc độ full được phép tối đa 1023 byte trên frame sử dụng 69% băng
thông, nếu lúc này tồn tại một thiết bị thứ hai sử dụng truyền đồng bộ trên cùng một hệ
thống thì host sẽ từ chối cung cấp đường ống cho nó vì băng thông còn lại không đủ cho
phép thực hiện truyền. Nếu hai thiết bị này. Nếu thiết bị này này sử dụng một giao tiếp
thay thế khác với các gói dữ liệu nhỏ hơn hay một microframe chứa nhiều gói dữ liệu nhỏ
hơn thì host có thể cho phép, hoặc driver cố gắng thử lại lần vào các lần sau với hy vọng
bus được phép tích cực. Khi thiết bị đã được cấu hình, các lần truyền được bảo đảm thời
gian cần thiết.
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 27
Hình 6: Giao dịch đồng bộ IN và OUT.
c)Kích thước gói dữ liệu:
khi hoạt động ở tốc độ full kích thước gói tối đa là 1023 byte, ở tốc độ cao có thể lên
đến 1024 byte. Nếu một lượng dữ liệu không vừa một gói,host sẽ chia một lần truyền ra
làm nhiều giao dịch
d)Tốc độ:
-Thực hiện việc truyền ở tốc độ full có thể đạt đến 1.023 MByte/giây, tốc độ nhỏ nhất
là 1Kbyte/giây. Nó dành 31% băng thông bus cho các loại truyền khác. Giao thức có
overhead là 9 byte tren một frame cho 1 lần truyền với một gói dữ liệu, hoặc thấp hơn 1%
cho một lần giao dịch 1023 byte. Băng thông được yêu cầu tối thiểu cho truyền ở tốc độ
full là 1 byte trên frame hoặc một Kbyte/giây.
-Một giao dịch đồng bộ có thể vận chuyển được tới 1024 byte. Một điểm cuối đồng bộ
yêu cầu nhiều hơn 1024 byte trên microframe có thể yêu cầu 2 hoặc 3 giao dịch trên
microframe, cho phép tốc độ tối đa là 24.576 MByte/giây. Một điểm cuối cần đa giao
dịch trên một frame là điểm cuối có băng thông cao. Overhead giao thức có 38 byte trên
một lần truyền với 1 gói dữ liệu.
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 28
-Vì truyền đồng bộ ở tốc cao không được thực hiện một giao dịch trong mỗi frame
hoặc microframe, nó có thể yêu cầu năng thông ít hơn khi trong tốc độ full. Băng thông
thấp nhất là một byte cho 32,673 microframe, làm cho việc truyền 1 byte mất khoảng
4.096 giây. Tuy nhiên, các điểm cuối có thể truyền dữ liệu ít hơn số băng thông được truy
xuất tối đa bằng việc bỏ qua giao dịch tích cực hoặc truyền ít hơn số dữ liệu tối đa trên
một lần truyền.
-Giống như truyền ngắt, truyền đồng bộ có thể sử dụng nhiều hơn 80% của một
microframe. Khi truyền tổ hợp gồm một truyền và một truyền ngắt ở cùng đồng bộ tốc độ
full có thể sử dụng nhiều hơn 90% của một frame. Các bus rảnh tốc độ cao khác có thể
mang một lúc 2 truyền đồng bộ với tốc độ tối đa.
-Cái giá phải trả cho việc đảm bảo sự phân phối thời gian một khối lớn các dữ liệu
bằng viêc thực hiện truyền không có phát hiện lỗi. Do đó kiểu truyền này chỉ có thể sử
dụng được trong các ứng dụng có thể chấp nhận các lỗi nhỏ.
V)Sự điểm danh:
Trước khi ứng dụng có thể liên lạc được với thiết bị, host cấn phải nhận biết về thiết bị
và gán địa chỉ cho thiết bị. Điểm danh là sự trao đổi đầu tiên về thông tin của thiết bị để
hoàn thành việc nhận biết. Tiến trình bao gồm gán một địa chỉ cho thiết bị, đọc cấu trúc
dữ liệu từ thiết bị, cuối cùng là lựa chọn cấu hình từ các option đã được chọn thông qua
dữ liệu đã truy xuất. Thiết bị được cấu hình và sẵn sàng để vận chuyển dữ liệu thông qua
các điểm cuối đã cấu hình.
1.Tiến trình:
-Một trong những nhiệm vụ của hub là phát hiện thiết bị gắn vào hoặc tháo ra khỏi
máy tính. Mỗi hub có 1 đường ống ngắt(interrupt pipe) In dành cho việc báo các sự kiện
về host. Khi hệ thống khởi động host dùng cơ chế poll tới hub gốc(root hub) để nhận biết
các sự hiện diện của một thiết bị nào đó trên hub, các thiết bị đó có thể là một thiết bị
gắm trực tiếp vào host hoặc một thiết bị cắm vào một hub của một thiết bị đã được cắm
vào máy trước đó. Sau khi khởi động, host tiếp tục dùng cơ chế poll theo định kỳ để nhận
biết các sự kiện trên hub bao gồm việc cắm vào hoặc tháo ra khòi hub của một thiết bị .
-Trong việc nhận biết một thiết bị vừa cắm vào, host gửi một loạt các yêu cầu đến hub
nơi có hiện diện thiết bị nhằm mục tiêu cung cấp một đường liên lạc giữa host và thiết bị.
Sau đó host thử điểm danh thiết bị bằng cách gửi các truyền điều khiển chứa các yêu cầu
USB chuẩn đến điểm cuối 0. Nếu điểm danh thành công, thiết bị phải trả lời bằng cách
trả về thông tin đã yêu cầu và thực thi các hành động đã được host yêu cầu.
-Từ góc nhìn của người sử dụng, việc điểm danh là hoàn toàn tự động và gần như
không thể nhận biết được, ngoại trừ việc hệ điều hành thông báo việc phát hiện ra một
thiết bị mới bất chấp sự điểm danh có thành công hay không. Nhiều lúc người sử dụng
phải cung cấp một đĩa chứa file INF và driver cho thiết bị vừa cắm vào.
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 29
-Trong các thiết bị ngoại vi điển hình, code chương trình của thiết bị chứa thông tin
mà host sẽ yêu cầu, một tổ hợp phần cứng và phần dẻo có tác dụng giải mã và đáp ứng lại
các yêu cầu cho việc thông tin liên lạc. Một vài chip chuyên dụng (ASICs) quản lý sự
điểm danh hoàn toàn trong phần cứng và không cần sự hỗ trợ từ phần dẻo. Về phía host,
user không cần phải viết code xử lý quá trình điểm danh, tất cả các công việc trong quá
trình điểm danh được hệ điều hành xử lý hoàn toàn. Trong lúc điểm danh hệ điều hành sẽ
tìm kiếm một file đặc biệt gọi là file INF, loại file này dùng để định nghĩa driver dùng
cho thiết bị.
-Khi quá trình điểm danh hoàn tất, Windows sẽ cập nhật thêm thiết bị mới vào phần
Device Manager đượ thể hiện trong Control Nanel. Trong Windows ta có thể truy xuất
đến phần này thông qua đường dẫn Start menu > Setting > Control Panel > Performance
and Mainternance > System > Hardware > Device manager. Khi ngoại được tháo bỏ kết
nối với hệ thống, Windows tự động xóa tên thiết bị này ra khỏi màn hình hiển thị.
2.Các bước điểm danh:
-Trong quá trình điểm danh 1 thiết bị phải trải qua 4 trong tất cả 6 trạng thái USB đã
được định nghĩa trong của đặc tả:Powered; Default; Address và Configured(2 trạng thái
không phải trải qua trong qua trình điểm danh là Attached và Suspen). Trong mỗi trạng
thái trên ,thiết bị đã được định nghĩa hành vi và khả năng.
-Người viết phần dẻo của thiết bị không nên cho rằng các yêu cầu và sự kiện điểm
danh sẽ thực thi trong một thứ tự đặc biệt. Tuy nhiên người viết nên cho thiết bị sẵn sàng
chuẩn bị và đáp ứng các yêu cầu điều khiển tại mọi thời điểm.
a)Các bước:
1)Người dùng cắm thiết bị vào cổng USB:
Sự kiện này xảy ra tương dương với việc thiết bị đã cắm vào cổng USB trước khi máy
tính khởi động. Cổng USB này có thể được kết nối trực tiếp với hub gốc tại host hoặc
thông qua 1 hub thứ cấp đã được đấu vào hub gốc trước đó. Sau khi kết nối vào hub, hub
gốc lập tức cung cấp nguồn cho cổng, lúc này thiết bị được gán trạng thái Powered.
2)Hub phát hiện ra thiết bị:
Hub giám sát hiệu điện thế trên 2 đường tín hiệu của mỗi cổng. Lúc đó trên hub xuất
hiện điện trở kéo xuống 15KΩ trên từng đường tín hiệu của cổng(D+ và D-), trong khi đó
bên thiết bị hoạt động ở tốc độ full lại có điện trở kéo xuống 1.5KΩ trên đường tín hiệu
D+ ,nếu thiết bị hoạt động ở tốc độ thấp thì điện trở kéo xuống 1.5KΩ nằm trên đường tín
hiệu D-. Nếu là thiết bị tốc độ cao thì sẽ bị gán tốc độ full. Khi thiết bị cắm vào cổng, kéo
lên(pull-up) của thiết bị sẽ đưa đường truyền lên cao, đây chính là nguyên nhân giúp hub
phát hiện ra sự hiện diện của thiết bị mới. Sau khi phát hiện ra thiết bị, hub tiếp tục cung
cấp năng lượng nhưng chưa thể thực hiện vận chuyển trao đổi dữ liệu, bởi vì thiết bị chưa
sẵn sàng cho việc truyền nhận.
3)Host nhận dạng thiết bị mới:
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 30
Mỗi hub sử dụng đừơng ống ngắt(interrupt pipe) của nó để báo cáo sự các sự kiện xảy
ra trên hub. Một bản báo cáo(report) chỉ thể hiện duy nhất các sự kiện vừa mới xảy ra
trên hub hay cổng. Khi host nhận được môt sự kiện, nó liền gửi đến hub 1 yêu cầu
Get_Port_Status để tìm hiểu thêm sự kiện vừa gửi đến. Get_port_Status là một yêu cầu
nằm trong bộ các yêu cầu Hubclass chuẩn mà tất cả các hub phải hiểu được.Hub trà lời
lại bằng một thông tin báo cho host biết lúc nào thì thiết bị cắm vào.
4)hub phát hiện tốc độ của thiết bị hỗ trợ:
Trước khi hub reset thiết bị, hiểu sẽ tìm hiểu loại tốc độ mà thiết bị hỗ trợ bằng cách
thử hiệu điện thế trên hai đừơng tín hiệu. Thông qua việc xác dịnh hiệu điện thế của
đừơng nào cao hơn khi bus trống hub sẽ quyết định tốc độ cho thiết bị. Kế tiếp hub gửi
thông tin đến host trong lần đáp ứng lại yêu cầu Get_Port_Status lần sau. USB 1.x cho
phép hub lựa chọn để phát hiện tốc độ thiết bị sau reset. Ngược lại, USB 2.0 cần phải xác
định tốc độ để thực thi trước khi bị hub reset, làm như vậy nhằm xác định nó có được
kiểm tra khả năng hoạt động ở tốc độ cao trong quá trình reset, như mô tả ở bước kế tiếp.
5)Hub reset thiết bị:
Khi 1 host nhận biết một thiết bị mới, điều khiển host gửi đến hub 1 yêu cầu Set_Port_
Feature đòi hỏi hubs reset cổng. hub đặt các đường dữ liệu đến thiết bị trong trình trạng
reset trong thời gian ít nhất là 10 ms. Reset là một điều kiện đặc biệt khi mà cả D+ cùng
với D- đều ở mức luận lý thấp. Hub chỉ gửi yêu cầu reset chỉ đối với các thiết bị mới cắm
vào. Các hub và thiết bị khác nằm trên bus không bị ảnh hưởng.
6)hub nhận biết khả năng hỗ trợ tốc độ cao của thiết bị:
-Việc phát hiện này thông qua 2 trạng thái tín hiệu đặc biệt là Chirp K và Chirp J.
Trong trạng thái chirp J, chỉ có đường tín hiệu D+ được điều khiển và trạng thái chirp k,
chỉ đường tín hiệu D- được điều khiển.
-Trong quá trình reset, thiết bị tốc độ cao sẽ gửi một chirp k, hub tốc độ cao phát hiện
trạng thái chirp k ngay, lặp tức hồi báo lại bằng một dãy các chirp k và chirp j. Khi thiết
bị tốc độ cao bắt được một dãy các chirp KJKJKJ, nó liền loại bỏ kéo lên(pull-up) dành
cho tốc dộ full và chuyển sang thể hiện các chức năng của thiết bị tốc độ cao. Nếu hub
không hồi đáp lại chirp KJ, device hiểu được rẳng nó phải tiếp tục thông tin, liên lạc ở tốc
độ full. Tất cả các thiết bị tốc độ cao điều đựơc thiết kế để có khả năng đáp ứng yêu cầu ở
tốc độ full.
7)Hub thiết lập một đường tín hiệu giữa thiết bị và bus:
-Host thẩm định lại rằng thiết bị ra khỏi trạng thái reset bằng việc gửi yêu cầu
Get_Port_Status. Thiết bị phản ứng lại bằng việc trả về một gói dữ liệu, trong gói dữ liệu
có chúa một bit thể hiện việc thiết bị có cỏn nằm trong trạng thái reset hay thôi. Nếu cần
thiết , host sẽ lập lại yêu cầu Get_Port_Status cho đến khi thiết bị thoát khỏi trạng thái
reset.
-Sau khi hub tháo bỏ quá trình reset, thiết bị bây giờ đã chuyển sang trạng thái
Default. Các thanh ghi USB trong thiết bị cũng đã được chuyển sang trạng thái reset và
thiết bị sẵn sàng cho việc đáp ứng truyền nhận thông qua đường ống mặc định tại điểm
cuối 0.Thiết bị lúc này có thể giao tiếp với host, với địa chỉ mặc định được gán là 00h.
Cường độ trong thiết bị có thể đưa lên 100mA từ bus.
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 31
8)Host gửi yêu cầu Get_Descriptor để nhận biết kích thước lớn nhất có thể
vận chuyển trên đường ống mặc định:
Host gửi yêu cầu đến điểm cuối 0 của thiết bị với dịa chỉ là 00h. Do host chỉ điểm
danh thiết bị tại một thời điểm, nen củng chỉ có 1 thiết bị đáp ứng định địa chỉ 00h cho
thiết bị, ngay cả khi lúc đp1 trên hub có nhiều thiết bị cùng đấu vào hub cùng một lúc.
Descriptor chứa 8 bit biểu diễn kích thước gói lớn nhất được hỗ trợ tại điểm cuối 0. Một
host window yêu cầu 1 descriptor có 64 byte, nhưng sau khi nhận một gói(dù có đủ 64
byte hay không) host cũng bắt đầu chuyển sang giai đoạn status của truyền. Sau khi
hoanà thành giai đoạn status, host yêu cầu hub reset thiết bị. Nhưng đặc tả không cần
reset lại thiết bị, do thiết bị lúc này đả có đủ quyền để xử lý việc từ chối một truyền điều
khiển từ host bất cứ lúc nào bằng việc đáp ứng gói Setup kế tiếp. Nhưng việc reset là tiền
điều kiện để chắc chắn rằng thiết bị đã vào trạng thái được host hiểu biết khi trạng thái
reset kết thúc.
9)Host gán địa chỉ mới cho thiết bị:
Điều khiển host sẽ gán một địa chỉ duy nhất đến đến thiết bị bằng việc gửi yêu cầu
Set_Address kèm theo địa chỉ mới. Thiết bị đọc yêu cầu, trả về ACK, sau đó lưu địa chỉ
nhận được từ host vào trong bộ nhớ. Thiết bị chuyển sang trạng thái Address. Tất cà các
giao tiếp liên lạc giữa host và thiết bị bắt đầu từ lúc này đều phải thông qua địa chỉ mới.
Địa chỉ mới có giá trị đến khi thiết bị được tháo ra khỏi hệ thống hoặc thiết bị phải reset
do yêu cầu của host hoặc khi toàn bộ máy tính tắt hết nguồn. Trong các lần điểm danh
tiếp theo host có thể được gán địa chỉ khác.
10)host nhận biết về khả năng của thiết bị:
-Host gửi yêu cầu Get_Descriptor đến địa chỉ mới để đọc descriptor thiết bị, một lần
đọc phải đọc được tất cả các descriptor. Descriptor là một cấu trúc dữ liệu bao gồm kích
cỡ gói dữ liệu lớn nhất sử dụng cho điểm cuối 0, số của cấu hình mà thiết bị hỗ trợ, và
các thông tin căn bản khác về thiết bị. Host sẽ sử dụng các thông tin này cho các lần liên
lạc sau.
-Host tiếp tục điều tra thêm về thiết bị qua việc gửi yêu cầu thêm một hoặc nhiều
descriptor cấu hình(configtion descriptor) đã được định nghĩa trong Descriptor thiết
bị(device descriptor). Một thiết bị thường đáp ứng một yêu cầu descriptor cấu hình thông
qua việc gửi descriptor này đựoc theo sau bởi tất cả các descriptor cấp thuộc cấp của nó.
Tuy nhiên trước tiên host yêu cầu đúng 9 byte thể hiện tổng chiều dài của descriptor cấu
hình và các descriptor thuộc cấp.
-Window sau đó yêu cầu descriptor cấu hình lại một lần nữa, lần này là sử dụng truy
xuất tổng chiều dài, lên đến 256 byte. Để thực hiện công việc này thiết bị thực hiện gửi
nhiều descriptor cấu hình, mỗi descriptor cấu hình theo được theo sau bằng một
descriptor giao tiếp(interface descriptor), theo sau mỗi descriptor giao tiếp là một
descriptor điểm cuối (endpoint descriptor). Nếu tổng chiều dài của các descriptror này
vượt quá 256 byte, host sẽ hòan tất việc truy xuất toàn bộ các descriptor ở lần yêu cầu thứ
3. Trong mỗi descriptor, bắt đầu là byte biểu thị chiều dài và kiểu, cho phép host dựa vào
đó phân tách các dữ liệu theo sau trong quá trình giải mã dữ liệu nhận về.
11)Host gán và nạp driver thiết bị
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 32
Sau khi tìm hiểu nhiều về thiết bị thông qua các descriptor của nó, host sẽ tìm driver
thích hợp nhất trong driver thiết bị cho việc quản lý liên lạc với thiết bị. Trong việc lựa
chọn driver,Window sẽ thử so sánh các thông tin được lưu trữ trong các hệ thống file INF
với các Vendor ID và Product ID và Release number được truy xuất từ thiết bị. Nếu
không có cái nào trùng khớp. Window sẽ tìm kiếm sự so trùng với các class, subclass, giá
trị giao thức được lấy từ thiết bị. Sau khi hệ điều hành gán và nạp driver xong, driver
thường yêu cầu thiết bị gửi lại các descriptor hoặc gửi các descriptor đặc tả lớp(class-
specific descriptor)khác. Có một ngoại lệ trong việc thực thi các bước này nếu là thiết bị
tổ hợp. Loại thiết bị này có đa giao tiếp, với mỗi giao tiếp cần phải có một driver. Host có
thể gán các driver này chỉ khi các giao tiếp được phép tích cực, các loại này cần được
thiết bị cấu hình.
12)Driver thiết bị lựa chọn cấu hình:
Sau khi tìm hiểu thiết bị từ các descriptor, driver thiết bị yeu cầu một sự cấu hình bằng
cách gửi một yêu cầu Set_Configuration với một số thứ tự cấu hình mong muốn. Nhiêu
thiết bị chỉ hỗ trợ duy nhât một cấu hình. Nếu thiết bị hỗ trợ đa cấu hình, thiết bị có thể
quyết định loại cấu hình nào sẽ được sử dụng dựa tren bất cứ thông tin nào nó có được về
thiết bị đang sử dụng, hoặc nó có thể hỏi ý kiến của ngừơi dùng nen thực hiện thề nào,
hoặc nó có thể chỉ lực chọn đúng cấu hình đầu tiên. Thiết bị đọc yêu cầu cấu hình để so
trùng. Thiết bị chuyển sang trạng thái Configuration và các giao tiếp thiết bị được phép
tích cực. Host lúc này có thể gán driver cho các giao tiếp trong thiết bị tổ hợp. Như các
loại thiết bị khác, host sử dụng thông tin truy xuất từ thiết bị để so trùng driver.
Sau khi kết thúc bước này thiết bị đã hoàn toàn sẵn sàng sử dụng.
b)Các trạng thái còn lại của USB:
-Hai trạng thái còn lại của thiết bị là Attached có thể xuất hiện bất kỳ lúc nào sau đó.
-Trạng thái Attached: nếu hub không cung cấp năng (theo đường VBUS) dến cổng,
thiết bị sẽ vào trạng thái Attached. Điều này còn có thể xảy ra khi hub phát hiện tình
trạng khác với tình trạng thực tại, hoặc nếu host yêu cầu hub gỡ bỏ cung cấp nguồn cho
cổng. Không còn năng lựong trên VBUS, hoat và thiết bị sẽ không thể liên lạc được, từ
góc nhìn của chúng, tình trạng sẻ xảy ra tương tự nếu thiết bị không còn gắm vào cồng.
-Trạng thái Suspend: trạng thái này có ý nghĩa là thiết bị không còn hoạt động, bao
gồm các dấu Start_of_Frame, trên bus ít nhất là 3 ms. Trong trạng thái suspend, thiết bị
tiêu thụ rất ít năng lượng, điều này tương tự với trạng thái sleep mà một số họ vi điều
khiển hỗ trợ. Cà thiết bị được cấu hình và không cấu hình đểu hỗ trợ trạng thái này.
3.Sự điểm danh trên hub:
Hubs thực ra củng là một dạng thiết bị USB, và host cũng điểm danh hub được kết nối
vào máy chính xác là tương tự như cách nó điểm danh một thiết bị cụ thể. Nếu trên hub
có gắn sẵn các thiết bị, host cũng điểm danh luôn từng cái một sau khi hub này thông báo
sự có mặt của chúng.
4.Tháo bỏ kết nối:
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 33
Tháo bỏ thiết bị:Khi ngừoi dùng tháo bỏ thiết bị ra khỏi bus, hub vô hiệu hóa cổng có
thiết bị. Host biết được việc thực thi tháo dỡ sau khi sử dụng poll đến hub, biết được sư
việc xảy ra, và gửi một yêu cầu Get_port_status để điều tra nguyên nhân. Windows sau
đó gửi bỏ thiết bị ra khỏi hiển thị của device manager và địa chỉ của thiết bị được phép
tích cực cho các lần kết nối mới.
VI)Giao tiếp từ Host:
Một thiết bị ngoại vi USB sẽ là vô dụng nếu PC không biết cách liên lạc với nó. Để thực
hiện liên lạc được với tất cả các loại ngoại vi thì hệ điều hành phải thông qua driver thiết
bị. Vì chỉ có river thiết bị mới thực hiện liên lạc giữa hệ thống các driver USB và các ứng
dụng nhằm mục tiêu truy xuất thiết bị.
1.Driver thiết bị:
Driver thiết bị là một tổ hợp phần mền cho phép ứng dụng có thể truy xuất được một thiết
bị phần cứng. Thiết bị đó có thể là máy in, modem , bàn phím, đầu phát video, đơn vị thu
dữ liêu, hay một thiết bị nào đó mà CPU có thể truy xuất thông qua các đường mạch.
Thiết bị cũng có thể nằm ngay trong máy tính như các ổ đĩa cứng và nó cũng có thể sử
dụng cáp để nối với máy tính(chuột, bàn phím).Một vài lớp driver có thể giao tiếp xử lý
giao tiếp với nhiều loại thiết bị có cùng các chức năng.
2.Che dấu ứng dụng từ các chi tiết:
-Driver che dấu các ứng dụng từ việc phải hiểu các chi tiết về các kết nối vật lý,tín
hiệu ,giao thức cần thiết để có thể giao tiếp với một thiết bị. Các ứng dụng này là các
chương trình mà người dùng đang chạy, như là các chương trình xử lý word và cơ sở dữ
liệu đến các ứng dụng đặc biệt mà thiết bị có thể hỗ trợ. Một driver có khả năng cho phép
code ứng dụng được truy xuất một ngoại vi với điều kiện ứng dụng phải biết tên ngoại vi
hoặc chức năng thiết bị. ứng dụng không cần phải biết địa chỉ vật lý của cổng mà thiết bị
gắn vào, và cũng không phải giám sát tường tận và điều khiển tín hiệu bắt tay mà ngoại
vi cần. Ứng dụng cũng không cần phải biết thiết bị đó giao tiếp theo chuẩn USB hay các
chuẩn khác. Code ứng dụng có thể giống nhau cho tất cả các giao tiếp, với các chi tiết đặc
tả đã được xử lý ở cấp thấp hơn.
-Driver hoàn thành trách nhiệm của nó bằng việc thông dịch trung gian giữa code cấp
ứng dụng và code đặc tả phần cứng. Code cấp ứng dụng sử dụng các hàm được hỗ trợ bởi
hệ điều hành để giao tiếp với các driver thiết bị. Code đặc tả thiết bị xử lý các giao thức
cần thiết để truy xuất các mạch ngoại vi, gồm việc phát hiện các trạng thái của các tính
hiệu status và các tín hiệu điều khiển toggle tại các thời điểm thích hợp. Trong windows
có tích hợp một số hàm API(giao tiếp của các ứng dụng người viết) cho phép các ứng
dụng giao tiếp với các driver thiết bị. Các ứng dụng được viết bằng Visual Basic, Visual
C++, Delphi có thể gọi được các hàm API. Ba hàm mà driver có thể hỗ trợ việc đọc, ghi
cho thiết bị USB là Readfile, Writefile, DeviceIocontrol. Mặc dù API là các hàm đơn
giản cho việc xử lý liên lạc với phần cứng, nhưng nó đòi hỏi phải có đặc tả và các yêu
cầu khắt khe cho các giá trị chúng mang di và trả về. Thường rất ít khi xảy ra lỗi trong
việc gọi hàm API ngay cả khi hệ thống bị lỗi.
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 34
- Một số driver thuộc loại monolithic xử lý mọi thứ từ giao tiếp với ứng dụng để đọc
và ghi đến cổng hoặc các địa chỉ nhớ nối đến phần cứng thiết bị. Các loại driver khác,
gồm driver cho thiết bị USB, sử dụng mô hình driver phân lớp cho mỗi driver trong một
loạt các thể hiện từng bước của việc liên lạc. Lớp đỉnh chứa một driver hàm quản lý liên
lạc giữa các ứng dụng và các driver bus cấp thấp. Lớp dưới cùng chứa các driver bus
quản lý liên lạc giữa các driver hàm và phần cứng. Một hoặc nhiều bộ lọc driver có thể
thêm vào các driver hàm và driver bus. Mặc dù mô hình driver phân lớp rất phức
tạp,nhưng lại đơn giản cho việc viết driver vì các thiết bị có thể chia sẽ code cho các task
giống nhau. Nên có thể nói rằng các driver xử lý liên lạc với hệ thống phần cứng USB
đươc tích hợp vào Windows, vì vậy người viết driver không cần phải cung cấp chúng. Do
đó việc viết driver cho môt thiết bị USB đơn giản hơn nhiều so với việc viết driver truy
xuất cac thiết bị phần cứng khác.
VII)Giao tiếp trên host:
Một thiết bị ngoại vi USB sẽ là vô dụng nếu PC không biết cách liên lạc với nó. Để
thực hiện liên lạc được với tất cả các loại ngoại vi thì hệ điều hành phải thông qua driver
thiết bị. Vì chỉ có river thiết bị mới thực hiện liên lạc giữa hệ thống các driver USB và
các ứng dụng nhằm mục tiêu truy xuất thiết bị.
1.Căn bản về driver thiết bị:
Driver thiết bị là một tổ hợp phần mền cho phép ứng dụng có thể truy xuất được một
thiết bị phần cứng. Thiết bị đó có thể là máy in, modem , bàn phím, đầu phát video, đơn
vị thu dữ liêu, hay một thiết bị nào đó mà CPU có thể truy xuất thông qua các đường
mạch. Thiết bị cũng có thể nằm ngay trong máy tính như các ổ đĩa cứng và nó cũng có
thể sử dụng cáp để nối với máy tính(chuột, bàn phím).Một vài lớp driver có thể giao tiếp
xử lý giao tiếp với nhiều loại thiết bị có cùng các chức năng.
2.Che dấu ứng dụng từ các chi tiết:
-Driver che dấu các ứng dụng từ việc phải hiểu các chi tiết về các kết nối vật lý,tín
hiệu, giao thức cần thiết để có thể giao tiếp với một thiết bị. Các ứng dụng này là các
chương trình mà người dùng đang chạy, như là các chương trình xử lý word và cơ sở dữ
liệu đến các ứng dụng đặc biệt mà thiết bị có thể hỗ trợ.
-Một driver có khả năng cho phép code ứng dụng được truy xuất một ngoại vi với điều
kiện ứng dụng phải biết tên ngoại vi hoặc chức năng thiết bị. ứng dụng không cần phải
biết địa chỉ vật lý của cổng mà thiết bị gắn vào, và cũng không phải giám sát tường tận và
điều khiển tín hiệu bắt tay mà ngoại vi cần. Ứng dụng cũng không cần phải biết thiết bị
đó giao tiếp theo chuẩn USB hay các chuẩn khác. Code ứng dụng có thể giống nhau cho
tất cả các giao tiếp, với các chi tiết đặc tả đã được xử lý ở cấp thấp hơn.
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 35
- Driver hoàn thành trách nhiệm của nó bằng việc thông dịch trung gian giữa code cấp
ứng dụng và code đặc tả phần cứng. Code cấp ứng dụng sử dụng các hàm được hỗ trợ bởi
hệ điều hành để giao tiếp với các driver thiết bị. Code đặc tả thiết bị xử lý các giao thức
cần thiết để truy xuất các mạch ngoại vi, gồm việc phát hiện các trạng thái của các tính
hiệu status và các tín hiệu điều khiển toggle tại các thời điểm thích hợp. Trong windows
có tích hợp một số hàm API(giao tiếp của các ứng dụng người viết) cho phép các ứng
dụng giao tiếp với các driver thiết bị. Các ứng dụng được viết bằng Visual Basic, Visual
C++, Delphi có thể gọi được các hàm API. Ba hàm mà driver có thể hỗ trợ việc đọc, ghi
cho thiết bị USB là Readfile, Writefile, DeviceIocontrol. Mặc dù API là các hàm đơn
giản cho việc xử lý liên lạc với phần cứng, nhưng nó đòi hỏi phải có đặc tả và các yêu
cầu khắt khe cho các giá trị chúng mang di và trả về. Thường rất ít khi xảy ra lỗi trong
việc gọi hàm API ngay cả khi hệ thống bị lỗi.
-Một số driver thuộc loại monolithic xử lý mọi thứ từ giao tiếp với ứng dụng để đọc và
ghi đến cổng hoặc các địa chỉ nhớ nối đến phần cứng thiết bị. Các loại driver khác, gồm
driver cho thiết bị USB, sử dụng mô hình driver phân lớp cho mỗi driver trong một loạt
các thể hiện từng bước của việc liên lạc. Lớp đỉnh chứa một driver hàm quản lý liên lạc
giữa các ứng dụng và các driver bus cấp thấp. Lớp dưới cùng chứa các driver bus quản lý
liên lạc giữa các driver hàm và phần cứng. Một hoặc nhiều bộ lọc driver có thể thêm vào
các driver hàm và driver bus. Mặc dù mô hình driver phân lớp rất phức tạp,nhưng lại đơn
giản cho việc viết driver vì các thiết bị có thể chia sẽ code cho các task giống nhau. Nên
có thể nói rằng các driver xử lý liên lạc với hệ thống phần cứng USB đươc tích hợp vào
Windows, vì vậy người viết driver không cần phải cung cấp chúng. Do đó việc viết driver
cho môt thiết bị USB đơn giản hơn nhiều so với việc viết driver truy xuất cac thiết bị
phần cứng khác.
VIII)Host lựa chọn driver
Khi windows phát hiện một thiết bị ngoại vi mới, một trong những thứ nó phải quyết
định là loại driver của thiết bị nào mà ứng dụng có thể sử dụng để liên lạc được với thiết
bị và nếu cần thiết, nạp vào driver được lựa chọn. Đây là công việc của Device manager
trong Windows, nó sử dụng chương trình cài dặt tự động dành cho cho thiết bị và lớp
thiết bị và các file INF để tìm ra driver thích hợp.
1.Tiến trình:
-Device manager là một applet(chương trình vi mã) cho phép đáp ứng mọi cài đặt, cấu
hình, gỡ bỏ thiết bị. Device manager còn bổ sung thêm vào thông tin về mỗi loại thiết bị
đến đăng ký vào hệ thống(system registry), hệ thống này là một cơ sở dữ liệu mà
windows lưu trữ thông tin then chốt về phần cứng và phần mền được cài đặt vào hệ
thống.
-Trình tự động cài đặt thiết bị và lớp thiết bị là các DLL. Windows có các trình tự
động cài đặt mặc định cho phép device manager sử dụng để định vị và nạp các driver
thiết bị trong các lớp được hỗ trợ bởi hệ điều hành( như là lớp HID). Device manager và
các trình tự động cài đặt cùng với nhau đều có khả năng đáp ứng cho sử thể hiện các hộp
dialog như là sự cần thiết để nhắc nhở ngừơi sử dụng qua các thông báo.
Phần 2: Giao tiếp USB
SV:Trần Quốc Gia Phú, Trần Hạ Long - 36
-File INF là file văn bản chứa các thông tin nhằm giúp đỡ Windows định dạng một
thiết bị. File báo cho windows biết các driver và các driver được dùng và bất cứ thông tin
lưu trên registry.
2.Tìm kiếm các file INF
-Khi windows điểm danh một thiết bị USB mới, Device manager so sánh dữ liệu trong
tất cả các hệ thống file INF với thông tin trong descriptor truy xuất từ thiết bị trong quá
trình điểm danh. Một máy tính cá nhân điển hình có thể lưu trữ hàng trăm file INF. Để
tránh trường hợp phải đọc tất qua tất cả các file INF mỗi lần một thiết bị mới được phát
hiện. Windows lưu trữ cơ sở dữ liệu thông tin về driver với thông tin được chọn lọc từ
các file INF của nó. File cơ sở dữ liệu này là các file drvdata.bin và drvidx.bin được lưu
trữ trong thư mục windows/inffolder. Ta có thể thấy được kích thước của những file này
trong bằng chương trình text editor. Nhưng không đựơc thay đổi các giá trị.
-Drvidx.bin liệt kê tên mỗi Vendor ID và Product ID trong các file INF, đi kèm theo là
tên các nhà sản xuất, tên nhà cung cấp, và sự mô tả.
-Drvdata.bin so trùng các nhà sản xuất với các file INF chứa các thông tin về sản
phẩm của họ. Sau khi truy xuất xong Vendor ID và PID từ thiết bị, Device manager sử
dụng thông tin trong 2 file này để tìm nhà sản xuất với thông tin về sản phẩm đặc tả.
3.Vai trò của registry:
Registry hệ thống lưu trữ thông tin về tất cả các thiết bị đã install, dù chúng có vừa
được kết nối và điểm danh hay không. Khi một thiết bị được điểm danh, Device Manager
lưu thông tin về thiết bị trong registry. Ta có thể tìm thấy các thông tin thiết bị đã lưu trữ
trong regedit.exe. Vì hệ thống registry là cấu thành rất quan trọng của Windows, do đó
Windows phải tạo ra nhiều bản back_up.
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 37 - SV:Trần Hạ Long
Phần 3: Thiết kế và thi công mạch giao
tiếp USB thuộc lớp HID.
I)Mục tiêu:
-Thực hiện các chức năng của thiết bị giao tiếp theo chuẩn USB:
Mạch có thể nhận dữ liệu từ host gửi xuống.
Gửi dữ liệu lên host.
-Thực hiện các chức năng hiển thị dữ liệu. hiển thị được các dữ liệu nhận được từ host
qua các led 7 đoạn.
-Nhập dữ liệu vào bộ đệm, các dữ liệu này được thao tác trực quan thông các led hiển
thị và được điều khiển bằng các nút nhấn.
II)Thi công mạch:
1.Module kết nối giao tiếp USB và điều khiển:
-Module này thực hiện việc kết nối mạch cho các bộ phận của khối USB trong vi điều
khiển PIC 18f4550. Kết nối ngoại vi sẽ được thực hiện theo dạng kết nối do vi điều
khiển hỗ là sử dụng transceiver nội tích hợp trong vi xử lý. Toàn bộ hệ thống mạch được
thiết kế dùng xung clock do bộ dao động ngoài có tần số 20MHz cung cấp. Các port xuất
nhập dữ liệu là Port D, Port B. Port D cho dùng hết 8 chân phép xuất các dữ liệu ra
module hiển thị, Port này còn có khả năng nhận dữ liệu vào,dư liệu nhận vào do người
dùng thao tác trực tiếp thông qua các nút nhấn. Port B chỉ dùng 5 chân, các chân của port
này chỉ thực hiện việc xuất dư liệu. Công dụng của Port B là điều khiển các led 7 đoạn
theo phương pháp quét led dùng các transitor. Các nút nhấn ngoài công dụng nhâp dữ
liệu còn có thể kích hoạt việc truyền dữ liệu lên host.
-Module kết nối giao tiếp USB và các switch điều khiển:
-1 vi điều khiển PIC 18f 4550.
-1 chip đệm ULN 2803.
-1 thạch anh 20 Mhz.
-2 tụ gốm 22pF.
-1 tụ hóa 47µF.
-1 tụ hóa 470 µF.
-1 Led đơn.
-1 điện trở 4.7 Kohm.
-4 điện trở 10 Kohm.
-1 điện trở 330 Kohm.
-5 switch.
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 38 - SV:Trần Hạ Long
RD2
SW1
RC7
R1
4.7k
C4
470uF
RD5
RD0
R5
10K
D6
GND
GND
RD7
VCC
RB7
R18 330
RB2
D2R15 330
RD0
SW
4
RE2
RD6
RD3
RB6
R4
10K
R14 330
U1
PIC18F445
1619
18
21
22 23
24
25
26
5
29
30
31
32
33
34
35
36
37
38
39
40
1
2
3
4
6
7
8
9
10
11
12
13
14
15
27
28
1720 RC1RD0
Vusb
RD2
RD3 D-/RC4
D+/RC5
RC6
RC7
RA3
RD6
RD7
V
S
S
VD
D
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
-MCLR/Vpp/RE3
RA0/AN0
RA1/AN1
RA2/AN2/Vref -/Vree
RA4
RA5
RE0
RE1
RE2
VD
D
V
S
S
OSC1
OSC2
RC0
RD4
RD5
RC2RD1
VCC
VCC
C3
22pF
RD1
RD1
RA3
RD2
RC7
D0
VCC
RB7
R13 330
D-
RE0
R19 330
RD6
J2
CON4
1
2
3
4
RB1
MCLR
R21
330
VCC
D1
LED
RD4
VCC
RB6
RA2
D5
D-
D+
RB5
RD7
R7
10K
RB0
SW
3
R20 330
C2
22pF
RE1
RD3
RA4
RC6
J1
CON5
1
2
3
4
5
D4
RB5
D1
RA0
RB4
RD4
R16 330
SW
2
D3
20MHz
MCLR
RC6
VCC
RA1
D7
SW
5
U2
ULN2803
10
9
1
2
3
4
5
6
7
8
18
17
16
15
14
13
12
11
COM G
N
D
IN1
IN2
IN3
IN4
IN5
IN6
IN7
IN8
OUT1
OUT2
OUT3
OUT4
OUT5
OUT6
OUT7
OUT8VCC
RA0
R6
10K
C1
474
D+
RA5
GND
RD5
VCC
RB3
R17 330
R2
1M
DTR310K
1 2
3
4
5
6
7
8
9
VCC
Hình 7 :Module kết nối USB và điều khiển trong Orcard capture cis.
2.Module hiển thị:
-Hiển thị các giá trị dữ liệu lưu trong buffer. Các led được điều khiển theo phương
pháp quét. Dữ liệu hiển thị trong module này bao gồm các byte trong buffer mới nhận về
từ host. Module này cũng được dùng trong quá trình nhập dữ liệu. Dữ liệu nhập vào được
thao tác qua các nút nhấn.
-Module hiển thị xuất nhập tín hiệu:
5 led 7 đoạn Anode chung.
5 điện trở 4.7 K ohm.
5 transitor PNP.
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 39 - SV:Trần Hạ Long
D3
D58
U6
Led7
1
2
3
4
5
6
7
8
9
diod
A
C
om
B
C
G
D
E
F
RB4
D4
VCC
Enable1
R9
4.7K
VCC
R8
4.7K
VCC
Enable5
D1
D5
R12
4.7K 8
U5
Led7
1
2
3
4
5
6
7
8
9
diod
A
C
om
B
C
G
D
E
F
D1
D2
D1
D5
D0
RB0
Enable3
D7
D3
D5
D7
8
U4
Led7
1
2
3
4
5
6
7
8
9
diod
A
C
om
B
C
G
D
E
F
D4
Enable4
D0
D6
RB2
Q5
A1015
D0
D7
Enable3
D3
D0
D2
D1
D3
D1
8
U3
Led7
1
2
3
4
5
6
7
8
9
diod
A
C
om
B
C
G
D
E
F
R10
4.7K
Q3
A1015
D0
D48
U7
Led7
1
2
3
4
5
6
7
8
9
diod
A
C
om
B
C
G
D
E
F
VCC
VCC
D2
D2
D6
Q2
A1015
RB3
D6Enable1
D5
R11
4.7K
D7
Enable2
RB1
D3
D4
D7
Enable5
Q4
A1015
D2
D6
D4
Enable2
Enable4
Q1
A1015
D6
Hình 8: Module hiển thị.
III)Viết firmware:
1.Các công việc mà phần cứng phải làm là:
-Phát hiện các gói dữ liệu mới đến.
-Chuyển đổi thông tin nhận vừa được từ định dạng đã mã hóa được sử dụng trong các
đường dữ liệu USB.
-Quyết định xem một giao dịch đã đến đúng địa chỉ của chip không và nếu không
đúng địa chỉ thì lờ giao dịch đó đi.
-Cho các giao dịch với điểm cuối 0, quyết định loại giao dịch(Setup, IN, OUT) và thiết
lập một bit trong thanh ghi USB Mode của điểm cuối để thể hiện loại giao dịch đó.
a)Cho các dữ liệu nhận được, phần cứng cũng phải làm theo sau:
-Lưu trữ các dữ liệu hợp lệ vừa nhận được trong đệm của điểm cuối hoặc kích một bit
trong thanh ghi để thể hiện lỗi trong dữ liệu nhận được.
-Thiết lập số đếm trong thanh ghi Endpoint Counter để so trùng với số byte đã nhận.
-Lưu trạng thái data-toggle của các dữ liệu nhận được.
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 40 - SV:Trần Hạ Long
-Tính và gửi giá trị CRC, so sánh nó với các giá trị CRC đã nhận, và thực hiện hành
động trong việc phát hiện lỗi.
-Gửi bắt tay chính xác đến host.
-Kích một ngắt để firmware có thể chuẩn cho lần giao dịch kế tiếp.
b)Cho các dữ liệu được vận chuyển, phần cứng cũng có thể làm theo sau:
-Chuyển đổi dữ liệu sẽ được vận chuyển từ các byte trong đệm USB sang định dạng
được sử dụng trong đường dữ liệu USB.
-Gửi số của byte đã định nghĩa trong thanh ghi Endpoint Couter trên đường dữ liệu
USB trong đáp ứng đến gói token IN của host.
-Tính và gửi các bit CRC với dữ liệu.
-Trong việc nhận một bắt tay từ host, kích một ngắt.
2.Hiện thực code:
-Việc hiện thực code firmware cho bộ phận USD tích hợp trong vi điều khiển là công
việc rất phức tạp nếu ta làm hoàn toàn mới. Công việc này tiêu tốn rất nhiều thời gian cho
các đặc tả descriptor, xử lý việc truyền và nhận dữ liệu, viết hàm xử lý các thường trình
phục vụ ngắt. Đây là các công việc cơ bản và có phần trùng lắp,tương tự cho nhiều lớp
thiết bi, do đó cần có những phần đạc tả chung, giống nhau. Cũng do nguyên nhân này
,hiện nay hầu hết các nhà sãn xuất vi điều khiển tích hợp ngoại vi theo chuẩn USB và các
nhà chuyên sãn xuất các trình biên dịch code đã hỗ trợ rất nhiều trong việc định nghĩa các
chức năng trên. Vì thế công việc của người phát triển cũng giảm bớt, thời gian phát triển
ngắn. Công việc của người phát triển lúc này chỉ còn định nghĩa thiết bị theo một yêu cầu
nào đó tùy theo kiểu truyền,tốc độ, các giao tiếp, điểm cuối dựa theo các đặc tính chung
của từng lớp thiết bị, người dùng đôi khi cũng có thể định nghĩa lại một số file do nhà sãn
xuất hỗ trợ cho các sản phẩm đặc biệt nào đó.
-Trong đề tài thực tập này chúng tui sử dụng chương trình soạn thảo code PIC C của
nhà sãn xuất CCS, với trình biên dịch C24. PIC C hỗ trợ rất nhiều cho người phát triển vi
điều khiển PIC, trong đó nó hỗ trợ rất mạnh giao tiếp USB cho các dòng PIC 18f. Các file
pic18_usb.h, usb.c định nghĩa sẵn các hàm chức năng cơ bản của USB như là truyền nhận
dữ liệu . File usb.h định nghĩa các descriptor, các định nghĩa điểm cuối. Người phát triển
có thể định nghĩa thêm các giao tiếp và các descriptor tùy theo yêu cầu. Phần mạch này
được định nghĩa theo lớp HID. Điểm cuối của giao tiếp chỉ có một là điểm cuối 0, kiểu
truyền được sử dụng để truyền dữ liệu là truyền ngắt. Kích thước của vùng đệm nhận và
đệm truyền là 8 byte.
3.Đoạn code hiện thực:
#define __USB_PIC_PERIF__ 1
#DEFINE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 8
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 41 - SV:Trần Hạ Long
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_RX_SIZE 8
#include
#fuses
HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,V
REGEN
#use delay(clock=20000000)
#include
#include
#include
#define in1 PIN_A0
#define in2 PIN_B5
#define in3 PIN_C6
#define in4 PIN_C7
#DEFINE BUTTON PIN_A0
#define LED_ON output_high
#define LED_OFF output_low
//biến của led
static int8 l1;
static int8 l2;
static int8 l3;
static int8 l4;
static int8 l5;
static int8 i;
static int8 count;
//biến cờ
static int1 flag;
static int1 flag1;
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 42 - SV:Trần Hạ Long
static int1 flag2;
static int8 t1;
static int8 t2;
static int8 t3;
static int8 t4;
//du lieu luu lai
static int8 byte1;
static int8 byte2;
static int8 in_data[2];
const int8 dig[16]={0x7e, 0x42, 0x37, 0x67, 0x4b, 0x6d,
0x7d, 0x46, 0x7f, 0x6f, 0x5f,0x79,0x3c,0x73,0x3d,0x1d};
void by2di(int8 a,int &b,int8 &c)//doi tu byte sang so 4
//bit de xuat ra led
{
b=a;
b&=0x0f;
for(i=0;i<4;i++)
{
shift_right(&a,1,0);
}
c=a;
}
void xuat_led(int a,int b,int c,int d,int e)
{
output_b(0xff);
delay_ms(2);
output_b(0xfe);
output_d(dig[a]);
delay_ms(3);
output_b(0xff);
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 43 - SV:Trần Hạ Long
delay_ms(2);
output_b(0xfd);
output_d(dig[b]);
delay_ms(3);
output_b(0xff);
delay_ms(2);
output_b(0xfb);
output_d(dig[c]);
delay_ms(3);
output_b(0xff);
delay_ms(2);
output_b(0xf7);
output_d(dig[d]);
elay_ms(3);
output_b(0xff);
delay_ms(2);
output_b(0xef);
output_d(dig[e]);
delay_ms(3);
output_b(0xff);
delay_ms(2);
}
void nhap(int8 &a,int &b,int8 &c)
//(int &byte,int &le1,int &le2)nhap so vao dem
{
by2di(a,b,c); //doi ra so de xuat led
t1=input_a();
t2=input_b();
t1|=0xfe;
t2|=0xdf;
if(t1==0xfe)
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 44 - SV:Trần Hạ Long
{
a=a+1;
by2di(a,b,c);
t1=0xff;
}
if(t2==0xdf)
{
a=a+16;
by2di(a,b,c);
t2=0xff;
}
}
void nhapso()
{
t3=input_c();
t4=input_c();
t3|=0xbf;
t4|=0x7f;
if(t3==0xbf)
flag1=!flag1;
if(t4==0x7f)
flag2=1;
if(flag1)
nhap(byte2,l3,l4);
else
nhap(byte1,l1,l2);
}
#int_timer0
void timer0interrupt()
{
xuat_led(l1,l2,l3,l4,l5);
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 45 - SV:Trần Hạ Long
t1=input_a();
t1|=0xfe;
if(t1==0xfe)
flag=1;
if(flag)
{
if(count>7)
{
nhapso();
count=0;
}
count++;
}
}
void main()
{
int8 out_data[20];
int8 send_timer=0;
int8 i;
flag1=0;
flag2=0;
flag=0;
count=0;
l5=0x02;
l4=4;
l3=3;
l2=2;
l1=1;
t1=0xff;
t2=0xff;
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 46 - SV:Trần Hạ Long
byte1=0x00;
byte2=0x00;
SET_TRIS_A(0x01);
SET_TRIS_B(0x40);
SET_TRIS_C(0xc0);
SET_TRIS_D(0x00);
xuat_led(1,2,3,4,5);
enable_interrupts(GLOBAL);
set_timer0(0);
setup_timer_0(RTCC_INTERNAL);
enable_interrupts(int_timer0);
usb_init_cs();
while (TRUE)
{
usb_task();
if (usb_enumerated())
{
if (flag2)
{
flag=0;
out_data[0]=byte1;
out_data[1]=byte2;
usb_put_packet(1, out_data, 2,
USB_DTS_TOGGLE);
flag2=0;
}
if (usb_kbhit(1))
{
usb_get_packet(1,in_data, 2);
by2di(in_data[0],l1,l2);
by2di(in_data[1],l3,l4);
Phần 3: Thiết kế và thi công mạch giao tiếp USB lớp HID
SV:Trần Quốc Gia Phú - 47 - SV:Trần Hạ Long
}
}
}
Phần 4: Viết ứng dụng giao tiếp chuẩn USB trên host
SV:Trần Quốc Gia Phú - 48 - SV:Trần Hạ Long
Phần 4: Viết ứng dụng giao tiếp chuẩn
USB trên host
I)Giới thiệu chung về lập trình ứng dụng trên host :
Ta có thể tóm tắt qua sơ đồ sau:
Hình 9: sơ đồ giao tiếp từ chương trình ứng dên driver.
II)Các quy trình để nhận biết một thiết bị usb :
Lấy GUID cho lớp HID : trước khi một ứng dụng truyền nhận dữ liệu với một HID thì
trước tiên ứng dụng phải lấy được GUID (Global unique Identifier tạm dịch là ID toàn
cục ) . Ta có thể lấy được GUID nhờ vào một hàm API là HidD_GetHidGuid .
Khai báo của hàm là :
Void HidD_GetHidGuid (OUT LPGUID HidGuid)
Mã khi sử dụng là :
HidD_GetHidGuid(&HidGuid)
Phần 4: Viết ứng dụng giao tiếp chuẩn USB trên host
SV:Trần Quốc Gia Phú - 49 - SV:Trần Hạ Long
Lấy chuỗi cấu trúc và thông tin của các HID : GUID cho phép ứng dụng lấy các thông
tin về các HID của hệ thống thông qua các hàm Windows Device Manager Functions .
Hàm SetupDiGetClassDevs trả về địa chỉ của chuỗi cấu trúc chứa các thông tin về các
HID
Khai báo của hàm là :
HDEVINFO SetupDiGetClassDevs (
IN LPGUID ClassGUID ,
OPTIONAL IN PCTSTR Enumerator ,
OPTIONAL IN HWND hwndParent ,
OPTIONAL IN DWORD flags)
Mã khi sử dụng là :
hDecInfo = SetupDiGetClassDevs (&HidGuid , NULL ,
NULL,DIGCF_PRESENT | DIGCF_INTERFACEDEVICE )
Phân biệt các giao thức HID khác nhau : sau khi đã có được địa chỉ về chuỗi chứa các
thông tin về HID, ta cần phải xác định HID nào cần tìm. Hàm
SetupDiEnumDeviceInterfaces sẽ thực hiện điều đó. Khi sử dụng hàm này ta cần phải
đưa nó vào một vòng lặp , mỗi vòng lặp nó sẽ chỉ ra một giao thức nhất định, các vòng
lặp sẽ được phân biệt với nhau bởi chỉ số index. Vòng lặp sẽ kết thúc khi hàm trả về giá
trị 0 chỉ ra rằng không còn giao thứ nào nữa .
Khai báo của hàm là :
Boolean SetupDiEnumDeviceInterfaces (
IN HDEVINFO DeviceInfoSet ,
IN PSP_ DEVIINFO_DATA DeviceInfoData ,
OPTIONAL LPGUID InterfaceClassGUID ,
IN WORD index ,
UT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData )
Mã khi sử dụng là :
devInfoData.cbsize = sizeof (devInfoData) ;
Result = SetupDiEnumDeviceInterfaces (hDevInfo , 0 , &HidGuid , index
,&devInfoData)
Lấy địa chỉ của thiết bị : ở hàm trước ,ta chỉ mới xác định được giao thức nhưng ta vẫn
chưa xác định được thiết bị cần tìm. Muốn xác định được thiết bị, ta cần nhiều thông tin
hơn và hàm SetupDiGetDeviceInterfaceDetail sẽ thực hiện điều đó .
Khai báo của hàm là :
Phần 4: Viết ứng dụng giao tiếp chuẩn USB trên host
SV:Trần Quốc Gia Phú - 50 - SV:Trần Hạ Long
BOOLEAN SetupDiGetDeviceInterfaceDetail(
IN HDEVINFO DevicelnfoSet,
IN PSP_DEVICE_INTERFACE_DATA
DeviceInterfaceData,
OUT PSP_DEVICE_INTERFACE_DETAIL__DATA
DevicelnterfaceDetailDataSize,
OUT PDWORD RequiredSize,
OPTIONAL OUT PSP_DEVINFO_DATA )
Mã khi sử dụng là :
Result = SetupDiGetDeviceInterfaceDetail (
hDevInfo ,kDevInfoData ,NULL, 0,&length,NULL )
Lấy handle của thiết bị : việc còn lại là lấy handle của thiết bị để thiết lập kết nối và
truyền nhận dữ liệu . Ta sẽ dùng hàm CreatFile để thiết lập kết nối , một khi công việc kết
nối thành công thì hàm sẽ trả về handle ,và các hàm khác sẽ dùnng trong việc truyền nhận
dữ liệu .
Khai báo của hàm là :
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );
Mã khi sử dụng là :
DeviceHandle=CreateFile(detailData->DevicePath,GENERIC_READ |
GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,(LPSECURITY
_ATTRIBUTES)NULL,OPEN_EXISTING, 0, NULL);
Đọc ID của nhà sản xuất và thiết bị : khi đã nhận được thiết bị ta chưa thể xác định
được đó là thiết bị ta mong muốn và một cách để kiểm tra điều đó là xác nhận ID của nhà
sản xuất và thiết bị . Hàm HidD_GetAtributes sẽ làm việc đó
Khai báo của hàm là :
Boolean = HidD_GetAttributes(IN HANDLE HidDeviceObject,OUT
PHIDD_ATTRIBUTES Attributes );
Mã khi sử dụng là :
Phần 4: Viết ứng dụng giao tiếp chuẩn USB trên host
SV:Trần Quốc Gia Phú - 51 - SV:Trần Hạ Long
Result = HidD_GetAttributes (DeviceHandle,&Attributes);
III)Các hàm Read và Write :
khi đã nhận biết được dữ liệu thì ta bắt đầu việc truyền nhận dữ liệu thông qua các
hàm Read và Write .
4.Hàm Write :
Khai báo của hàm là :
BOOL WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD
nNumberOfBytesToWrite,LPDWORDlpNumberOfBytesWritten,LPOVERLAPPE
D lpOverlapped );
Mã khi sử dụng hàm là :
Result = WriteFile(DeviceHandle,OutputReport,Capabilities.
OutputReportByteLength,&BytesWritten,NULL);
5.Hàm Read :
Khai báo của hàm là :
BOOL ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD
nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED
lpOverlapped)
Mã khi sử dụng hàm là :
Result = ReadFile(ReadHandle,InputReport,Capabilities.
InputReportByteLength,&BytesRead,NULL);
Phần 4: Viết ứng dụng giao tiếp chuẩn USB trên host
SV:Trần Quốc Gia Phú - 52 - SV:Trần Hạ Long
Tổng kêt
1.Các mặt đạt đuợc trong gia đoạn thực tập:
-Hoàn thành việc tìm hiểu tổng quan về PIC.
-Tìm hiểu khái qúat về cơ chế hoạt động của giao tiếp USB.
-Thi công mạch demo giao tiếp với máy tính qua cổng USB.
-Viết được chương trình ứng dụng giao tiếp được với thiết bị qua cổng USB bằng
ngôn ngữ VC++.
2.Các mặt chưa đạt đựoc trong giai đoạn thực tập:
-Mạch thi công chỉ thể hiện rất hạn chế các đặc tính của chuẩn USB so với yêu cầu
của toàn bộ đề tài.các hạn chế bao gồm số lượng byte tối đa được truyền nhận còn rất ít,
tốc độ truyền còn thấp so với yeu cầu truyền nhận của một thiết bị hẹn giờ đặt ra.
-Chương trình ứng dụng giao tiếp tiếp với thiết bị trên máy tính cũng có chung một
hạn chế là số byte truyền tối đa còn ít.
-Giai đoạn thực tập chưa thiết kế và thi công được mạch hẹn giờ đa năng.
Các file đính kèm theo tài liệu này:
- Thiết kế và thi công mạch hẹn giờ đa năng có thể cấu hình qua cổng USB.pdf