CH579F usb host

在peripheral例程上添加usb host,對應usb部分有點疑問,對usb協(xié)議不是很熟悉,之前用libusb寫過上位機,看usb host例程不是很清楚,流程可能有點差別,所以,請問usb host的收發(fā)是怎么樣的,CH357有個例程倒是跟其他usb device通信的,非U盤之類。

//?獲取透傳數(shù)據(jù)
__align(4)?const?UINT8??GetTranData[]?=?{?0xc0,0x33,0x00,0x00,0x00,0x00,0x09,0x00?};

//?發(fā)送透傳數(shù)據(jù)
__align(4)?const?UINT8??SetTranData[]?=?{?0x40,0x35,0x00,0x00,0x00,0x00,0x09,0x00?};


//?USB?Host檢測設備連接
UINT8??UsbDectConn(void)
{
	UINT8	s;

????s?=?ERR_SUCCESS;
????if?(?R8_USB_INT_FG?&?RB_UIF_DETECT?)???????????????????????????????//?如果有USB主機檢測中斷則處理
????{??
????????R8_USB_INT_FG?=?RB_UIF_DETECT?;?
????????s?=?AnalyzeRootHub(?);???
????????
????????if?(?s?==?ERR_USB_CONNECT?)?		
????????????FoundNewDev?=?1;
????}
????
????if?(?FoundNewDev?||?s?==?ERR_USB_CONNECT?)????????????????????????//?有新的USB設備插入
????{??
????????FoundNewDev?=?0;
????????//?由于USB設備剛插入尚未穩(wěn)定,故等待USB設備數(shù)百毫秒,消除插拔抖動
????????mDelaymS(?200?);????????
????????
????????s?=?InitRootDevice();????????????????????????????????????????//?初始化USB設備
????????
????????if((ThisUsbDev.DeviceVID?==?0x1213)&&(ThisUsbDev.DevicePID?==?0x3435))
????????{
????????????ThisUsbDev.DeviceType?=?DEV_TYPE_OTHER;
????????????s?=?ERR_SUCCESS;
????????????UsbConnStatus?=?1;
????????}
????????else????????????????????????????????????????????????????????
????????{
????????????s?=?ERR_USB_UNKNOWN;????
????????????UsbConnStatus?=?0;
????????}
????}
????
????return?s;
}????


//?Usb?host接收
UINT8??UsbHostRecv(void)
{
????PUINT8?len;
????*len?=?MYUSB_RX_LEN;
????
????memset(myUsbRxBuf,0,sizeof(myUsbRxBuf));
????
????CopySetupReqPkg(?(PCHAR)GetTranData?);??????????????????????????????//?設置控制請求包
????
????//?執(zhí)行控制傳輸
????if(ERR_SUCCESS?==?HostCtrlTransfer(?(PUINT8)myUsbRxBuf,?len,?10000000))
????{
????????return?1;
????}??
????
????return?0;
}????

//?Usb?host發(fā)送
UINT8??UsbHostSend(void)???
{
????UINT8?s;
????PUINT8?len;
????
????*len?=?MYUSB_TX_LEN;
????
????CopySetupReqPkg((PCHAR)SetTranData);
????s?=?HostCtrlTransfer((PUINT8)myUsbTxBuf,?len,?200000/20?);???????????//?執(zhí)行控制傳輸
????
????if?(?s?!=?ERR_SUCCESS?)
????{
????????return?0;
????}

????return?1;
}


m.findthetime.net/bbs/thread-65023-1.html

你好,這里面有USB主機的相應例程,可以參考。如果想在藍牙的基礎上添加USB主機功能,注意需要通過TMOS設置藍牙任務操作USB。


我已經(jīng)在BLE基礎上加上USB host功能,我使用的是中斷傳輸方式,在藍牙周期任務中周期執(zhí)行IN事務,可以正確收到device的數(shù)據(jù),也就是說IN是沒問題,但是OUT事務有問題,OUT事務最后返回的狀態(tài)是ERR_SUCCESS,但是device是沒有收到數(shù)據(jù)的,因為我在收到host數(shù)據(jù)時直接返回,用PC上位機測試通過,但是CH579 OUT后沒能IN到數(shù)據(jù)。

接口信息如下:

image.png


我在控制傳輸基礎上寫的中斷傳輸如下:

/*******************************************************************************
*?Function?Name??:?HostInterrupTransfer
*?Description????:?執(zhí)行中斷傳輸
*?Input??????????:?DataBuf?:?如果需要接收和發(fā)送數(shù)據(jù),那么DataBuf需指向有效緩沖區(qū)用于存放后續(xù)數(shù)據(jù)
*??????????????????RetLen??:?實際成功收發(fā)的總長度保存在RetLen指向的字節(jié)變量中
*??????????????????type:?????IN/OUT
*??????????????????endAddr:??端點地址
*?Return?????????:?ERR_USB_BUF_OVER?IN狀態(tài)階段出錯
???????????????????ERR_SUCCESS?????數(shù)據(jù)交換成功
???????????????????其他錯誤狀態(tài)
*******************************************************************************/
UINT8?HostInterrupTransfer(?PUINT8?DataBuf,?PUINT8?RetLen,UINT8?type,?UINT8?endAddr)??
{
????UINT16??RemLen??=?0;
????UINT8???s,?RxLen,?RxCnt,?TxCnt;
????PUINT8??pBuf;
????PUINT8???pLen;
????
????pBuf?=?DataBuf;
????pLen?=?RetLen;
????mDelayuS(?200?);

????//?R8_UH_RX_CTRL?=?R8_UH_TX_CTRL?=?0x80?|?0x10?|?0x40?|?0x10?=?D0
????R8_UH_RX_CTRL?=?R8_UH_TX_CTRL?=?RB_UH_R_TOG?|?RB_UH_R_AUTO_TOG?|?RB_UH_T_TOG?|?RB_UH_T_AUTO_TOG;//?默認DATA1
????R8_UH_TX_LEN?=?0x01;????????????????????????????????????????????????????????????????????????????//?默認無數(shù)據(jù)故狀態(tài)階段為IN
????
????RemLen?=?0x09;
????
????if?(?RemLen?&&?pBuf?)???????????????????????????????????????????????????????????????????????????//?需要收發(fā)數(shù)據(jù)
????{
????????if?(?type?==?USB_REQ_TYP_IN?)???????????????????????????????????????????????????????????????//?中斷IN
????????{
????????????while?(?RemLen?)
????????????{
????????????????mDelayuS(?200?);
????????????????s?=?USBHostTransact(?USB_PID_IN?<<?4?|?endAddr,?R8_UH_RX_CTRL,?200000/200);?????????//?IN數(shù)據(jù)
????????????????
????????????????if?(?s?!=?ERR_SUCCESS?)
????????????????{
????????????????????//?PRINT(?"recv?tran1:?%d...\n",s);
????????????????????return(?s?);
????????????????}
????????????????
????????????????RxLen?=?R8_USB_RX_LEN?<?RemLen???R8_USB_RX_LEN?:?RemLen;
????????????????RemLen?-=?RxLen;
????????????????
????????????????/*
????????????????if?(?pLen?)				
????????????????????*pLen?+=?RxLen;?????????????????????????????????????????????????????????????????//?實際成功收發(fā)的總長度
????????????????*/
????????????????
????????????????for?(?RxCnt?=?0;?RxCnt?!=?RxLen;?RxCnt?++?)
????????????????{
????????????????????*pBuf?=?pHOST_RX_RAM_Addr[?RxCnt?];
????????????????????pBuf?++;
????????????????}
????????????????
????????????????if?(?R8_USB_RX_LEN?==?0?||?(?R8_USB_RX_LEN?&?(?UsbDevEndp0Size?-?1?)?)?)????????????//?短包
????????????????????break;??????????????????????????????????????????????????????????????????
????????????}
????????????R8_UH_TX_LEN?=?0x00;????????????????????????????????????????????????????????????????????//?狀態(tài)階段為OUT?
????????????return(?ERR_SUCCESS?);??
????????}
????????else????????????????????????????????????????????????????????????????????????????????????????//?OUT
????????{???
????????????while?(?RemLen?)
????????????{
????????????????mDelayuS(?200?);
????????????????//?R8_UH_TX_LEN?=?RemLen?>=?9???9?:?RemLen;
????????????????R8_UH_TX_LEN?=?RemLen?>=?UsbDevEndp0Size???UsbDevEndp0Size?:?RemLen;
????????????????
????????????????for?(?TxCnt?=?0;?TxCnt?!=?R8_UH_TX_LEN;?TxCnt?++?)
????????????????{
????????????????????pHOST_TX_RAM_Addr[?TxCnt?]?=?*pBuf;
????????????????????pBuf?++;
????????????????}
????????????????
????????????????s?=?USBHostTransact(?USB_PID_OUT?<<?4?|?endAddr,?R8_UH_TX_CTRL,?200000/20?);??????//?OUT數(shù)據(jù)
????????????????
????????????????if?(?s?!=?ERR_SUCCESS?)?
????????????????{
????????????????????PRINT(?"cannot?transact:%d??addr:?%d?\n"?,s,endAddr);
????????????????????return(?s?);
????????????????}?
????????????????
????????????????RemLen?-=?R8_UH_TX_LEN;
????????????????
????????????????/*
????????????????if?(?pLen?)					???
????????????????????*pLen?+=?R8_UH_TX_LEN;???		??????????????????????????????????????????????//?實際成功收發(fā)的總長度
????????????????*/
????????????}
????????????
????????????R8_UH_TX_LEN?=?0x01;?????????????????????????????????????????????????????????????????//?狀態(tài)階段為IN
????????????
????????????return(?s?);?
????????}
????}
????
????/*
????//?STATUS階段(握手)
????mDelayuS(?200?);
????s?=?USBHostTransact(?(?R8_UH_TX_LEN???USB_PID_IN?<<?4?|?endAddr:?USB_PID_OUT?<<?4?|?endAddr?),?RB_UH_R_TOG?|?RB_UH_T_TOG,?200000/20?);??
????
????if?(?s?!=?ERR_SUCCESS?)?
????{
????????PRINT("********?transact?1?************\n");
????????return(?s?);????
????}
????*/
????
????if?(?R8_UH_TX_LEN?==?0?)????????
????????return(?ERR_SUCCESS?);??????????????????????????????????????????????????????????????????????//?狀態(tài)OUT
????
????if?(?R8_USB_RX_LEN?==?0?)???????
????????return(?ERR_SUCCESS?);??????????????????????????????????????????????????????????????????????//?狀態(tài)IN,檢查IN狀態(tài)返回數(shù)據(jù)長度
????
????return(?ERR_USB_BUF_OVER?);?????????????????????????????????????????????????????????????????????//?IN狀態(tài)階段錯誤
}


狀態(tài)如下:


image.png




icon_rar.gifPeripheral_usb_host_work.zip

簡單的demo例程演示,可以參考一下


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频