Upload
lycoris-rhea
View
50
Download
1
Embed Size (px)
DESCRIPTION
การสื่อสารกับบอร์ด MCU ผ่านพอร์ต USB. ปฏิบัติการเกี่ยวกับวิศวกรรมคอมพิวเตอร์ (01204223). ผศ.ดร.ชัยพร ใจแก้ว ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเกษตรศาสตร์. สถาปัตยกรรม USB. อุปกรณ์ด้านหนึ่งทำหน้าที่เป็นโฮสท์ (Host) อีกด้านหนึ่งทำหน้าที่เป็นดีไวซ์ (Device) - PowerPoint PPT Presentation
Citation preview
การสื่��อสื่ารก�บบอรด การสื่��อสื่ารก�บบอรด MCUMCU
ผ่�านพอรต ผ่�านพอรต USBUSB
ปฏิ�บั�ติ�การเก��ยวก�บัว�ศวกรรมปฏิ�บั�ติ�การเก��ยวก�บัว�ศวกรรมคอมพิ�วเติอร�คอมพิ�วเติอร�
(01204223)(01204223)ผศ.ดร.ชั�ยพิร ใจแก�ว
ภาคว�ชัาว�ศวกรรมคอมพิ�วเติอร�คณะว�ศวกรรมศาสติร� มหาว�ทยาลั�ยเกษติรศาสติร�
2
สื่ถาปั�ตยกรรม สื่ถาปั�ตยกรรม USBUSBอ%ปกรณ�ด�านหน'�งท)าหน�าท��เป*นโฮสท� อ%ปกรณ�ด�านหน'�งท)าหน�าท��เป*นโฮสท� (Host) (Host)
อ�กด�านหน'�งท)าหน�าท��เป*นด�ไวซ์�อ�กด�านหน'�งท)าหน�าท��เป*นด�ไวซ์� (Device)(Device)
ไม/ว/าจะเขี�ยนขี�อม1ลัไปย�งด�ไวซ์� หร2ออ/านขี�อม1ลัไม/ว/าจะเขี�ยนขี�อม1ลัไปย�งด�ไวซ์� หร2ออ/านขี�อม1ลัจากด�ไวซ์� ฝั่4� งโฮสท�ติ�องม�การส/งค)าร�องขีอ จากด�ไวซ์� ฝั่4� งโฮสท�ติ�องม�การส/งค)าร�องขีอ (request) (request) ไปก/อนเสมอไปก/อนเสมอ
USB Host
USBDevice
USB Cable
Request
Response
PC - Notebook -
- Flash drive- Mouse- Game controller- etc.
DeviceDriverApp
3
โครงสื่ร�างของค�าร�องขอโครงสื่ร�างของค�าร�องขอประกอบัด�วยขี�อม1ลั ประกอบัด�วยขี�อม1ลั 5 5 ส/วนส/วน
RequestType (1 ไบัท� ) – ท�ศทางการส/งขี�อม1ลั
Request (1 ไบัท�) – หมายเลัขีค)าร�องขีอValue (2 ไบัท�) – พิาราม�เติอร�ประกอบัค)าร�อง
เพิ��มเติ�มIndex (2 ไบัท�) – พิาราม�เติอร�ประกอบัค)าร�อง
เพิ��มเติ�มLength (2 ไบัท� ) – จ)านวนไบัท�ขีองขี�อม1ลัท��
ติ�องการส/งให�หร2อร�บัจากด�ไวซ์�
4
โค�ดต�วอย�างโค�ดต�วอย�างดาวน�โหลัดได�จากดาวน�โหลัดได�จาก
http://www.cpe.ku.ac.th/~cpj/204223/usb-example.tgz
แติกไฟลั�ไว�ในเคร2�องขีองตินโดยเร�ยกค)าส��งเชัลัลั�แติกไฟลั�ไว�ในเคร2�องขีองตินโดยเร�ยกค)าส��งเชัลัลั�
ในไฟลั�ติ�วอย/างประกอบัด�วยในไฟลั�ติ�วอย/างประกอบัด�วยไลับัราร� V-USBmain.c –ติ�วอย/างเฟ6ร�มแวร�ฝั่4� งด�ไวซ์�practicum.py – ไพิธอนมอด1ลัส)าหร�บัฝั่4� งโฮสท�peri.py – ไฟลั�เร��มติ�นส)าหร�บัท)าแบับัฝั่8กห�ดtest-usb.py – โค�ดส)าหร�บัทดสอบัแบับัฝั่8กห�ดMakefile
$ tar zxf usb-example.tgz
5
เฟิ รมแวรฝั่�� งด#ไวซ์ เฟิ รมแวรฝั่�� งด#ไวซ์ ((บอรด บอรด MCU)MCU)อาศ�ยไลับัราร� อาศ�ยไลับัราร� V-USB V-USB จ)าลัองกลัไก จ)าลัองกลัไก USB USB ด�วยด�วย
ซ์อฟติ�แวร�ซ์อฟติ�แวร�แก�ไขีการติ�9งค/าในไฟลั� แก�ไขีการติ�9งค/าในไฟลั� usbconfig.husbconfig.h
เปลั��ยน USB_CFG_DEVICE_NAME ให�เป*น Practicum Group XX
โดย XX เป*นหมายเลัขีกลั%/ม (อย/าลั2มระบั%ความยาวสติร�งให�ถู1กติ�อง)
โค�ดในเมนลั1ปม�การเร�ยกฟ4งก�ชั�น โค�ดในเมนลั1ปม�การเร�ยกฟ4งก�ชั�น usbPoll() usbPoll() เพิ2�อเพิ2�อติรวจสอบัค)าร�องขีอจากฝั่4� งโฮสท�ติรวจสอบัค)าร�องขีอจากฝั่4� งโฮสท�
เม2�อได�ร�บัค)าร�องขีอ ไลับัราร� เม2�อได�ร�บัค)าร�องขีอ ไลับัราร� V-USB V-USB จะเร�ยกจะเร�ยกฟ4งก�ชั�น ฟ4งก�ชั�น usbFunctionSetup() usbFunctionSetup() โดยอ�ติโนม�ติ�โดยอ�ติโนม�ติ�ติ�องเขี�ยนฟ4งก�ชั�นน�9ขี'9นมาเอง
6
ต�วอย�างฟิ�งกชั�น ต�วอย�างฟิ�งกชั�น usbFunctionSetupusbFunctionSetupusbMsgLen_t usbFunctionSetup(uint8_t data[8]){ usbRequest_t *rq = (void *)data; static uint16_t returnedData;
if (rq->bRequest == 0) { /* Do something */ return 0; } else if (rq->bRequest == 1) { /* Do something */ usbMsgPtr = (uchar*) &returnedData; return sizeof(returnedData); }
return 0;}
ตอบสื่นองค�าร�องขอที่#�ไม�ขอข�อม(ลค�น- ให้�ฟิ�งกชั�นค�นค�า 0
ตอบสื่นองค�าร�องขอที่#�ต�องการข�อม(ลค�น- ให้�ต�วแปัร usbMsgPtr ชั#,ที่#�ต�าแห้น�งของ ข�อม(ลที่#�ต�องการสื่�งให้�โฮสื่ที่- ให้�ฟิ�งกชั�นค�นค�าจำ�านวนไบที่ที่#�ต�องการ สื่�งให้�โฮสื่ที่
ตรวจำสื่อบห้มายเลขค�าร�อง
7
โครงสื่ร�างค�าร�องขอโครงสื่ร�างค�าร�องขอม�ขีนาด ม�ขีนาด 8 8 ไบัท� น�ยามไว�แลั�วในสติร�ค ไบัท� น�ยามไว�แลั�วในสติร�ค usbRequest_tusbRequest_t ( (ในใน
ไฟลั� ไฟลั� usbdrv/usbdrv.husbdrv/usbdrv.h) ) ด�งน�9ด�งน�9
uchar uchar ถู1กน�ยามให�เป*นชัน�ดขี�อม1ลั ถู1กน�ยามให�เป*นชัน�ดขี�อม1ลั unsigned char unsigned char ((ซ์'�งเท�ยบัเท/าก�บั ซ์'�งเท�ยบัเท/าก�บั uint8_tuint8_t) ) ส/วน ส/วน usbWord_tusbWord_t น�ยามเป*นน�ยามเป*นชัน�ดชัน�ด union union ด�งน�9ด�งน�9
typedef struct usbRequest{ uchar bmRequestType; /* 1 ไบัท� */ uchar bRequest; /* 1 ไบัท� */ usbWord_t wValue; /* 2 ไบัท� */ usbWord_t wIndex; /* 2 ไบัท� */ usbWord_t wLength; /* 2 ไบัท� */ }usbRequest_t;
typedef union usbWord{ unsigned word; uchar bytes[2];}usbWord_t;
8
โปัรแกรมฝั่�� งโฮสื่ที่โปัรแกรมฝั่�� งโฮสื่ที่ ((ไพธอนไพธอน))อาศ�ยไลับัราร� อาศ�ยไลับัราร� PyUSBPyUSB
ทดสอบัโดยเร�ยกค)าส��ง import usb ในไพิธอน(Linux) หากไม/พิบัให�ติ�ดติ�9งโดยใชั�ค)าส��ง
(MacOS) หากไม/พิบัให�ดาวน�โหลัด libusb1.0 จาก SourceForge
มอด1ลั มอด1ลั practicum.py practicum.py เติร�ยมคลัาส เติร�ยมคลัาส McuBoard McuBoard ไว�ให�ใชั�งานได�สะดวกขี'9นไว�ให�ใชั�งานได�สะดวกขี'9น
$ sudo apt-get install python-usb
>>> from practicum import McuBoard>>> b = McuBoard()>>> help(b)
9
ต�วอย�างการสื่�งค�าร�องต�วอย�างการสื่�งค�าร�อง>>> from practicum import McuBoard>>> b = McuBoard()
# สื่��งให้� LED สื่#เข#ยว (ห้มายเลข 2) บน Peripheral board ต0ด>>> b.usb_write(0, index=2, value=1)
# อ�านสื่ถานะสื่ว0ตชับน Peripheral board>>> b.usb_read(1, length=1)
10
แบบฝั่2กห้�ดแบบฝั่2กห้�ดแก�ไขีเฟ6ร�มแวร�แก�ไขีเฟ6ร�มแวร� (main.c) (main.c) เพิ2�อเพิ��มค)าร�องขีอหมายเลัขี เพิ2�อเพิ��มค)าร�องขีอหมายเลัขี 22
ส/งค/าแสง 10 บั�ติกลั�บัมาย�งโฮสท� (2 ไบัท�)ค/าใน tuple ท��ส/งค2นค2อ (ไบัท�ติ)�า, ไบัท�ส1ง)
แก�คลัาส แก�คลัาส PeriBoard PeriBoard ในมอด1ลั ในมอด1ลั peri.py peri.py ท��ส2บัเชั29อสายมาท��ส2บัเชั29อสายมาจากคลัาส จากคลัาส McuBoardMcuBoard ใน ใน practicum.py practicum.py โดยให�ม�เมท;โดยให�ม�เมท;อดด�งน�9อดด�งน�9setLed(self, led_no, led_value) – เซ์;ติสถูานะ LED
ติามหมายเลัขี led_no ท��ระบั%ให�เป*นไปติาม led_value (0 = ด�บั , 1 = ติ�ด)
setLedValue(self, value) – น)า 3 บั�ติลั/างขีอง value แสดงผลับัน LED โดยให�ส�แดงเป*นบั�ติขีวาส%ด เขี�ยวเป*นบั�ติซ์�ายส%ด
getSwitch(self) – ค2นค/า True เม2�อสว�ติชั�ถู1กกด False เม2�อปลั/อย
getLight(self) – ค2นค/าแสงในชั/วง 0-1023
11
โปัรแกรมสื่�าห้ร�บที่ดสื่อบ โปัรแกรมสื่�าห้ร�บที่ดสื่อบ (test-usb.py)(test-usb.py)
from peri import PeriBoardfrom time import sleep
b = PeriBoard()count = 0while True: b.setLedValue(count) sw = b.getSwitch() light = b.getLight()
if sw is True: state = "PRESSED" else: state = "RELEASED"
print "LEDs set to %d | Switch state: %-8s | Light value: %d" % ( count, state, light)
sleep(0.25) count = (count + 1) % 8
12
โครงงานปัลายภาคโครงงานปัลายภาคแติ/ลัะกลั%/มพิ�ฒนาโครงงานขีนาดเลั;กแติ/ลัะกลั%/มพิ�ฒนาโครงงานขีนาดเลั;ก
เพิ��มฮาร�ดแวร�จาก peripheral board ท��ม�อย1/ หร2อท)าบัอร�ดใหม/หากติ�องการ
พิ�ฒนาเฟ6ร�มแวร�ส)าหร�บั MCUเชั2�อมติ/อก�บัซ์อฟติ�แวร�บันฝั่4� งพิ�ซ์�ผ/านพิอร�ติ USB
ก)าหนดส/งแลัะน)าเสนอก)าหนดส/งแลัะน)าเสนอ: : แจำ�งให้�ที่ราบภายแจำ�งให้�ที่ราบภายห้ล�งห้ล�ง
ด1ติ�วอย/างโครงงานขีองร% /นพิ��ได�จากเว;บัด1ติ�วอย/างโครงงานขีองร% /นพิ��ได�จากเว;บัhttp://cloud3.cpe.ku.ac.th/practic
um