Anda di halaman 1dari 43

1

Universal Serial Bus (USB)


I. Apa itu USB ?
Seseorang yang telah menggunakan komputer selama lebih dari 3 atau 5 tahun akan
mengetahui hal-hal apa saja yang hendak dipecahkan oleh USB. Di masa lalu, untuk
menghubungkan berbagai maca alat ke komputer diperlukan berbagai macam cara pula :

Parallel port, dapat digunakan untuk mengubungkan printer, scanner atau Zip
drive. Yang menjadi masalah adalah kebanyakan komputer hanya memiliki sebuah
parallel port sehingga pemakai harus menggunakan alat-alat tersebut secara
bergantian. Belum lagi masalah kecepatan, zip drive yang membutuhkan transfer
data kecepatan tinggi menjadi lambat karena harus menggunakan parallel port.

Serial port, umumnya digunakan untuk modem dan komunikasi langsung antar 2
komputer. Bila dibandingkan dengan parallel port maka serial port jauh lebih
lambat.

Slot ISA atau PCI, digunakan oleh peralatan-peralatan lain yang memerlukan
transfer data secara cepat. Sayangnya, prosedur instalasi card-card yang datang
bersama alat-alat tersebut pada umumnya tidak mudah.

Tujuan utama dari USB adalah untuk mengakhiri segala ketidak nyamanan diatas.
USB memberikan sebuah bus yang terstandarisasi, mudah digunakan dan dapat
menghubungkan sampai 127 peralatan pada komputer. Setial alat yang duhubungkan
memungkinkan untuk mencapai kecepatan transfer data sampai 6 MBps. Kecepatan transfer
tersebut akan mencukupi untuk kebutuhan kebanyakan peralatan eksternal komputer. Dewasa
ini hampir semua peralatan dapat menggunakan USB : printer, scanner, mouse, joystick,
digital camera, webcam, modem, speaker, storage device, network device dan lain-lain.
Peralatan yang menggunakan USB dapat dihubungkan dengan komputer dengan
sangat mudah. Konektor USB dapat dengan mudah ditemukan baik di belakang ataupun di
depan casing komputer. Apabila peralatan tersebut baru untuk pertama kalinya dihubungkan
dengan komputer, maka sistem operasi akan mendeteksinya secara otomatis dan meminta
pemakai untuk memasukkan driver disk untuk peralatan tersebut. Apabila driver telah
terinstalasi maka komputer akan langsung menggunakan alat tersebut. Apabila peralatan itu
untuk kemudian dilepas maka driver akan secara otomatis di-unload.

2
Kebanyakan peralatan USB datang dengan langsung membawa suatu konektor USB
tipe A, bila tidak maka peralatan tersebut pasti memiliki soket yang dapat dihubungkan
dengan konektor tipe B.

Konektor tipe A

Konektor Tipe B

Standar USB menentukan bahwa :

Konektor tipe A harus dihubungkan dengan komputer.

Konektor tipe B harus dihubungkan dengan peralatan luar.

Dengan adanya dua jenis konektor tersebut maka dapat dipastikan tidak akan terjadi
kesalahan dalam menghubungkan.

II. USB Hub


Apabila terdapat banyak sekali peralatan USB yang hendak dihubungkan dengan
komputer, maka ada kemungkinan port USB pada komputer tidak cukup. Untuk mengtasi
masalah ini diperlukan USB hub. Standar USB menyatakan bahwa sebuah port USB pada
komputer dapat dihubungkan sampai dengan 127 peralatan dan USB hub adalah termasuk
dalam standar tersebut.

USB Hub dengan 4 port

3
Suatu hub standar memiliki 4 port. Setiap hub dapat dihubungkan dengan hub lainnya,
ini berarti dengan membuat rantai-hub akan banyak sekali peralatan USB yang dapat
dihubungkan pada komputer. Suatu peralatan USB dan hub USB dapat memiliki power
supply sendiri atau dapat pula menggunakan suplai dari komputer. Suatu self-powered HUB
diperlukan apabila akan terdapat banyak sekali peralatan USB yang tidak memiliki suplai
sendiri akan dihubungkan ke hub tersebut. Namun, peralatan-peralatan besar seperti printer
dan scanner pastilah memiliki power supply sendiri, sehingga apabila terdapat banyak
peralatan seperti itu yang akan dihubungkan maka yang diperlukan adalah suatu unpowered
USB hub.

III. Standar dan Spesifikasi USB


USB memiliki banyak sekali kemampuan (fitur) dan ketentuan yang diantaranya
adalah sebagai berikut :

Komputer selalu dan hanya akan selalu bertindak sebagai host (master).

Sampai 127 peralatan dapat dihubungkan dengan master port baik secara langsung
atau melalui hub.

Kabel USB dapat sampai 5 meter, tetapi dengan merantai hub maka panjang
kabel bisa sampai 30 meter.

Suatu port (USB 1.1) dapat memiliki kecepatan transfer maksimum 12 MBps.

Setiap peralatan USB dapat meminta bandwidth sampai 6 MBps (USB 1.1)

Setiap port USB pada komputer dapat memberikan suplai tegangan 5V dengan
maksimum 500 mA.

Low-power device, seperti mouse dapat menggunakan suplai yang diberikan oleh
port.

High-power device, seperti printer harus memiliki power supply sendiri.

Peralatan USB adalah hot-swappable, ini berarti mereka dapat dihubungkan dan
diputuskan ke port kapan saja.

Saat komputer memasuki mode suspend atau power-saving maka suatu peralatan
USB sebaiknya dapat ikut masuk ke mode tersebut demi menghemat tenaga.

4
Suatu kabel USB memiliki konfigurasi sebagai berikut :

Dua buah kabel untuk suplai (merah untuk +5V dan hitam untuk ground).

Dua buah kabel data diferensial yang saling dipilin (putih untuk D- dan hijau untuk
D+).

Pelindung (shield)

Saat host dinyalakan atau pada saat ada peralatan baru yang dihubungkan, maka host akan
melakukan pemeriksaan (query) terhadap peralatan-peralatan tersebut. Proses ini disebut
enumeration. Host juga akan menanyakan pada peralatan, tipe atau cara transfer data yang
bagaimana yang diinginkan oleh alat tersebut :

Control, mode ini digunakan oleh host untuk melakukan query dan kontrol
terhadap peralatan.

Interrupt, peralatan seperti mouse dan keyboard yang akan mengirim data dalam
jumlah sangat sedikit biasanya menggunakan mode ini.

Bulk, peralatan seperti printer yang menerima data dalam bentuk paket-paket yang
besar akan menggunakan mode ini. Terdapat proses handshaking untuk
memastikan data yang dikirim benar.

Isochronous, peralatan streaming seperti speaker yang akan dan harus menerima
data secara terus menerus hampir real-time akan menggunakan mode ini. Tidak
ada pengecekan kesalahan pada mode ini, apapun datanya dianggap benar.

Secara khusus, bandwidth dari bus dicadangkan seanyak 10% untuk keperluan paketpaket kontrol. Setiap peralatan dapat meminta bandwidth sampai maksimum 90% dari total
kemampuan bus. USB membagi-bagi bandwidth kedalam frame-frame. Setiap frame berisi
1500 byte dan sebuah frame baru selalu ada setial mili detik (USB 1.1). Mode interrupt dan
isochronous selalu mendapatkan kesempatan pertama pada setiap frame sehingga dapat
dipastikan mereka akan selalu mendapatkan bandwidth yang mereka minta. Mode bulk hanya
dapat mengunakan bandwidth yang tersisa.
Standar USB versi 1.1 mendukung dua jenis kecepatan transfer, mode full speed
dengan 12 MBps dan mode low speed dengan 1.5 MBps. Dengan adanya mode lambat ini
yang lebih kebal Electromagnetic Interference (EMI) maka ongkos pembuatan alat dapat
ditekan. Sedangkan USB 2.0 dapat mencapai kecepatan transfer sampai 480 MBps (mode
high speed).

