You are on page 1of 16

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM

https://sites.google.com/site/lhpscienceclub

LHPSC

Giao tip USB qua HID


Phn 1: PIC18F14K50 + C18 + C#
Bi Quang Minh CLB Khoa hc - THPT Chuyn L Hng Phong TPHCM - 2012

Gii thiu
USB HID (USB human interface device) l mt phn ca c t USB cho thit b ngoi vi my v tnh; n c t mt lp thit b (mt lp ca phn cng my tnh) cho cc thit b giao din ngi dng (HID) nh l chut, bn phm, tay cm iu khin v cc thit b hin th k t. (Wikipedia) Ti liu ny s hng dn c bn v cch to ra mt thit b USB-HID, kt ni chng vi my vi tnh v thc hin cc tc v truyn v nhn. Tc gi khng m bo v khng chu bt c trch nhim no i vi s h hng phn cng thit b ngoi vi, phn cng my vi tnh, v phn mm trn my ca bn. Nu khng chp nhn nhng iu ny, khuyn bn ng nn c tip.

u im v Khuyt im
u im
USB-HID c ci sn driver trn my, khi cm thit b vo, thit b ca bn s c t ng ci driver nu thit b s dng lp HID. Cho php truyn v nhn d liu t phin bn USB 1.1 (thng thng hin nay l 2.0).

Khuyt im
Mi lp HID ch cho truyn v nhn d liu trn hai Endpoint (mi chiu l mt Endpoint). Tc chm: mi Pipe ch c cho php kiu Interrupt, vi tc truyn LowSpeed l 800B/s, FullSpeed l 64kB/s nn tc chm.

Yu cu
Windows XP tr ln Trnh bin dch C18, c th download bn LITE min ph ti: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDo cName=en010014 Giao din MPLAB X, c th download min ph ti: http://www.microchip.com/pagehandler/en-us/family/mplabx Gi th vin Microchip Application Library c th download min ph ti: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDo cName=en547784 Phn mm Microsoft Visual Studio 2005 tr ln vi .NET 2.0 tr ln.

Giao tip USB qua WinUSB

Trang 1

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Thit b ngoi vi
Phn cng
C rt nhiu loi vi x l c th tch hp sn giao tip USB. Trong phn 1 ny, mnh s s dng PIC18F14K50. Vi trnh bin dch C18 cng giao din MPLAB X lp trnh firmware. Bn cng cn mt header ICSP nu bn s dng IC dn (khng c trong s di y, bn tham kho thm ICSP trong cc ti liu khc).

U1: PIC18F14K50 C1: T ceramic 470nF C2, C3: T ceramic t 15 n 33 pF X1: thch anh 12MHz (bt buc phi l 12MHz) RED, GREEN: LED v xanh R1: tr 10k J1: cng kt ni USB

Datasheet ca PIC18F14K50: http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en533924 Thch anh bt buc phi chn l 12MHz, cu hnh HS v PLLEN, c th xung ng h 48MHz s dng cho USB Full Speed. i vi cc loi PIC v MCU khc, nn c datasheet c th chn thch anh cho chnh xc. Nhn hnh sau hiu r hn (trch t datasheet ca PIC18F14K50):

Giao tip USB qua WinUSB

Trang 2

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Xung thch anh vo (12MHz)

Xung ng h s dng cho USB

PLL s nhn 4 ln tn s thch anh (12 * 4 = 48 MHz)

Firmware
Trong gi th vin Microchip Application Library, bn c th thy c rt nhiu mu ng dng vit cho trnh dch CXX ca Microchip, trong c USB HID. Mnh chnh sa li mt cht t mt mu, v cc bn c th download xung thc hin theo ti liu ny, ti y: http://www.mediafire.com/download.php?d78ck2s2ki1sv1j Trong file nn, s c bn file m ngun (main.c, usb_descriptions.c, usb_config.h, HardwareProfile.h). s dng cc file ny, cc bn lm nh sau (trn MPLAB X IDE): To mt project mi bng cch chn Menu File / New Project

Giao tip USB qua WinUSB

Trang 3

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Chn Standalone Projects trong khung Projects. Nhn Next >.

Chn Advanced 8-bit MCUs (PIC 18) trong hp Family, PIC18F14K50 trong hp Device. Nhn Next >.

