CH567单片机USB设备模式同步传输长度问题

RT,现在使用USB的同步传输,UEP_T_LEN寄存器写入长度4,使用全速设备实际发送长度为4*16=64字节,使用高速设备实际发送长度为4*64=256字节,整了几天,一直解决不了,有人能帮忙看下么,谢谢。

       现在发送的数据用BUSHOUND验证是正确的,只是长度成倍数补零,导致数据不可使用。


相关初使化:

USB_CTRL(USB1) = bUC_CLR_ALL;       //清空中断标志和FIFO

USB_CTRL(USB1) = UCST_FS | bUC_INT_BUSY |bUC_DMA_EN;  //设备模式,高速

USB_SUSPEND(USB1) = 0;            //不挂起

USB_DEV_AD(USB1) = 0x00;              //设备地址0

USB_INT_FG(USB1) = 0xff;              //清除中断标志

USB_INT_EN(USB1) = bUIE_FIFO_OV | bUIE_TRANSFER | bUIE_BUS_RST;

UEP_MOD(USB1, EP1) = 0;

UEP_MOD(USB1, EP2) = 0;


UEP_DMA(USB1, EP0) = (xx_uint32_t)Ep0Buffer;

UEP_DMA(USB1, EP1) = (xx_uint32_t)Ep1Buffer;

UEP_TX_CTRL(USB1, EP2) = UEP_T_RES_NAK;

UEP_RX_CTRL(USB1, EP2) = UEP_R_RES_NAK;


打开端点:

    if(type == EP_ATTR_ISOC)

{

UEP_TX_CTRL(USB1, ep) |= bUEP_T_RES_NO;

}


    if(ep > EP0)

    {

    UEP_MOD(USB1, ep) |= bUEP_TX_EN(ep);


#if USE_DOUBLE_BUFFER

    UEP_MOD(USB1, ep) |= bUEP_BUF_MOD(ep);

#endif

    }


发送数据:

#if USE_DOUBLE_BUFFER

if(ep == EP_DOUBLE_BUFFER)

{

p += ((UEP_TX_CTRL(USB1, ep) & MASK_UEP_T_TOG) > 0) * EP_IN_OFFSET; // 切换双缓冲

}

#endif


xx_memcpy(p, buf, len);

        UEP_T_LEN(USB1, ep) = 4;

        UEP_TX_CTRL(USB1, ep) = ((UEP_TX_CTRL(USB1, ep) & ~MASK_UEP_T_RES)) | UEP_T_RES_ACK;


这是使用全速设备发送的,前4个字节是对的,后面补了很多零

image.png

这是使用高速设备发送的,前4个字节是对的,后面补了很多零

image.png

使用端点2上传的话,上传长度与UEP2_T_LENx有关。修改这个寄存器的值,可以决定上传长度。


目前便是使用UEP2_T_LENx控制发送数据长度的,但电脑实际接收的数据长度是其16倍。

假设UEP2_T_LENx=4,电脑接收数据长度为64,前4字节是正确的,后面全部是0


同样解决了吗?一样原因,我们采用ch32v307,  长度设置后进行同步传输,数据长度乘以128,如果传4字节,前面准确,后面也全是0


您好,该贴已回复你

https://www.wch.cn/bbs/thread-110725-1.html

 


只有登录才能回复,可以选择微信账号登录