5
USB dikontrol oleh host, dengan demikian hanya diperbolehkan ada satu host
untuk setiap bus (USB 2.0 memungkinkan suatu protocol negosiasi sehingga dua host
dapat saling memilih untuk menjadi host). Suatu USB host bertanggung jawab penuh
untuk mengontrol dan melangsungkan transaksi. USB menggunakan topologi star
sehingga semua peralatan yang dihubungkan harus memiliki suatu pusat (host atau
hub). Dengan topologi ini diperoleh suatu keuntungan, yaitu pemakain arus oleh setiap
peralata dapat dikontrol dan bahkan bisa diputuskan apabila terjadi kondisi kelebihan
arus.
USB 1.1 memiliki dua standar protocol (Host Controller Interface
Specification), yaitu :

Universal Host Controller Interface (UHCI) yang dikembangkan oleh Intel


dan Microsoft dengan tujuan membebankan kompleksitas pada software
sehingga desain hardware dapat disederhanakan.

Open Host Controller Interface (OHCI) yang dikembangkan oleh Compaq,


Microsoft dan National Semiconductor dengan tujuan membebankan
kompleksitas pada hardware sehingga desain software menjadi sederhana.

USB 2.0 memiliki protocol khusus untuk mendukungnya yang disebut dengan
Enhanced Host Controller Interface (EHCI) yang dikembangkan oleh Intel, Compaq,
NET, Lucent dan Microsoft. EHCI dikembangkan dengan prinsip standarisasi
sehingga suatu peralatan USB 1.1 akan dapat tetap dapat berjalan pada host USB 2.0.
Untuk dapat me-load driver yang tepar maka suatu peralatan USB memiliki
suatu kode yang disebut Vendor ID (VID) dan Product ID (PID). VID/PID hanya
dapat dikeluarka oleh USB Implementor's Forum dengan mendaftar dan melakukan
pembayaran. Untuk keperluan non komersial (misalnya pendidikan), USB
Implementor's Forum mengijinkan pemakai untuk menggunakan VID/PID milik
pabrik manufakturing IC untuk digunakan pada IC USB ASIC yang didesain sendiri.
Suatu manufaktur juga mungkin menjual PID untuk dipasangkan dengan VID milik
mereka. Suatu pabrik pembuat IC USB kontroler untuk keperluan umum bahkan
mengijinkan VID/PID IC tersebut untuk digunakan.

6
III.1 Spesifikasi Elektrik Sinyal Data
USB menggunakan transmisi data diferensial yang dikodekan dengan metoda NRZI
(Non Return to Zero Invert) untuk mengirim data dengan field sinkronisasi untuk melakukan
sinkronisasi antara clock dari host dan device. Transmitter USB 1.1 menggunakan cara-cara
berikut untuk mengirimkan bit data :

Sinyal diferensial 1 ditransmisikan dengan cara membawa pin D+ ke tegangan


lebih dari 2.8V sambil di-pull-down ke ground dengan resistor 15k, dan membawa
pin D- ke tegangan dibawah 0.3V sambil di-pull-up ke 3.6V dengan resistor 1.5k.

Sinyal diferensial 0 ditransmisikan dengan cara membawa D+ ke tegangan


kurang dari 0.3V dan D- ke tegangan lebih dari 2.8V, dengan konfigurasi resistor
pull-down dan pull-up yang sama.

Receiver USB 1.1 mendefinisikan :

Sinyal diferensial 1 apabila D+ setidaknya 200mV lebih tinggi dari D-.

Sinyal diferensial 0 apabila D+ setidaknya 200mV lebih rendah dari D-.

Pada USB 2.0, polaritas sinyal-sinyal tersebut dibalik. Untuk memudahkan maka kode J
dan K digunakan untuk melambangkan status dari transmisi serial tersebut. Pada USB 1.1,
J state adalah diferensial 0 sedangkan pada USB 2.0, J state adalah diferensial 1.
Namun, sebenarnya transceiver USB tidak selalu menggunakan mode diferensial.
Beberapa status dari bus dapat ditunjukkan dari status tunggal D+, D- atau keduanya secara
terpisah. Sebagai contoh, Single Ended Zero (SE0) yang dibuat dengan cara membawa D+
dan D- keduanya ke tegangan lebih kecil dari 0.3V. SE0 apabila diberlakukan selaman lebih
dari 10 mS digunakan untuk me-reset device. Ini berarti sinyal diferensial dan single ended
sama-sama penting, sehingga suatu USB device controller tidak bisa hanya melakukan
sampling pada salah satunya.
Suatu low speed atau full speed bus memiliki impedansi 90 ohm dengan toleransi +/15%. Mode High speed menggunakan constant current source 17.78 mA untuk mengurangi
noise.

III.2 Identifikasi Kecepatan


Agar dapat melakukan identifikasi apakah suatu peralatan adalah low spedd atau full
speed maka digunakan suart resistor pull-up. Sebenarnya resistor ini tidak hanya berguna
sebagai identifikasi kecepatan, namun juga sebagai indikator bagi host apakah ada atau tidak
ada peralatan yang dihubungkan.

Full Speed Device menghubugkan resistor pull-up pada D+

Low Speed Device menghubugkan resistor pull-up pada D-

High Speed device selalu memulai koneksi sebagai full speed device (1.5k to 3.3V).
Setelah dia akan melakukan high speed chirp (transisi JKJKJK secara cepat) pada sat
device reset untuk meminta koneksi high speed pada host atau hub jika mereka dapat
mendukungnya. Setelah beroperasi pada high speed maka resistor pull-up akan
dinonaktifkan.

8
Suatu USB 2.0 compliant device tidak harus mendukung high speed, sama
halnya bahwa USB 1.1 compliant device tidak harus mendukung full speed dan juga
low speed sekaligus. Namun, suatu high speed device tidak boleh mendukung low
speed. Suatu USB host atau hub yang USB 2.0 compliant harus mendukung semua
mode kecepatan.

III.3 Spesifikasi Clock


High-speed data di-clock pada 480.0 MBps dengan toleransi +/- 500 ppm. Full-speed
data di-clock pada 12.0 MBps dengan toleransi +/- 2.500 ppm (0,25 %). Low-speed data diclock pada 1.5 MBps dengan toleransi +/- 15.000 ppm (1,5 %). Dengan demikian suatu
peralatan low speed dapat hanya menggunakan ceramic resonator untuk menghasilkan clocknya. Namun, suatu peralatan high speed harus menggunakan crystal yang presisi.

III.4 Spesifikasi VBUS


Tegangan yang dapat diberikan oleh host USB, VBUS, berkisar antara 4.4V sampai
5.25B. Suatu peralatan USB akan menyatakan pemakaian arusnya dalam satuan per 2 mA
pada saat host melakukan enumeration. Sebuah peralatan tidak bisa menaikkan konsumsi
arusnya lebih dari yang telah dispesifikasikan pada saat konfigurasi. Terdapat 3 jenis
peralatan USB :

Low-power bus powered device

High-power bus powered device

Self-powered device

Suatu low-power bus powered device mengambil arus sepenuhnya dari V BUS dan tidak
boleh mengambil arus lebih dari satu unit load yang besarnya 100 mA. Suatu high-power bus
powered device mengambil arus sepenuhnya dari VBUS dan tidak boleh mengambil arus lebih
dari satu unit load pada saat konfiurasi, setelah itu, sesuai spesifikasi yang dideskripsikan
pada saat enumeration, ia dapat mengkonsumsi sampai maksimum 5 unit load (500 mA).
Suatu self-powered device dapat mengambil arus dari VBUS sampai maksimal sebesar 1 unit
load dan menggunakan suplai eksternal untuk sisa kebutuhannya. Apabila karena suatu
kondisi maka suplai eksternal mengalami gangguan peralatan jenis ini harus diatur agar tidak
menggunakan lebih dari 100 mA. Apabila host mematikan VBUS karena suatu hal, maka suatu
self-powered device harus sudah menonaktifkan resistor pull-up atau pull-down ke D+ atau D(yang digunakan untuk identifikasi kecepatan) tidak lebih dari 10 detik.

9
Untuk membatasi arus sesaat (inrush current) pada saat suatu peralatan ditancapkan
(plugged), maka kapasitor decuupling yang boleh digunakan adalah maksimum 10 uF. Untuk
mencegah timbulnya flyback yang muncul pada ujung kabel pada saat suatu peralatan
dilepaskan (unplugged), maka harus digunakan kapasitor decoupling dengan ukuran minimal
1 uF.

III.5 Suspend Mode