Giao tip USB qua WinUSB

Trang 4

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Nhn Next > mc th 3 v th 4.

Chn trnh dch C18 trong mc th 5. Nhn Next >.

Giao tip USB qua WinUSB

Trang 5

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Nhp tn Project ti Project Name (v d l HID-1), chn th mc lu, Check Set as main project. Sau nhn Finish.

Gii nn bn file va ti vo trong th mc project.

Trong th Project ca MPLAB X, chn vo project ca bn. Nu khng c th , nhn Ctrl + 1 m th ra.

Giao tip USB qua WinUSB

Trang 6

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Nhn chut phi vo project ca bn, chn Add Existing Item

Chn bn file va gii nn trong th mc ca bn, chn nhiu file bng cch gi nt Ctrl. Chn xong nhn Select.

Nhn chut phi vo project ca bn ln na, chn Properties.

Chn mcc18 trong cy thuc tnh. Nhn nt trong mc Include directories.

Giao tip USB qua WinUSB

Trang 7

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Nhp vo 3 ng dn sau (nhn nt Browse chn 2 ng dn u, double click cui thm du . th ba). Hai ng dn u ph thuc vo v tr ci t gi Microchip Application Library ca bn. Du . tc l th mc project hin ti ca bn. Nhn OK 2 ln xc nhn.

V by gi, bn c th chnh sa firmware ny theo bn. Mnh s gii thiu mt vi ch cc bn c th chnh sa c. Trong file usb_config.h:

Giao tip USB qua WinUSB

Trang 8

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Cc dng cui (nh ngha v HID), cc bn c th thay i: HID_IN_SIZE HID_OUT_SIZE VENDOR_ID PRODUCT_ID 2 3 0x04D8 0x0102

#define #define #define #define

vi HID_IN_SIZE l kch c ca mt gi d liu vo my tnh ca bn (ti a l 64), HID_OUT_SIZE l kch c ca mt gi d liu t my tnh ca bn (ti a 64). Vendor_ID v Product_ID l 2 m s cn thit trong vic nhn din thit b, bn thay i n ty thch, nhng ti khuyn nn dng Vendor_ID l 0x0408 v l VendorID ca Microchip. Bn nn ghi nh tt c nhng thng s ny v cn s dng v sau. Trong file usb_descriptions.c: //Manufacturer string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[25];}sd001={ sizeof(sd001),USB_DESCRIPTOR_STRING, {'M','i','c','r','o','c','h','i','p',' ', 'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.' }}; //Product string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[22];}sd002={ sizeof(sd002),USB_DESCRIPTOR_STRING, {'S','i','m','p','l','e',' ','H','I','D',' ', 'D','e','v','i','c','e',' ','D','e','m','o' }}; sd001 l chui ch tn nh sn xut thit b, sd002 l chui cha tn thit b khi ci t driver (vi HID l khi cm ln u). Cc bn c th thay i chng theo ca bn, theo mu trn, vi iu kin bn phi thay i ng s k t trong string[] (t m) c trong chui. V d chui Microchip Technology Inc. c 25 k t nn trong phi khai bo l string[25]. Trong file main.c: Cc config, bn lun lun t l FOSC = HS v PLLEN = ON (High Speed Osc v PLL Enable). Cn cc config cn li, bn c th thay i ty vo ng dng. = HS = ON

#pragma config FOSC #pragma config PLLEN

Cc hm ngt, bn c th thm hm x l ngt ty theo ng dng ca bn, nhng khng c thay i ba dng v USB_INTERRUPT (t m).

#pragma interrupt high_isr void high_isr() { #if defined(USB_INTERRUPT) USBDeviceTasks();

Giao tip USB qua WinUSB

Trang 9

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

#endif } #pragma interruptlow low_isr void low_isr() { } Hm InitializeSystem() dng khi to ban u, bn c th thay i ty thch, nhng lun lun phi gi hm USBDeviceInit() khi to thit b USB.

static void InitializeSystem(void) { ADCON1 |= 0x0F; TRISC = 0; LATC = 0; USBDeviceInit(); } Trong hm main(), bn khng chnh sa dng v USB_INTERRUPT. Cn li, cc bn c th ty thch chnh sa theo mnh (nh l phi gi hm InitializeSystem() lc u).

