Đề 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

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

pdf53 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2939 | Lượt tải: 1download
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:

  • pdfThiế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