Pada saat komputer memasuki mode suspend maka suatu peralatan USB hanya boleh
menggunakan arus maksimal sebesar 500 uA untuk setiap unit load yang telah diminta pada
saat konfigurasi. Arus ini termasuk arus yang mengalir pada resistor pull-up dan pull-down
yang digunakan oleh peralatan tersebut.
Suatu peralatan USB harus masuk ke mode suspend apabila tidak ada aktifitas apapun
pada bus selama lebih dari 3 mS. Setelah itu, peralatan mempunyai waktu maksimal 7 mS
untuk masuk ke mode suspend. Ini berarti 10 mS setelah aktifitas pada bus berakhir total,
semua peralatan USB harus sudah masuk ke mode suspend. Peralatan USB dalam mode
suspend harus tetap mengaktifkan resistor pull-up seleksi kecepatannya untuk tetap terkoneksi
dengan host atau hub.
USB mengirimkan paket khusus yang bernama start of frame atau keep alive secara
periodik untuk mencegah agar aktifitas bus tidak terhenti sama sekali pada saat tidak ada data.
Spesifikasi paket khusus ini adalah :

High speed bus akan mengirim micro-frame setiap 125.0 uS +/- 62.5 nS

Full speed bus akan mengirim frame setiap 1.0 mS +/- 500 nS

Low speed bus akan mengirim sebuah keep-alive, yang adalah suatu kode End of
Packet (EOP) setiap 1.0 mS hanya dan hanya jika tidak ada low speed data yang perlu
dikirim.

Suatu peralatan USB akan kembali aktif apabila ia mendeteksi adanya sembarang sinyal pada
bus. Peralatan yang memiliki kemampuan remote wakeup diperbolehkan untuk memberikan
sinyal pada host untuk meminta host kembali aktif.

IV. Protokol USB


Tidak seperti RS232 dimana data yang dikirim tidak memiliki peraturan tertentu, USB
tersusun atas beberapa layer protokol. Protokol layer bawah pada umumnya dikontrol
langsung oleh IC USB cotroller sedangkan software hanya perlu mengatur layer yang lebih
tinggi.

10
Setiap transaksi USB terdiri atas :

Token packet, merupakan header yang mendefinisikan paket apa selanjutnya yang
mengikutinya.

Optional data packet, yang berisi data sebenarnya (payload).

Status packet, yang digunakanan untuk meng-acknowledge transaksi dan sebagai


media untuk melakukan error correction.

Sistem USB adalah terpusat pada host, ini berarti suatu peralatan USB tidak dapat mengirim
data pada host tanpa diminta. Host akan mengirim token packet yang berisi kode apakah host
akan mengirim atau meminta data ke atau dari device.

IV.1 Struktur Paket USB


Data pada USB dikirimkan LSB-nya terlebih dahulu. Paket USB pada umumnya
tersusun atas beberapa field :

Sync, setiap paket harus diawali dengan field ini. Field ini terdiri atas 8 bit pada
low dan full speed dan 32 bit pada high speed. Paket ini berguna untuk melakukan
sinkronisasi clock antara host dan device.

PID, PID adalah Packet ID. Paket ini berguna sebagai identifikasi dari tipe paket
yang sedang dikirim.
Group

PID Value

Packet Identifier

Token

0001

OUT Token

1001

IN Token

0101

SOF Token

1101

SETUP Token

0011

DATA0

1011

DATA1

0111

DATA2

1111

MDATA

0010

ACK Handshake

1010

NAK Handshake

1110

STALL Handshake

0110

NYET (No Response Yet)

Data

Handshake

11

Special

1100

PREamble

1100

ERR

1000

Split

0100

Ping

Terdapat 4 bit untuk setiap ID, tetapi untuk memastikan agar diterima secara tepat
maka 4 bit tersebut di-invert dan diulang sehingga total menjadi 8 bit sebagai
berikut :
PID0

PID1

PID2

PID3

nPID0

nPID1

nPID2

nPID3

ADDR, paket ini berukuran 7 bit dan berisi alamat ke device manakah paket ini
ditujukan. Alamat 0 adalah tidak valid.

ENDP, paket ini berukuran 4 bit sehingga memungkinkan untuk mengakses


sampai 16 endpoint. Namun, low speed device hanya boleh memiliki maksimum 4
endpoint.

CRC, suatu cyclic redundancy checks diterapkan pada setiap data yang dikirim.
Setiap token packet memiliki 5 bit CRC sedangkan paket data memiliki CRC 16
bit.

EOP, menunjukan akhir paket (end of packet). Ditransmisikan dalam wujud Single
Ended Zero (SE0) selama kira-kira waktu 2 bit dan diikuti dengan sebuah J selama
waktu 1 bit.

IV.2 Tipe-Tipe paket USB


Terdapat 4 jenis paket yang berbeda pada USB :

Token Packet, menunjukan tipe transaksi :


o In, menunjukkan bahwa host ingin meminta data
o Out, menunjukkan bahwa host ingin mengirim data
o Setup, digunakan untuk memulai control transfer.
Paket ini memiliki format sebagai berikut :
Sync

PID

ADDR

ENDP

CRC5

EOP

12

Data Packet, terdapat dua tipe data untuk USB 1.1, yaitu :
o Data0
o Data1
USB 2.0 memiliki jenis data tambahan :
o Data2
o MData
Paket ini memiliki format sebagai berikut :
Sync

PID

Data

CRC16

EOP

Ukuran data maksimum untuk low-speed device adalah 8 byte, untuk full-speed
device adalah 1023 byte dan untuk high-speed device adalah 1024 byte.

Handshake Packet, paket ini hanya berisi PID dan memiliki 3 tipe :
o ACK, suatu acknowledgment yang menunjukkan bahwa paket telah
dikirim dengan sukses.
o NAK, suatu tanda bahwa device untuk sementara waktu tidak dapat
menerima atau mengirim data. Dalam transaksi tipe interrupt juga
digunakan untuk memberi informasi pada host bahwa tidak ada data yang
harus dikirim.
o STALL, suatu kondisi yang menyatakan bahwa device dalam kondisi stall
sehingga dibutuhkan tindakan dari host.
Secara lengkap, paket ini memiliki format sebagai berikut :
Sync

PID

EOP

Start of Frame(SOF) Packet, tersusun atas frame berukuran 11 bit yang


digunakan untuk mencegah agar bus tidak pernah benar-benar idle. Paket ini
memiliki format sebagai berikut :
Sync

PID

Frame Number

CRC5

EOP

IV.3 Endpoint dan Pipe ?


Suatu endpoint dapat dideskripsikan sebagai sources or sinks of data. Suatu endpoint
dapat dikonfigurasi sebagai output buffer (menerima data dari host) atau sebagai input buffer
(untuk mengirim data ke host). Suatu peralatan USB dapat memiliki satu atau beberapa
endpoint, namun, harus selalu mendukung endpoint zero (EP0) yang akan selalu digunakan
untuk menerima kontrol baik pada saat enumeration atau pada saat operasional.

13
Pada saat peralatan USB mengirim dan menerima data ke dan dari endpoint, maka
client software akan mentransfer data tersebut melalui sesuatu yang disebut dengan pipe.
Suatu pipe adalah sebuah logical connection antara host dan endpoint. Suatu pipe juga
dikonfigurasikan oleh beberapa parameter :

Besarnya bandwidth yang dialokasikan untuknya.

Arah aliran data (out atau in).

Ukuran paket atau buffer maksimum.

Tipe transfer (control, bulk, interrupt atau isochronous).

Suatu peralatan USB selalu dan harus memiliki sebuah default pipe yaitu bi-directional pipe
yang dihubungkan dengan endpoint zero out (EP0 OUT) dan endpoint zero in (EP0 IN).
Terdapat dua jenis pipe :

Stream Pipe, tidak memiliki format data yang khusus. Melakukan transfer data
secara sekuensial sesuai arah yang telah dikonfigurasikan sebelumnya. Digunakan
untuk transfer data bulk, interrupt dan isochronous.

Message Pipe, memiliki format data khusus. Merupakan pipe khusus yang
digunakan untuk transfer data control.

IV.3.1 Control Transfer


