WCH沁恒单片机
直播中

吴湛

10年用户 1016经验值
擅长:可编程逻辑
私信 关注
[问答]

数据无法IN到上位机,求大佬分享CH567批量传输的例程

前期通过客服拿到了CH567的例程,但是由于内容不完整,只有SETUP控制传输的部分内容,并有一些写法存在问题。目前经过查阅文档,依然无法实现设备端的端点批量传输、IN数据至上位机(上位机OUT数据能够正常接收)。希望能够提供批量传输较为完整的例程,谢谢。
主要的代码如下:
__attribute__ ((aligned(4)))UINT8   Ep1Buffer[512*2] ;                  // EP1 IN+OUT, must 4字节对齐
#define U***Ep1OUTBuf        ((PUINT8)&Ep1Buffer[0])
#define U***Ep1INBuf         ((PUINT8)&Ep1Buffer[512])


void USB1DeviceInit( ){
    R8_USB1_CTRL   = bUC_CLR_ALL;       //清空中断标志和FIFO
    R8_USB1_CTRL   = UCST_HS | bUC_INT_BUSY |bUC_DMA_EN;  //设备模式,高速,
    R8_USB1_SUSPEND = 0;                //不挂起
    R8_USB1_DEV_AD = 0x00;              //设备地址0
    R8_USB1_INT_FG = 0xff;              //清除中断标志
    R8_USB1_INT_EN = bUIE_FIFO_OV | bUIE_SUSPEND | bUIE_TRANSFER | bUIE_BUS_RST;        //中断使能


    R8_UEP1_TX_CTRL1 = UEP_T_RES_NAK | bUEP_AUTO_TOG;
    R8_UEP1_RX_CTRL1 = UEP_R_RES_ACK| bUEP_AUTO_TOG;
    R8_UEP4_1_MOD1 |= bUEP1_TX_EN | bUEP1_RX_EN;
    R16_UEP1_MAX_LEN1 = 512;
    R16_UEP1_DMA1 = (UINT16)(UINT32)Ep1Buffer;
}


void xxxx(){
    ..........

    R16_UEP1_DMA1 = (UINT16)(UINT32)U***Ep1INBuf;
    R16_UEP1_T_LEN1 = len;
    R8_UEP1_TX_CTRL1 = (R8_UEP1_TX_CTRL1 & ~ MASK_UEP_T_RES) | UEP_T_RES_ACK;
    //通过HUS HOUND发现,U***Ep1INBuf数据未能发送至上位机

}


  

回帖(1)

张婷

2022-5-19 10:34:37
在单片机执行xxx()函数之后,CTRL寄存器中TX的状态就变成ACK了,这个时候只要主机下发IN令牌,芯片就会将数据包上传。但是要注意一点,首先BUSHOUND是差不多在协议层的,有些包不显示,包括错误的包,其次有一些错误状态也无法显示。如果有条件用硬件抓包工具进行抓包.
举报

更多回帖

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