會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





USB - HID使用EP0的IN回傳資料給Host?
新會員
註冊日期:
4月14日 16:43:04
所屬群組:
註冊會員
文章: 1
等級: 1; EXP: 0
HP : 0 / 0
MP : 0 / 0
離線
MCU: PIC24FJ256GB110
Board: 開發板APP1632
IDE: MPLAB X IDE v3.51
Compiler: XC16 v1.26
參考MLA: v2017_03_06\apps\usb\device\hid_custom\firmware\exp16_pic24fj256gb210_pim.x

透過MLA範例建立了一個hid_custom想透過預設的Control Pipe - Endpoint 0 來IN/OUT data;
參考了同樣是MLA上的hid_keyboard Project,
已可從Host端透過EP0 OUT來下指令給MCU,但卻無法透過EP0 IN將資料回傳給Host...
經過研究,認為應該是透過USBEP0SendRAMPtr函數來回傳資料給Host,但卻不會使用(或者根本不對 囧)
希望大家能提供點建議,感激不盡!!

app_device_custom_hid.c裡的相關Code(其他檔案的相關Code也有做相對應撰寫):

unsigned char ToSendDataBuffer_EP0[2];

static void USBHIDCBSetReportComplete(void)
{
switch(CtrlTrfData[0]) //Look at the data the host sent, to see what kind of application specific command it sent.
{
case 0x80: //Toggle LEDs command
LED_Toggle(LED_USB_DEVICE_HID_CUSTOM);
break;
case 0x81:
if(!HIDTxHandleBusy(USBInHandle))
{
ToSendDataBuffer_EP0[0]=1;
ToSendDataBuffer_EP0[1]=2;

//使用中斷型EP1的IN pipe來傳送資料給Host => Success!
//USBInHandle = HIDTxPacket(CUSTOM_DEVICE_HID_EP, (uint8_t*)&ToSendDataBuffer_EP0[0],2);

//使用控制型EP0的IN pipe來傳送資料給Host => Fail...
USBEP0SendRAMPtr((uint8_t*)&ToSendDataBuffer_EP0[0],2,USB_EP0_RAM);
}
break;
default:
break;
}
}

void USBHIDCBSetReportHandler(void)
{
/* Prepare to receive the keyboard LED state data through a SET_REPORT
* control transfer on endpoint 0. The host should only send 1 byte,
* since this is all that the report descriptor allows it to send. */
USBEP0Receive((uint8_t*)&CtrlTrfData, USB_EP0_BUFF_SIZE, USBHIDCBSetReportComplete);
}


ps. 附檔為該段CODE的截圖,以便檢視

附加檔案:



jpg  EP0 - IN.jpg (133.27 KB)
52003_58f099d75e93c.jpg 844X788 px

4月14日 17:37:33

srxrrrrr 於 2017年04月14日 17:56:38
轉換PDF檔 列印


Re: USB - HID使用EP0的IN回傳資料給Host?
資深會員
註冊日期:
2007/11/05 08:29
所屬群組:
註冊會員
文章: 196
等級: 13; EXP: 4
HP : 0 / 301
MP : 65 / 8344
離線
用 EP0 傳資料?

在 Device 端 一般 EP0 是 Control Transfer 專用

如果用 HID 的 Device Stack 通常是不太會去說要 刻意去用 EP0 傳資料 通常是把參數設定好 USB Stack 會自動處理

另一方面 HIDTxHandleBusy 通常是用在 HID 資料傳輸用設定的 End Point 上 通常不會是指 EP0

所謂的 USB IN 並不是你把資料放在 End Point buffer 上 Host 就一定會來讀 基本上控制權在 Host 上 你的 Host 端有相對應的讀取動作嗎?

如果真的要用 EP0 可參考 usb_device.c 內的
USBCtrlTrfInHandler() USBCtrlTrfTxService() 或與 USBCtrlTrf*** 相關的function

4月14日 20:55:33
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088221 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project