Digunaka untuk operasi perintah dan status. Diperlukan untuk melakukan kontrol pada
peralatan USB pada saat enumeration maupun operasional. Transfer tipe ini dapat dikirimkan
sewaktu-waktu oleh host dan selalu ada bandwidth yang dicadangkan untuknya. Pada
kecepatan rendah, ukuran paket kontrol adalah harus selalu 8 byte. Pada kecepatan penuh (full
speed) ukuran paket ini adalah harus selalu 64 byte. Sedangkan pada kecepatan tinggi dapat
berukuran 8/16/32/64 byte. Control transfer dapat terdiri sampai 3 tahap :

Setup Stage, adalah pada saat request dikirimkan. Terdiri atas 3 paket, yaitu :
o Setup Token, yang berisi alamat dan nomor endpoint
o Data Packet, yang selalu memiliki PID Data0, digunakan untuk
mendeskripsikan request.
o Handshake Packet, berupa ACK yang akan dikirimkan oleh peralatan
apabila data kontrol yang diterima benar (PID dan CRC benar). Apabila
terjadi kesalahan maka device akan dan harus membiarkan (ignore) paket
kontrol tersebut tanpa mengirim NAK ataupun STALL.

14

Data Stage, bersifat opsional dan dapat tersusun atas satu atau beberapa transfer
IN atau OUT. Prinsip pengiriman data adalah sebagi berikut :
o Tipe IN, host ingin menerima data kontrol dari device. Apabila Setup Stage
yang telah diterima sebelumnya (berisi permintaan IN) benar maka device
akan mengirimkan data yang diminta atau NAK apabila tidak ada data
yang dikirim.
o Tipe OUT, host ingin mengirim data ke device. Setelah Setup Stage maka
host akan langsung mengirimkan data yang dimaksud. Apabila device
sukses menerima maka device akan mengirim ACK, apabila sedang sibuk
akan mengirim NAK, sedangkan apabila ada kesalahan pada endpoint
maka akan dikirim STALL.

Status Stage, digunakan untuk melaporkan hasil dari request secara keseluruhan.
o Apabila Setup Stage berisi tipe IN maka setelah host menerima data dengan
benar dari device, host akan mengirim token OUT yang diikuti dengan zero
length data packet. Device akan mengirim ACK apabila telah siap
menerima perintah selanjutnya, apabila masih sibuk akan dikirim NAK.
Apabila terjadi kesalahan akan dikirim STALL.

15
o OUT, apabila Setup Stage berisi tipe OUT maka setelah mengirim data,
host akan mengirim token IN yang akan direspon oleh device dengan
mengirim zero length Data0 untuk mengindikasikan sukses dan NAK
untuk meminta pengiriman diulang. Apabila ada kesalahan, akan dikirim
STALL.

Pada saat enumeration maka untuk meminta device descriptor dari device, maka host
akan mengirim Setup Packet pada EP0 yang tersusun atas 3 tahap :
1. Setup Token

Sync

PID

ADDR

2. Data0 Packet

Sync

PID

Data0

3. Ack Handshake

Sync

PID

EOP

ENDP

CRC5

EOP

Address & Endpoint Number

CRC16

EOP

Device Descriptor Request

Device Ack. Setup Packet

Apabila device dapat menerima 3 tahap diatas dengan baik, maka IN request selanjutnya dari
host maka device akan mengirimkan data-datanya dalam 1x3 atau 2x3 tahap :
1. In Token

Sync

PID

ADDR

2. Data0 Packet

Sync

PID

3. Ack Handshake

Sync

PID

EOP

1. In Token

Sync

PID

ADDR

2. Data1 Packet

Sync

PID

3. Ack Handshake

Sync

PID

ENDP

Data0

EOP

Address & Endpoint Number

CRC16

EOP

First 8 Bytes of
Device Descriptor

Host Acknowledges Packet

ENDP

Data1

EOP

CRC5

CRC5

EOP

Address & Endpoint Number

CRC16

EOP

Last 4 bytes + Padding

Host Acknowledges Packet

16
Jika sukses make host akan mengirim zero length packet. Device akan membalas dengan
paket status :
1. Out Token

Sync

PID

ADDR

2. Data0 Packet

Sync

PID

Data0

3. Ack Handshake

Sync

PID

EOP

ENDP

CRC5

EOP

Address & Endpoint Number

CRC16

EOP

Zero Length Packet

Device Ack. Entire Transaction

IV.3.2 Interrupt Transfer


Berbeda dengan mikrokontroler, dimana interrupt dibangkitkan oleh device, pada
USB interrupt di-pooling oleh host dalam batas waktu tertentu. Transfer jenis ini memiliki
spesifikasi sebagai berikut :

Latency maksimum dijamin

Stream pipe satu arah (uni-directional)

Error detection

Pada kecepatan rendah, ukuran data maksimum adalah 8 byte. Pada kecepatan penuh
(full speed) ukuran data maksimum adalah 64 byte. Sedangkan pada kecepatan tinggi dapat
mencapai 1024 byte.

17
IV.3.3 Isochronous Transfer
Tipe transfer ini digunakan pada umumnya untuk melakukan streaming pada data
audio dan video yang sangat sensitif dengan waktu. Transfer jenis ini memiliki spesifikasi
sebagai berikut :

Terjadi secara periodik

Bandwidth dijamin sehingga pada saat setup akan ditolak (denied) oleh hosi
apabila bandwidth bus tersisa tidak mencukupi

Stream pipe satu arah (uni-directional)

Error detection dengan CRC namun host tidak akan mengirim ulang data yang
salah

Pada mode full & high speed saja

No data toggling (data tidak berubah-ubah tipe dari Data0 dan Data1)

Pada kecepatan penuh (full speed) ukuran data maksimum adalah 1023 byte.
Sedangkan pada kecepatan tinggi dapat mencapai 1024 byte. Tidak ada handshake packet
yang dapat dikirim oleh device untuk menyatakan sukses tidaknya transfer (ACK, NAK atau
STALL).

IV.3.4 Bulk Transfer


Digunakan untuk mengirimkan data berukuran besar secara sewaktu-waktu. Hanya
dapat menggunakan sisa bandwidth yang tersisa (tidak dipakai oleh tipe-tipe transfer yang
lainnya). Transfer jenis ini memiliki spesifikasi sebagai berikut :

Digunakan untuk mentransfer large bursty data

Error detection dengan CRC dan host akan mengirim ulang data yang salah

Bandwidth dan latency tidak dijamin

Stream pipe satu arah (uni-directional)

Pada mode full & high speed saja

Pada kecepatan penuh (full speed) ukuran paket adalah 6/16/32/64 byte. Sedangkan pada
kecepatan tinggi dapat mencapai 512 byte.

18

IV.4 Manajemen Bandwidth


Transfer periodik (interrupt dan isochronous) yang harus dikonfigurasikan pada saat
enumeration hanya akan diterima sampai maksimal 90% dari frame total yang tersedia pada
full speed, sedangkan pada high speed hanya diperbolehkan sampai 80% dari microframe total
yang ada. Mengingat 10% bandwidth dicadangkan untuk kontrol maka, pada bus yang penuh,
transfer tipe bulk akan mendapat latency yang besar.

IV.5 USB Descriptor


Deskripsi dari peralatan USB tersusun atas hierarki sebagai berikut :

19
Setiap descriptor diatas tersusun atas format sebagai berikut :
Offset

Field

Size

Value

Description

bLength

Number

Size of Descriptor in Bytes

bDescriptionType

Constant

DescriptorType

...

...

Start of parameters for descriptor

Apabila dalam praktek, ukuran dari descriptor yang diterima host lebih kecil atau lebih besar
dari yang dispesifikasikan maka host akan membiarkan hal itu. returned.

IV.5.1 Device Descriptor


Setiap peralatan USB hanya boleh memiliki sebuah device descriptor. Descriptor ini
tersusun sebagai berikut :
Offset

Field

Size

Value

Description

bLength

Number

Size of the Descriptor in Bytes (12 bytes)

bDescriptorType

Constant

Device Descriptor (0x01)

bcdUSB

BCD

USB Specification Number which device complies too.

bDeviceClass

Class

Class Code (Assigned by USB Org)


If equal to Zero, each interface specifies its own class code
If equal to 0xFF, the class code is vendor specified.
Otherwise field is valid Class Code.

bDeviceSubClass

SubClass

Subclass Code (Assigned by USB Org)

bDeviceProtocol

Protocol

Protocol Code (Assigned by USB Org)

bMaxPacketSize

