WCH沁恒单片机
直播中

郭大

11年用户 1059经验值
擅长:嵌入式技术
私信 关注
[问答]

CH554如何向设备端发消息并接收数据呢?

您好。我现在ch554作为host连接一个usb设备,已经枚举完成得到设备的各描述符,设备interface 1、endp 1需要开始同步传输(等时传输),我要如何向设备端发消息并接收数据呢?
谢谢!
  

回帖(6)

汪岑

2022-6-16 15:27:23
同步传输和批量、中断传输的主要差别在于对于IN、OUT事务不做相应,实现对事务不响应配置如下图。

举报

费晨

2022-6-16 15:27:28
您好,按照您的回复,参考CH554EVT_参考例程写了代码测试,同步传输看上去是成功了,可接收的数据没有填充到RxBuffer里。请帮忙看看哪里做的不对,接收的值应该在哪里取到?谢谢!
举报

刘悌耀

2022-6-16 15:27:33
不好意思为什么空格都变成了问号。越改越乱,重贴一次。抱歉
举报

晏玉屏

2022-6-16 15:27:41
//这两个变量修改了,因为同步传输时可能一次接收了126个字节。经测试RxBuffer是64还是126效果都一样UINT8XRxBuffer[126]_at_0x0000;//IN,mustevenaddressUINT8XTxBuffer[MAX_PACKET_SIZE]_at_0x007E;//OUT,mustevenaddressvoidmain(){    UINT8i,r,s,len,endp;    UINT16isoc_len,loc;    CfgFsys();    mDelaymS(50);    mInitSTDIO();//串口0初始化(按12MHz内部晶振),为了让计算机通过串口监控演示过程    printf("Start@ChipID=%02Xn",(UINT16)CHIP_ID);    InitUSB_Host();//初始化USB主机    printf("initusbhostokn");    while(1){        if(UIF_DETECT){//如果有USB主机检测中断则处理            UIF_DETECT=0;//清中断标志            s=AnalyzeRootHub();//分析ROOT-HUB状态            if(s==ERR_USB_CONNECT//有USB设备接入                &&ThisUsbDev.DeviceStatus==ROOT_DEV_CONNECTED//刚插入设备尚未初始化            ){                s=InitRootDevice();//初始化/枚举指定HUB端口的USB设备                if(s!=ERR_SUCCESS){                    printf("EnumAllRootDeverr=%02Xn",(UINT16)s);                }            }        }        //SETINTERFACE        //GETCUR        //SETCUR        //SETINTERFACE(COMMIT)        //pSetupReq结构各成员赋值,然后HostCtrlTransfer传输        s=HostCtrlTransfer(Com_Buffer,(PUINT8)&len);        ......//一些杂七杂八的get/set,略        //以上看上去都没什么问题,打出来的值也对        mDelayuS(200);    while(1){        len=0;        memset(RxBuffer,0x78,sizeof(RxBuffer));//初始化值                UH_RX_CTRL=UH_RX_CTRL|bUH_R_RES;//主机响应控制        UH_TX_CTRL=UH_TX_CTRL|bUH_T_RES;//主机响应控制                //endp:0不报错但收到长度为0        //endp:1收到长度126字节,但RxBuffer内容全是初始值        //endp:2、3报错USB_INT_ST为0x03        UH_EP_PID=USB_PID_IN<<4|0x01;//指定令牌PID和目的端点号                UIF_TRANSFER=0;//允许传输        for(i=WAIT_USB_TOUT_200US;i!=0&&UIF_TRANSFER==0;i--);//等待传输完成        UH_EP_PID=0x00;//停止USB传输        if(UIF_TRANSFER==0){            printf("ISOCERROR::NoTransactn");            while(1){mDelaymS(1000);}        }        if(U_TOG_OK){            printf("ISOCTOG_OKsuccessn");            break;        }                s=USB_INT_ST&MASK_UIS_H_RES;//USB设备应答状态MASK_UIS_H_RES:0x0F        if(s==USB_PID_STALL){            printf("ISOCERROR::STALL:%02Xn",(UINT16)(s));            while(1){mDelaymS(1000);}        }        else{            if(s==USB_PID_NAK){                ;            }            else{                if(s){                    printf("ISOCERROR::othererror:%02X%02Xn",(UINT16)(s),(UINT16)USB_INT_ST);                    while(1){mDelaymS(1000);}                }            }        }        len=USB_RX_LEN;        if(len>4){            //len大于0时,RxBuffer却总全部是初始化的值            if(RxBuffer[0]!=0x78&&RxBuffer[1]!=0x78&&RxBuffer[2]!=0x78&&RxBuffer[3]!=0x78){                printf("ISOClen::%02Xn",(UINT16)len);//能够看到len:0x7E,但数据在哪里呢                for(i=0;i
举报

更多回帖

发帖
×
20
完善资料,
赚取积分