#if defined(USB_INTERRUPT) USBDeviceAttach(); #endif y mnh s gii thiu mt s cu lnh truyn d liu qua USB. Cc bn c th thy trong hm main nhng cu lnh sau: if(!((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1))) Nu USB trng thi Configured v khng b treo th mi c th truyn d liu. Cc bn nn hm ny trc mi ln lm vic vi USB. if(!HIDRxHandleBusy(USBOutHandle)) Nu c d liu Endpoint OUT (thit b nhn c d liu t), cu lnh ny s tr v true. Trc khi truyn d liu, bn phi gi hm ny: if(!HIDTxHandleBusy(USBInHandle)) Nu Endpoint IN trng th mi c th tryn d liu. Sau truyn d liu bng lnh: USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&inbuffer[0], HID_IN_SIZE); vi inbuffer l mng d liu cn truyn. Sau khi nhn d liu, mun c th nhn c gi tip theo, chng ta phi xa buffer ca USB bng: USBOutHandle = HIDRxPacket(HID_EP, (BYTE*)&outbuffer, HID_OUT_SIZE);

Giao tip USB qua WinUSB

Trang 10

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Trong v d ny, PIC s thc hin cc thao tc sau: Nu c gi d liu t my tnh, tip tc x l Nu byte u l 0, tc lnh c d liu, PIC s c trng thi cc LED v truyn li cho my tnh. Nu byte u l 1, tc lnh ghi d liu, PIC s truyn cc byte d liu tip theo vo trng thi cc LED.

Bin dch, np chng trnh vo PIC, cm vo cng USB ca my tnh. My tnh s t nhn dng v t ci driver. Nu thit b khng nhn dng c, firmware ca bn b sai, bn hy lm li t u theo cc bc mnh hng dn. Chng ta xong phn c bn v thit b ngoi vi, by gi chng ta c th thc hin phn mm.

Phn mm
Do HID c sn driver trn my v t ci t, chng ta s khng cn quan tm n driver. Trong ti liu ny, chng ta s dng C# lp trnh giao din iu khin.

Th vin HIDLib
Trong th vin Microchip Application Library cng c nhiu v d v chng trnh trn my vi tnh. V mnh cng thay i mt v d, bin dch n thnh mt th vin lin kt ng (.dll) nhm gip cc bn c th thc hin ti liu ny mt cch n gin hn, thun tin hn thay v phi c li cc m ca Microchip (ng nhin nu bn mun th bn c tham kho). Cc bn c th download file lin kt ng v m ngun th vin ca mnh y: Th vin lin kt ng HIDLib.dll: http://www.mediafire.com/download.php?4zob9clz76plvvo M ngun C# HIDDevice.cs: http://www.mediafire.com/download.php?ygopp4orbn8b5l2 Cc hm v bin public ca HIDDevice (namespace HIDLib) bao gm: Bin int vid: cha Vendor ID ca bn. Bin int pid: cha Product ID ca bn. Bin int in_size: kch c ca gi d liu vo my tnh (t PIC). Bin int out_size: kch c gi d liu t my tnh (vo PIC). Bin bool AttachedState: trng thi kt ni ca thit b (true l kt ni) Hm bool Initialize(): khi to ban u, c gi sau khi gn 4 bin u tin. Kt qu tr v l trng thi kt ni ca thit b (AttachedState). Hm bool DeviceChange(ref Message m): khi nhn c mt thng bo t Form, gi hm ny. Kt qu tr v l trng thi kt ni ca thit b (AttachedState). Hm byte[] Receive(): nhn d liu t thit b (PIC), nu thnh cng th tr v mng d liu, nu tht bi hay cha kt ni tr v null. Hm bool Transmit(byte[] data): truyn mng data ti thit b (PIC), nu thnh cng tr v true, nu tht bi hay cha kt ni tr v false.

Giao tip USB qua WinUSB

Trang 11

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

S dng HIDLib
S dng HIDLib cng kh n gin, sau y mnh s ch bn cch s dng gi th vin ny ca mnh (minh ha trn Microsoft Visual Studio 2012 bn th nghim). Cc bn download gi th vin HIDLib.dll v, sau ti mt project mi nh sau: Vo Menu File, chn New / Project