Number

Maximum Packet Size for Zero Endpoint. Valid Sizes are 8,


16, 32, 64

idVendor

ID

Vendor ID (Assigned by USB Org)

10

idProduct

ID

Product ID (Assigned by Manufacturer)

12

bcdDevice

BCD

Device Release Number

14

iManufacturer

Index

Index of Manufacturer String Descriptor

15

iProduct

Index

Index of Product String Descriptor

16

iSerialNumber

Index

Index of Serial Number String Descriptor

17

bNumConfigurations

Integer

Number of Possible Configurations

20
bcdUSB menyatakan versi USB terbaru yang didukung oleh device. Harga ini dikodekan
dalam BCD (Binary Coded Decimal) dalam bentuk 0xJJMN dengan JJ adalah versi mayor, M
adalah versi minor dan N adalah versi sub minor. Pada USB 1.0 harga tersebut adalah
0x0100, untuk USB 1.1 adalah 0x0110 dan untuk USB 2.0 adalah 0x0200.

bDeviceClass, bDeviceSubClass dan bDeviceProtocol digunakan oleh sistem operasi untuk


mengetahui kelas dari device. Apabila berisi 0x00, berarti satu device dapat mendukung
banyak class yang masing-masing akan dideskripsikan pada interface descriptor.

bMaxPacketSize menunjukkan ukuran paket maksimum untuk EP0.

idVendor dan idProduct digunakan oleh sistem operasi untuk me-load driver yang sesuai.
Vendor ID ditetapkan oleh USB-IF.

bcdDevice yang dikodekan dalam BCD berisi vers dari device yang dibuat oleh vendor.

iManufacturer, iProduct dan iSerialNumber merupakan data string opsional yang berisi
detail dari peralatan, apabila tidak digunakan harus diisi index nol.

bNumConfigurations menunjukkan jumlah konfigurasi yang didukung device.

IV.5.2 Configuration Descriptor


Satu device dapat memiliki lebig dari satu konfigurasi. Setelah host memeriksa semua
konfigurasi yang didukung device maka host akan mengirimkan perintah (control packet)
yang berisi nomor konfigurasi yang diterima.
Offset

Field

Size

Value

Description

bLength

Number

Size of Descriptor in Bytes

bDescriptorType

Constant

Configuration Descriptor (0x02)

wTotalLength

Number

Total length in bytes of data returned

bNumInterfaces

Number

Number of Interfaces

bConfigurationValue

Number

Value to use as an argument to select this configuration

iConfiguration

Index

Index of String Descriptor describing this configuration

21
Offset

Field

Size

Value

Description

bmAttributes

Bitmap

D7 Reserved, set to 1. (USB 1.0 Bus Powered)


D6 Self Powered
D5 Remote Wakeup
D4..0 Reserved, set to 0.

bMaxPower

mA

Maximum Power Consumption in 2mA units

Suatu konfigurasi pada dasarnya adalah suatu hirarki dengan ukuran total
wTotalLength yang berbentuk :

bNumInterfaces menunjukkan jumlah interface untuk konfigurasi tersebut.

bConfigurationValue berisi kode yang akan dikembalikan host pada saat menyetujui salah
satu konfigurasi yang ditawarkan.

iConfiguration adalah indek ke suatu string yang berisi teks informasi tentang konfigurasi.

bmAttributes berisi petunjuk apakah device adalah self-powered ataukah menggunakan


suplai dari bus dan apakah device tersebut mendukung remote wakeup.

22
bMaxPower menunjukkan arus maksimum yang akan dipakai device dalam satuan per 2 mA
sampai maksimum 500 mA.

IV.5.3 Interface Descriptor


Offset

Field

Size

Value

Description

bLength

Number

Size of Descriptor in Bytes (9 Bytes)

bDescriptorType

Constant

Interface Descriptor (0x04)

bInterfaceNumber

Number

Number of Interface

bAlternateSetting

Number

Value used to select alternative setting

bNumEndpoints

Number

Number of Endpoints used for this interface

bInterfaceClass

Class

Class Code (Assigned by USB Org)

bInterfaceSubClass

SubClass

Subclass Code (Assigned by USB Org)

bInterfaceProtocol

Protocol

Protocol Code (Assigned by USB Org)

iInterface

Index

Index of String Descriptor Describing this interface

bInterfaceNumber indkes dari descriptor yang dimulai dari nol.


indicates the index of the interface descriptor. This should be zero based, and incremented
once for each new interface descriptor.

bAlternativeSetting dapat digunakan untuk mendefinisikan interface alternatif yang dapat


dipilih pada saat device operasional.

23
bNumEndpoints berisi jumlah endpoint yang dimiliki device tanpa menghitung EP0.

bInterfaceClass,

bInterfaceSubClass

dan

bInterfaceProtocol

digunakan

untuk

mendefinisikan class standar yang didukung oleh device, misalnya HID (Human Interface
Device), communications, mass storage, dan lain-lain.

iInterface berisi deskripsi string dari interface.

IV.5.4 Endpoint Descriptor


Digunakan untuk mendeskripsikan endpoint selain EP0. Memiliki struktur sebagai
berikut :
Offset

Field

Size

Value

Description

bLength

Number

Size of Descriptor in Bytes (7 bytes)

bDescriptorType

Constant

Endpoint Descriptor (0x05)

bEndpointAddress

Endpoint

Endpoint Address
Bits 0..3b Endpoint Number.
Bits 4..6b Reserved. Set to Zero
Bits 7 Direction 0 = Out, 1 = In (Ignored for Control Endpoints)

24
Offset
3

Field
bmAttributes

Size
1

Value
Bitmap

Description
Bits 0..1 Transfer Type
00 = Control
01 = Isochronous
10 = Bulk
11 = Interrupt
Bits 2..7 are reserved.

If Isochronous endpoint,
Bits 3..2 = Synchronisation Type (Iso Mode)
00 = No Synchonisation
01 = Asynchronous
10 = Adaptive
11 = Synchronous
Bits 5..4 = Usage Type (Iso Mode)
00 = Data Endpoint
01 = Feedback Endpoint
10 = Explicit Feedback Data Endpoint
11 = Reserved
4

wMaxPacketSize

Number

Maximum Packet Size this endpoint is capable of sending or


receiving

bInterval

Number

Interval for polling endpoint data transfers. Value in frame


counts. Ignored for Bulk & Control Endpoints. Isochronous
must equal 1 and field may range from 1 to 255 for interrupt
endpoints.

bEndpointAddress menunjukkan nomor endpoint yang sedang dideskripsikan.

bmAttributes menunjukkan tipe endpoint.

wMaxPacketSize menunjukkan ukuran paket maksimum.

bInterval menunjukkan interval pooling dalam satuan frame, ini berarti kelipatan dari setiap
1 mS untuk low / full speed dan 125 uS untuk high speed.

25
IV.5.5 String Descriptor
Digunakan untuk menampung informasi-informasi tambahan. Apabila tidak
digunakan haris diisi dengan nol. Dikodekan dalam format Unicode. String indeks 0 harus
berisi daftar dari bahasa yang didukung. Format untuk string descriptor zero adalah sebagai
berikut :
Offset

Field

Size

Value

Description

bLength

Number

Size of Descriptor in Bytes

bDescriptorType

Constant

String Descriptor (0x03)

wLANGID[0]

number

Supported Language Code Zero


(e.g. 0x0409 English - United States)

wLANGID[1]

number

Supported Language Code One


(e.g. 0x0c09 English - Australian)

wLANGID[x]

number

Supported Language Code x


(e.g. 0x0407 German - Standard)

Sedangkan string-string lainnya memiliki format sebagai berikut :


Offset

Field

Size

Value

Description

Blength

Number

Size of Descriptor in Bytes

BdescriptorType

Constant

String Descriptor (0x03)

Bstring

Unicode

Unicode Encoded String

IV.6 Spesifikasi Request


Suatu request harus sudah diproses dalam waktu maksimum 5 detik, kecuali untuk
beberapa yang khusus sebagai berikut :

Standard Device requests tanpa data stage harus selesai dalam 50 mS.

Standard Device requests dengan data stage harus mulai mengirim data dalam 500
mS. Setiap paket data berurutan harus dikirim dalam maksimal 500 mS setelah
paket sebelumnya. Status stage harus selesai maksimal dalam 50 mS setelah paket
data terakhir ditransmisikan.

