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个字节是对的,后面补了很多零
这是使用高速设备发送的,前4个字节是对的,后面补了很多零