Chn Windows Forms Apllication trong Visual C#, nhp tn Project, ri nhn OK.

Trong ca s Solution Explorer, nhn chut phi vo References, chn Add Reference

Giao tip USB qua WinUSB

Trang 12

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Chn Browse m ca s chn File:

Chn file th vin HIDLib.dll m bn download v, nhn Add, sau nhn OK:

Giao tip USB qua WinUSB

Trang 13

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Vy l bn thm th vin HIDLib v c th s dng ngay by gi. By gi, bn hy v mt form nh th ny:

Thay i cc thuc tnh ca cc nt v Check box nh sau: Name send read green red Text Send Read LED Green LED Red

Nt nhn tri Nt nhn phi Checkbox trn Checkbox di

Click i chut vo nt Send, v nt Read, chng ta c hai hm sau:


private void send_Click(object sender, EventArgs e) { } private void read_Click(object sender, EventArgs e) { }

Bt u, chng ta hy thm th vin vo file m ngun ca chng ta. t lnh ny pha trn:
using HIDLib;

Sau khai bo bin ton cc cho thit b USB phn trn ca lp:
HIDDevice dev = new HIDDevice();

Copy on m sau v dn vo 2 hm :
private void send_Click(object sender, EventArgs e) { if (dev.AttachedState) { byte[] data = new byte[3]; data[0] = 1; if (green.Checked) data[1] = 1; else data[1] = 0; if (red.Checked) data[2] = 1; else data[2] = 0; if (!dev.Transmit(data)) MessageBox.Show("Error");

Giao tip USB qua WinUSB

Trang 14

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub
} else MessageBox.Show("Disconnected!"); }

LHPSC

private void read_Click(object sender, EventArgs e) { if (dev.AttachedState) { byte[] request = new byte[3]; request[0] = 0; dev.Transmit(request); byte[] result = dev.Receive(); if (result != null) { if (result[0] == 1) green.Checked = true; else green.Checked = false; if (result[1] == 1) red.Checked = true; else red.Checked = false; } else MessageBox.Show("Error"); } else MessageBox.Show("Disconnected!"); }

y l cc hm nhn v gi d liu n USB, bn thy n n gin phi khng. u tin l kim tra tnh kt ni bng lnh if (dev.AttachedState). Sau bn gi d liu bng hm dev.Transmit() v nhn bng hm dev.Receive(). Cng vic ca my tnh c cp phn trn, khi mnh n v cc tc v lm vic ca PIC nh th no. Copy on m sau dn vo hm khi to Form1:
public Form1() { InitializeComponent(); dev.vid = 0x04D8; dev.pid = 0x0102; dev.in_size = 2; dev.out_size = 3; dev.Initialize(); }

u tin chng ta gn 4 bin vid, pid, in_size v out_size theo 4 nh ngha VENDOR_ID, PRODUCT_ID, HID_IN_SIZE v HID_OUT_SIZE trong file usb_config.h. Sau gi hm dev.Initialize() khi to thit b. Cui cng, chng ta thm 1 hm nhn thng bo vo lp Form1:
protected override void WndProc(ref Message m) { dev.DeviceChange(ref m); base.WndProc(ref m); }

Hm ny s gip chng ta cp nht xem khi no thit b c rt ra v cm vo. Hy bin dch v tn hng thnh qu ca bn. Check vo cc checkbox, nhn nt Send gi trng thi LED sng, nt Read c trng thi LED.

Giao tip USB qua WinUSB

Trang 15

Cu lc b Khoa hc - THPT Chuyn L Hng Phong TPHCM


https://sites.google.com/site/lhpscienceclub

LHPSC

Li kt
Phn 1 ca ti liu hng dn thc hin Giao tip USB qua HID bng PIC18F14K50, C18 v C# kt thc. Mnh hy vng ti liu ny s gip ch cho nhng bn ang nh nghin cu giao tip USB khi ang s dng trnh dch C18. Cc bn n ch xem tip phn 2 ca ti liu Giao tip USB qua HID. Ti liu thc hin bi Bi Quang Minh Cu lc b Khoa hc THPT Chuyn L Hng Phong TPHCM nm 2012.

Giao tip USB qua WinUSB

Trang 16

You might also like