SetAddress command harus selesai dalam 50 mS, untuk kemudian device memiliki
setidaknya 2 mS untuk mengubah address internalnya sebelum request selanjutnya
dikirimkan.

26
Setiap request memiliki format sebagai berikut :
Offset

Field

Size

Value

Description

bmRequestType

Bit-Map

D7 Data Phase Transfer Direction


0 = Host to Device
1 = Device to Host
D6..5 Type
0 = Standard
1 = Class
2 = Vendor
3 = Reserved
D4..0 Recipient
0 = Device
1 = Interface
2 = Endpoint
3 = Other
4..31 = Reserved

bRequest

Value

Request

wValue

Value

Value

wIndex

Index or Offset

Index

wLength

Count

Number of bytes to transfer if there is a data phase

bmRequestType berisi arah aliran, tipe dan resipien dari request.

bRequest berisi kode request yang diminta.

wValue dan wIndex digunakan untuk menunjukkan parameter-parameter yang akan


mengikuti.

wLength berisi panjang data yang akan mengikuti (bila ada data phase).

IV.6.1 Standard Device Requests


Terdapat 8 jenis device request standar yang dispesifikasikan oleh USB seperti yang
ditunjukkan pada tabel berikut ini :
bmRequestType

bRequest

wValue

wIndex

wLength

Data

1000 0000b

GET_STATUS (0x00)

Zero

Zero

Two

Device Status

0000 0000b

CLEAR_FEATURE
(0x01)

Feature
Selector

Zero

Zero

None

0000 0000b

SET_FEATURE (0x03)

Feature
Selector

Zero

Zero

None

27
bmRequestType

bRequest

wValue

wIndex

wLength

Data

0000 0000b

SET_ADDRESS (0x05)

Device Address

Zero

Zero

None

1000 0000b

GET_DESCRIPTOR
(0x06)

Descriptor
Type & Index

Zero
or
Language
ID

Descriptor
Length

Descriptor

0000 0000b

SET_DESCRIPTOR
(0x07)

Descriptor
Type & Index

Zero
or
Language
ID

Descriptor
Length

Descriptor

1000 0000b

GET_CONFIGURATION
(0x08)

Zero

Zero

Configuration
Value

0000 0000b

SET_CONFIGURATION
(0x09)

Configuration
Value

Zero

Zero

None

Get Status request akan membuat device mengembalikan 2 byte pada data phase dengan
format sebagai berikut :
D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

Reserved

D5

D4

D3

D2

D1

D0

Remote
Wakeup

Self
Powered

Clear Feature dan Set Feature dapat digunakan untuk mengeset suatu harga boolean. Fitur
yang dapat diset adalah DEVICE_REMOTE_WAKEUP dan TEST_MODE.

Set Address digunakan pada saat enumerasi untuk memberikan alamt unik pada peralatan
USB. Suatu USB device akan mengeset alamat internalnya dengan alamat yang diberikan Set
Address setelah keseluruhan status stage komplit.

Get Descriptor atau Set Descriptor digunakan untuk mengambil dan menentukan informasi
mengenai suatu deskriptor. Permintaan untuk mengirim configuration descriptor akan
mengembalikan keseluruhan device descriptor lengkap dengan semua interface dan endpoint
descriptor pada satu transaksi. Suatu interface dan endpoint descriptor tidak dapat diakses
secara langsung dengan request ini. String descriptor mengandung ID dari suatu bahasa untuk
memungkinkan dukungan pada banyak bahasa.

28
Get Configuration digunakan untuk mengambil informasi mengenai konfigurasi aktif dari
suatu peralatan. Harga nol apabila dikembalikan menyatakan bahwa device tidak
terkonfigurasi sedangkan harga bukan nol menunjukkan bahwa device telah terkonfigurasi.

Set Configuration digunakan untuk mengaktifkan suatu device. Request ini memberikan
harga bConfigurationValue (pada byte rendah dari wValue) yang telah dikirimkan melalui
configuration descriptor sebelumnya untuk menyatakan persetujuan host terhadap konfigurasi
yang diminta.

IV.6.2 Standard Inrterface Requests


Terdapat 5 jenis interface request standar yang dispesifikasikan oleh USB seperti yang
ditunjukkan pada tabel berikut ini :
bmRequestType

bRequest

wValue

wIndex

wLength

Data

1000 0001b

GET_STATUS (0x00)

Zero

Interface

Two

Interface Status

0000 0001b

CLEAR_FEATURE
(0x01)

Feature Selector

Interface

Zero

None

0000 0001b

SET_FEATURE (0x03)

Feature Selector

Interface

Zero

None

1000 0001b

GET_INTERFACE
(0x0A)

Zero

Interface

One

Alternate
Interface

0000 0001b

SET_INTERFACE (0x11)

Alternative
Setting

Interface

Zero

None

wIndex berisi nomor interface yang dimana request tersebut ditujukan dengan format sebagai
berikut :
D15

D14

D13

D12

D11

D10

D9

D8

D7

Reserved

D6

D5

D4

D3

D2

D1

D0

Interface Number

Get Status digunakan untuk meminta status dari suatu interface. Untuk sekarang, device harus
mengembalikan dua byte, yaitu : 0x00, 0x00. Fungsi ini dicadangkan untuk masa depan.

Clear Feature dan Set Feature digunakan untuk menagaktifkan dan menonaktifkan fitur dari
interface. Fungsi ini dicadangkan untuk masa depan.

29
Get Interface dan Set Interface digunakan untuk mengaktifkan konfigurasi interface
alternatif.

IV.6.3 Standard Endpoint Requests


Terdapat 4 jenis interface request standar yang dispesifikasikan oleh USB seperti yang
ditunjukkan pada tabel berikut ini :
bmRequestType

bRequest

wValue

Windex

wLength

Data

1000 0010b

GET_STATUS (0x00)

Zero

Endpoint

Two

Endpoint Status

0000 0010b

CLEAR_FEATURE (0x01)

Feature Selector

Endpoint

Zero

None

0000 0010b

SET_FEATURE (0x03)

Feature Selector

Endpoint

Zero

None

1000 0010b

SYNCH_FRAME (0x12)

Zero

Endpoint

Two

FrameNumber

wIndex berisi informasi arah aliran data dan nomor endpoint dengan format sebagai berikut :
D15

D14

D13

D12

D11

D10

D9

D8

Reserved

D7

D6

Dir

D5

D4

Reserved

D3

D2

D1

D0

Endpoint Number

Get Status digunakan untuk mengetahui apakah suatu endpoint berada dalam keadaan stall
atau halt.
D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

Reserved

D1

D0
Halt

Clear Feature dan Set Feature digunakan untuk mengaktifkan atau mematikan fitur dari
suatu endpoint. Untuk sekarang hanya ada satu fitur, yaitu ENDPOINT_HALT (0x00), yang
memungkinkan host untuk meng-stall dan meng-clear suatu endpoint. Suatu endpoint selain
EP0 sebaiknya dikonfigurasi untuk memiliki fitur ini.

Synch Frame digunakan untuk melaporkan endpoint synchronisation frame.

V. Rangkaian Modul USB dengan AN2131QC


Dibawah ini digambarkan rangkaian modul USB Interface dengan IC Cypress EZUZB AN2131QC. Kemudian tiga skema selanjutnya secara berturut-turut adalah skema
rangkaian demo yang menggunakan modul tersebut.

30

31

32

33

34

35
VI. Program Demo Rangkaian Modul USB
Dibawah ini disertakan 4 buah program demo untuk digunakan pada board rangkaian
USB seperti yang digambarkan pada poin V diatas.
// ***** Demo Circuit : Buttons & LEDs
// *****
#include
#include
#include

C++ Headers
<conio.h>
<stdio.h>
<windows.h>

// ***** USBI2CIO Header & Library


extern "C"
{
#include <usbi2cio.h>
}
#pragma comment( lib, "usbi2cio" )
// ***** EZUSB I/O Port Configuration
#define EZ_MODE
0x0001FF00
// ***** Circuit Selection
#define EZ_SELECT_BAL 0x00070000
#define EZ_SELECT_ADDA 0x000F0000
#define EZ_SELECT_MASK 0x000F0000
// ***** For Buttons &
#define EZ_WRMASK_BAL
#define EZ_RDMASK_SW1
#define EZ_RDMASK_SW2

