为什么STM32F407的虚拟串口实验,配置的两个端点1 是双向端点 OUT1 IN1 设置为批量传输端点
在实际工程中 采取的是判断为 同步端点的方式,进行传输?
用代码块功能插入代码,请勿粘贴截图
USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep)// 端点开始传输函数 ep.xfer_buffer已经有所指了 就是 char 数组的成员
{//但是使用的时候,得让它写到地址上吧, 结构体顺序放成员?
USB_OTG_STS status = USB_OTG_OK;
USB_OTG_DEPCTL_TypeDef depctl;
USB_OTG_DEPXFRSIZ_TypeDef deptsiz;//这俩变量常规 操作 端点 在准备控制端点函数中 是使能端点 和配置packetsiz e
USB_OTG_DSTS_TypeDef dsts;
uint32_t fifoemptymsk = 0;
depctl.d32 = 0;
deptsiz.d32 = 0;
/* IN endpoint */
if (ep->is_in == 1)
{
depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL));//读取整个端点控制寄存器
/* 32位 端点使能 ,置1启动端点数据发送*/
deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ));
/* Zero Length Packet? */
if (ep->xfer_len == 0)
{
deptsiz.b.xfersize = 0;
deptsiz.b.pktcnt = 1;
}
else//长度非0 就有数据要发了
{
/* Program the transfer size and packet count 编程传输大小和包计数
* as follows: xfersize = N * maxpacket +
* short_packet pktcnt = N + (short_packet
* exist ? 1 : 0)
*/
deptsiz.b.xfersize = ep->xfer_len;
deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket;// 包计数= 长度 / 包最大数量 就是此次传输要发多少个包
if (ep->type == EP_TYPE_ISOC)
{
deptsiz.b.mc = 1;
}
}
USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32);//就是把数据写到其他端点里面 pkycnt变量还真是一次传输包含的数据包数
//但是内容 数据指向没有明确 没有给到发送端点FIFO 起码
if (pdev->cfg.dma_enable == 1)
{
USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr);//DMA操作 只是确定源和目标,并没有真正采用DMA
}//注释此行代码,可以有OUT传输,但是没法 进行 IN传输的 OUT的返回值,说明IN传输 需要用到DMA方式
else//非dma
{
if (ep->type != EP_TYPE_ISOC)//非同步端点 批量传输
{
/* Enable the Tx FIFO Empty Interrupt for this EP 使能此端点的 发送FIFO空中断*/
if (ep->xfer_len > 0)
{//这里传入的参数不涉及数据,只有一点配置。
fifoemptymsk = 1 << ep->num; //1左移端点号 就是 屏蔽寄存器从0位是端点0 1位是端点1 0010就是端点1
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk);//使能该端点中断 寄存器是INFIFO空中断屏蔽寄存器 用于控制INFIFO空中断的生成
}//操作的是 中断屏蔽寄存器
}
}
if (ep->type == EP_TYPE_ISOC)//同步传输
{
dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
if (((dsts.b.soffn)&0x1) == 0)
{
depctl.b.setd1pid = 1;
}
else
{
depctl.b.setd0pid = 1;//设置一下 pid
}
}
/* EP enable, IN data in FIFO 端点使能 IN端点在FIFO */
depctl.b.cnak = 1;
depctl.b.epena = 1;//使能端点 启动数据发送 在这的数据也就直接发送 使能了端点发送就直接发送? 我想看到端点发送fifo
USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32); //写到中断控制寄存器 使能端点x的中断控制寄存器
//"应用程序将此位置 1 以在端点上启动数据发送。"
if (ep->type == EP_TYPE_ISOC)
{
USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len);
} //注释此行,同样可以IN,无法返还
}