LEDs Circuit
0x000000FF
0x00000100
0x00000200

// ***** For ADC & DAC Circuit


#define EZ_WRMASK_DAC_DTA 0x000000FF
#define EZ_WRMASK_ADC_WR 0x00020000
#define EZ_WRMASK_ADC_RD 0x00040000
#define EZ_RDMASK_ADC_INT 0x00010000
#define EZ_RDMASK_ADC_DTA 0x0000FF00
// ***** The Main Program
int main(void)
{
// ..... Variables
unsigned char aucData[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };
char
cCnt, cDir, acSerial[9];
WORD
wTmp;
DWORD
dwIn;
HANDLE
hDev;
// ..... Initialization
if((hDev = DAPI_OpenDeviceInstance("UsbI2cIo", NULL)) == INVALID_HANDLE_VALUE) goto
ERROpen;
if(DAPI_ConfigIoPorts(hDev, EZ_MODE) == 0) goto ERRConfig;
if(DAPI_WriteIoPorts(hDev, EZ_SELECT_BAL, EZ_SELECT_MASK) == 0) goto ERRWrite;
cDir = 1;
// ..... Show some information
printf("Found a USBI2CIO device :\n");
wTmp = DAPI_GetDllVersion();
printf(" DLL version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
wTmp = DAPI_GetDriverVersion();
printf(" Driver version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
DAPI_GetFirmwareVersion(hDev, &wTmp);
printf(" Firmware version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
DAPI_GetSerialId(hDev, acSerial);
printf(" Serial ID ");
for(cCnt = 0; cCnt <= 7 ; cCnt++) printf("%02X", (unsigned char) acSerial[cCnt]);
printf("\n\n");
// ..... Main loop
printf("Displaying running LEDs ...\n");
printf(" * Press SW1 to pause\n");

36
printf(" * Press SW2 to reverse the direction\n");
printf(" * Press SW1 & SW2 to exit\n\n");
for(;;)
{
// Read port
if(DAPI_ReadIoPorts(hDev, (long *) &dwIn) == 0) goto ERRRead;
// Check the read value
if(dwIn & EZ_RDMASK_SW1)
{
while(dwIn & EZ_RDMASK_SW1)
{
if(dwIn & EZ_RDMASK_SW2) goto DoExit;
if(DAPI_ReadIoPorts(hDev, (long *) &dwIn) == 0) goto ERRRead;
}
}
else if(dwIn & EZ_RDMASK_SW2)
{
// Pause till released
while(dwIn & EZ_RDMASK_SW2)
{
if(dwIn & EZ_RDMASK_SW1) goto DoExit;
if(DAPI_ReadIoPorts(hDev, (long *) &dwIn) == 0) goto ERRRead;
}
// Reverse the direction
cDir = -cDir;
}
// Write port
if(DAPI_WriteIoPorts(hDev, DWORD(aucData[cCnt]), EZ_WRMASK_BAL) == 0) goto
ERRWrite;
// Update counter
cCnt += cDir;
if(cCnt > 7) cCnt = 0;
if(cCnt < 0) cCnt = 7;
// Wait
Sleep(200);
if(kbhit()) getch();
}
// ..... Exiting
DoExit:;
DAPI_WriteIoPorts(hDev, 0x00000000, EZ_WRMASK_BAL);
DAPI_CloseDeviceInstance(hDev);
printf("Press any key to exit ...\n");
getch(); return(0);
// ..... Error handlers
ERROpen:
printf("Couldn't open USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRConfig:
DAPI_CloseDeviceInstance(hDev);
printf("Set port configuration of USBI2CIO device failed !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRRead:
DAPI_CloseDeviceInstance(hDev);
printf("Error reading ports from USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRWrite:
DAPI_CloseDeviceInstance(hDev);
printf("Error writing ports to USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
}

37
// ***** Demo Circuit : ADC
// *****
#include
#include
#include

C++ Headers
<conio.h>
<stdio.h>
<windows.h>

// ***** USBI2CIO Header & Library


extern "C"
{
#include <usbi2cio.h>
}
#pragma comment( lib, "usbi2cio" )
// ***** EZUSB I/O Port Configuration
#define EZ_MODE
0x0001FF00
// ***** Circuit Selection
#define EZ_SELECT_BAL 0x00070000
#define EZ_SELECT_ADDA 0x000F0000
#define EZ_SELECT_MASK 0x000F0000
// ***** For Buttons &
#define EZ_WRMASK_BAL
#define EZ_RDMASK_SW1
#define EZ_RDMASK_SW2

LEDs Circuit
0x000000FF
0x00000100
0x00000200

// ***** For ADC & DAC Circuit


#define EZ_WRMASK_DAC_DTA 0x000000FF
#define EZ_WRMASK_ADC_WR 0x00020000
#define EZ_WRMASK_ADC_RD 0x00040000
#define EZ_RDMASK_ADC_INT 0x00010000
#define EZ_RDMASK_ADC_DTA 0x0000FF00
// ***** The Main Program
int main(void)
{
// ..... Variables
unsigned char ucData, ucOld;
char
cCnt, acSerial[9];
WORD
wTmp;
DWORD
dwIn;
HANDLE
hDev;
// ..... Initialization
if((hDev = DAPI_OpenDeviceInstance("UsbI2cIo", NULL)) == INVALID_HANDLE_VALUE) goto
ERROpen;
if(DAPI_ConfigIoPorts(hDev, EZ_MODE) == 0) goto ERRConfig;
if(DAPI_WriteIoPorts(hDev, EZ_SELECT_ADDA, EZ_SELECT_MASK) == 0) goto ERRWrite;
if(DAPI_WriteIoPorts(hDev, 0x00000000, EZ_WRMASK_DAC_DTA) == 0) goto ERRWrite;
// ..... Show some information
printf("Found a USBI2CIO device :\n");
wTmp = DAPI_GetDllVersion();
printf(" DLL version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
wTmp = DAPI_GetDriverVersion();
printf(" Driver version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
DAPI_GetFirmwareVersion(hDev, &wTmp);
printf(" Firmware version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
DAPI_GetSerialId(hDev, acSerial);
printf(" Serial ID ");
for(cCnt = 0; cCnt <= 7 ; cCnt++) printf("%02X", (unsigned char) acSerial[cCnt]);
printf("\n\n");
// ..... Main loop
printf("Reading ADC, press any key to exit ...\n\n");
ucOld = 0;
for(;;)
{
// Activate ADC
if(DAPI_WriteIoPorts(hDev, 0x00000000, EZ_WRMASK_ADC_WR) == 0) goto ERRWrite;
if(DAPI_WriteIoPorts(hDev, 0xFFFFFFFF, EZ_WRMASK_ADC_WR) == 0) goto ERRWrite;
Sleep(250);
// Read port
if(DAPI_WriteIoPorts(hDev, 0x00000000, EZ_WRMASK_ADC_RD) == 0) goto ERRWrite;

38
if(DAPI_ReadIoPorts(hDev, (long *) &dwIn) == 0) goto ERRRead;
if(DAPI_WriteIoPorts(hDev, 0xFFFFFFFF, EZ_WRMASK_ADC_RD) == 0) goto ERRWrite;
ucData = (unsigned char) ((dwIn & 0x0000FF00) >> 8);
// Print the read value
if(ucData != ucOld)
{
ucOld = ucData;
printf("%03d\n", ucData);
}
// Wait
if(kbhit())
{
DAPI_CloseDeviceInstance(hDev);
getch(); return(0);
}
}
return(0);
// ..... Error handlers
ERROpen:
printf("Couldn't open USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRConfig:
DAPI_CloseDeviceInstance(hDev);
printf("Set port configuration of USBI2CIO device failed !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRRead:
DAPI_CloseDeviceInstance(hDev);
printf("Error reading ports from USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRWrite:
DAPI_CloseDeviceInstance(hDev);
printf("Error writing ports to USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
}

39
// ***** Demo Circuit : DAC
// *****
#include
#include
#include

C++ Headers
<conio.h>
<stdio.h>
<windows.h>

// ***** USBI2CIO Header & Library


extern "C"
{
#include <usbi2cio.h>
}
#pragma comment( lib, "usbi2cio" )
// ***** EZUSB I/O Port Configuration
#define EZ_MODE
0x0001FF00
// ***** Circuit Selection
#define EZ_SELECT_BAL 0x00070000
#define EZ_SELECT_ADDA 0x000F0000
#define EZ_SELECT_MASK 0x000F0000
// ***** For Buttons &
#define EZ_WRMASK_BAL
#define EZ_RDMASK_SW1
#define EZ_RDMASK_SW2

LEDs Circuit
0x000000FF
0x00000100
0x00000200

// ***** For ADC & DAC Circuit


#define EZ_WRMASK_DAC_DTA 0x000000FF
#define EZ_WRMASK_ADC_WR 0x00020000
#define EZ_WRMASK_ADC_RD 0x00040000
#define EZ_RDMASK_ADC_INT 0x00010000
#define EZ_RDMASK_ADC_DTA 0x0000FF00
// ***** The Main Program
int main(void)
{
// ..... Variables
unsigned char ucData;
char
acSerial[9], cCnt;
WORD
wTmp;
HANDLE
hDev;
// ..... Initialization
if((hDev = DAPI_OpenDeviceInstance("UsbI2cIo", NULL)) == INVALID_HANDLE_VALUE) goto
ERROpen;
if(DAPI_ConfigIoPorts(hDev, EZ_MODE) == 0) goto ERRConfig;
if(DAPI_WriteIoPorts(hDev, EZ_SELECT_ADDA, EZ_SELECT_MASK) == 0) goto ERRWrite;
// ..... Show some information
printf("Found a USBI2CIO device :\n");
wTmp = DAPI_GetDllVersion();
printf(" DLL version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
wTmp = DAPI_GetDriverVersion();
printf(" Driver version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
DAPI_GetFirmwareVersion(hDev, &wTmp);
printf(" Firmware version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
DAPI_GetSerialId(hDev, acSerial);
printf(" Serial ID ");
for(cCnt = 0; cCnt <= 7 ; cCnt++) printf("%02X", (unsigned char) acSerial[cCnt]);
printf("\n\n");
// ..... Main loop
printf("Playing noise using DAC, press any key to exit ...\n\n");
ucData = 0;
for(;;)
{
// Write port
if(DAPI_WriteIoPorts(hDev, DWORD(ucData), EZ_WRMASK_DAC_DTA) == 0) goto ERRWrite;
// Update data
if(ucData)
ucData = 0;
else
ucData = 255;

40
// Wait
if(kbhit())
{
DAPI_WriteIoPorts(hDev, 0x00000000, EZ_WRMASK_DAC_DTA);
DAPI_CloseDeviceInstance(hDev);
getch(); return(0);
}
}
// ..... Error handlers
ERROpen:
printf("Couldn't open USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRConfig:
DAPI_CloseDeviceInstance(hDev);
printf("Set port configuration of USBI2CIO device failed !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRWrite:
DAPI_CloseDeviceInstance(hDev);
printf("Error writing ports to USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
}

41
// ***** Demo Circuit : ADC-DAC
// *****
#include
#include
#include

C++ Headers
<conio.h>
<stdio.h>
<windows.h>

// ***** USBI2CIO Header & Library


extern "C"
{
#include <usbi2cio.h>
}
#pragma comment( lib, "usbi2cio" )
// ***** EZUSB I/O Port Configuration
#define EZ_MODE
0x0001FF00
// ***** Circuit Selection
#define EZ_SELECT_BAL 0x00070000
#define EZ_SELECT_ADDA 0x000F0000
#define EZ_SELECT_MASK 0x000F0000
// ***** For Buttons &
#define EZ_WRMASK_BAL
#define EZ_RDMASK_SW1
#define EZ_RDMASK_SW2

LEDs Circuit
0x000000FF
0x00000100
0x00000200

// ***** For ADC & DAC Circuit


#define EZ_WRMASK_DAC_DTA 0x000000FF
#define EZ_WRMASK_ADC_WR 0x00020000
#define EZ_WRMASK_ADC_RD 0x00040000
#define EZ_RDMASK_ADC_INT 0x00010000
#define EZ_RDMASK_ADC_DTA 0x0000FF00
// ***** The Main Program
int main(void)
{
// ..... Variables
unsigned char ucData, ucTm;
char
cCnt, acSerial[9];
WORD
wTmp;
DWORD
dwIn;
HANDLE
hDev;
// ..... Initialization
if((hDev = DAPI_OpenDeviceInstance("UsbI2cIo", NULL)) == INVALID_HANDLE_VALUE) goto
ERROpen;
if(DAPI_ConfigIoPorts(hDev, EZ_MODE) == 0) goto ERRConfig;
if(DAPI_WriteIoPorts(hDev, EZ_SELECT_ADDA, EZ_SELECT_MASK) == 0) goto ERRWrite;
if(DAPI_WriteIoPorts(hDev, 0x00000000, EZ_WRMASK_DAC_DTA) == 0) goto ERRWrite;
// ..... Show some information
printf("Found a USBI2CIO device :\n");
wTmp = DAPI_GetDllVersion();
printf(" DLL version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
wTmp = DAPI_GetDriverVersion();
printf(" Driver version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
DAPI_GetFirmwareVersion(hDev, &wTmp);
printf(" Firmware version %02d.%02d\n", wTmp >> 8, wTmp & 0x00FF);
DAPI_GetSerialId(hDev, acSerial);
printf(" Serial ID ");
for(cCnt = 0; cCnt <= 7 ; cCnt++) printf("%02X", (unsigned char) acSerial[cCnt]);
printf("\n\n");
// ..... Main loop
printf("Reading ADC and playing noise using DAC ...\n");
printf(" * Use the potentiometer to adjust volume\n");
printf(" * Press any key to exit\n\n");
ucTm = 0;
for(;;)
{
// Activate ADC
if(DAPI_WriteIoPorts(hDev, 0x00000000, EZ_WRMASK_ADC_WR) == 0) goto ERRWrite;
if(DAPI_WriteIoPorts(hDev, 0xFFFFFFFF, EZ_WRMASK_ADC_WR) == 0) goto ERRWrite;
// Check for ADC interrupt

42
for(;;)
{
if(DAPI_ReadIoPorts(hDev, (long *) &dwIn) == 0) goto ERRRead;
if(!(dwIn & EZ_RDMASK_ADC_INT))
{
// Read port
if(DAPI_WriteIoPorts(hDev, 0x00000000, EZ_WRMASK_ADC_RD) == 0) goto ERRWrite;
if(DAPI_ReadIoPorts(hDev, (long *) &dwIn) == 0) goto ERRRead;
if(DAPI_WriteIoPorts(hDev, 0xFFFFFFFF, EZ_WRMASK_ADC_RD) == 0) goto ERRWrite;
ucData = (unsigned char) ((dwIn & 0x0000FF00) >> 8);
break;
}
}
// Write port
if(DAPI_WriteIoPorts(hDev, DWORD(ucData & ucTm), EZ_WRMASK_DAC_DTA) == 0) goto
ERRWrite;
// Update data
if(ucTm)
ucTm = 0;
else
ucTm = 255;
// Wait
if(kbhit())
{
DAPI_CloseDeviceInstance(hDev);
getch(); return(0);
}
}
return(0);
// ..... Error handlers
ERROpen:
printf("Couldn't open USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRConfig:
DAPI_CloseDeviceInstance(hDev);
printf("Set port configuration of USBI2CIO device failed !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRRead:
DAPI_CloseDeviceInstance(hDev);
printf("Error reading ports from USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
ERRWrite:
DAPI_CloseDeviceInstance(hDev);
printf("Error writing ports to USBI2CIO device !\n");
printf("Press any key to exit ...\n");
getch(); return(-1);
}

43
VII. Daftar Pustaka

EZ-USB Manual Technical Reference, Cypress Semiconductor, www.cypress.com

http://computer.howstuffworks.com/usb.htm/printable

http://www.beyondlogic.org/usbnutshell/usb1.htm
http://www.beyondlogic.org/usbnutshell/usb2.htm
http://www.beyondlogic.org/usbnutshell/usb3.htm
http://www.beyondlogic.org/usbnutshell/usb4.htm
http://www.beyondlogic.org/usbnutshell/usb5.htm
http://www.beyondlogic.org/usbnutshell/usb6.htm