打印

弄糊涂了,ST的软件

[复制链接]
2465|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eng588|  楼主 | 2010-7-8 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是ST OTG库里的一个函数,不知道红色的那两句在干什么
USB_OTG_Status USB_OTG_CoreInitDev (USB_OTG_CORE_DEVICE *pdev)
{
  USB_OTG_Status status = USB_OTG_OK;
  USB_OTG_dev_ep_ctl_data   depctl;
  uint32_t i;
  USB_OTG_dev_cfg_data   dcfg;
  USB_OTG_fifo_size_data nptxfifosize;
  USB_OTG_fifo_size_data txfifosize;
  USB_OTG_dev_in_ep_msk_data msk;
  dcfg.d32 = 0;
  /* Set device speed */
  InitDevSpeed (pdev);
  /* Restart the Phy Clock */
  WRITE_REG32(pdev->regs.pcgcctl, 0);
  /* Device configuration register */
  dcfg.d32 = READ_REG32( &pdev->regs.dev_regs->dev_cfg);
  dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80;
  WRITE_REG32( &pdev->regs.dev_regs->dev_cfg, dcfg.d32 );
  /* set Rx FIFO size */
  WRITE_REG32( &pdev->regs.common_regs->rx_fifo_siz, 160/*pdev->cfgs->host_rx_fifo_size*/);
  /* Non-periodic Tx FIFO */
  nptxfifosize.b.depth     = DEV_NP_TX_FIFO_SIZE;
  nptxfifosize.b.startaddr = RX_FIFO_SIZE;
  WRITE_REG32( &pdev->regs.common_regs->np_tx_fifo_siz, nptxfifosize.d32 );
  txfifosize.b.depth = DEV_NP_TX_FIFO_SIZE;
  WRITE_REG32( &pdev->regs.common_regs->dev_p_tx_fsiz_dieptxf[0], txfifosize.d32 );
  txfifosize.b.startaddr += txfifosize.b.depth;
  txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth;

  /* Flush the FIFOs */
  USB_OTG_FlushTxFifo(pdev , 0x10); /* all Tx FIFOs */
  USB_OTG_FlushRxFifo(pdev);
  /* Clear all pending Device Interrupts */
  WRITE_REG32( &pdev->regs.dev_regs->dev_in_ep_msk, 0 );
  WRITE_REG32( &pdev->regs.dev_regs->dev_out_ep_msk, 0 );
  WRITE_REG32( &pdev->regs.dev_regs->dev_all_int, 0xFFFFFFFF );
  WRITE_REG32( &pdev->regs.dev_regs->dev_all_int_msk, 0 );
  for (i = 0; i <= MAX_TX_FIFOS; i++)     //ha: SET OTG_FS_DIEPCTLx,OTG_FS_DIEPSIZEx,OTG_FS_DIEPINTx
  {
    depctl.d32 = READ_REG32(&pdev->regs.inep_regs->dev_in_ep_ctl);
    if (depctl.b.epena)
    {
      depctl.d32 = 0;
      depctl.b.epdis = 1;
      depctl.b.snak = 1;
    }
    else
    {
      depctl.d32 = 0;
    }
    WRITE_REG32( &pdev->regs.inep_regs->dev_in_ep_ctl, depctl.d32);
    WRITE_REG32( &pdev->regs.inep_regs->dev_in_ep_txfer_siz, 0);
    WRITE_REG32( &pdev->regs.inep_regs->dev_in_ep_int, 0xFF);
  }
  for (i = 0; i < 1/* NUM_OUT_EPS*/; i++)  //ha: SET OTG_FS_DOEPCTLx,OTG_FS_DOEPINTx,OTG_FS_DOEPTSIZx
  {
    USB_OTG_dev_ep_ctl_data depctl;
    depctl.d32 = READ_REG32(&pdev->regs.outep_regs->dev_out_ep_ctl);
    if (depctl.b.epena)
    {
      depctl.d32 = 0;
      depctl.b.epdis = 1;
      depctl.b.snak = 1;
    }
    else
    {
      depctl.d32 = 0;
    }
    WRITE_REG32( &pdev->regs.outep_regs->dev_out_ep_ctl, depctl.d32);
    WRITE_REG32( &pdev->regs.outep_regs->dev_out_ep_txfer_siz, 0);
    WRITE_REG32( &pdev->regs.outep_regs->dev_out_ep_int, 0xFF);
  }
  msk.d32 = 0;
  msk.b.txfifoundrn = 1;                 //ha: OTG_FS_DIEPMSK
  MODIFY_REG32(&pdev->regs.dev_regs->dev_in_ep_msk, msk.d32, msk.d32);
  USB_OTG_EnableDevInt(pdev);
  return status;
}
沙发
vigia| | 2010-7-8 15:20 | 只看该作者
在分配FIFO

周期性TX传输的FIFO在非周期性的TX传输的FIFO后面,所以地址是非周期性TX FIFO的首地址+非周期性TX FIFO的长度。

使用特权

评论回复
板凳
eng588|  楼主 | 2010-7-8 15:27 | 只看该作者
txfifosize.b.startaddr += txfifosize.b.depth;
txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth;

上面的第一句又在干什么?而且如果是分配FIFO,这个txfifosize变量在这两句之后再也没被使用过,给它赋这两次奇怪的值干什么?

使用特权

评论回复
地板
vigia| | 2010-7-8 15:34 | 只看该作者
另外,这个代码哪里来的?我怎么没见过。。。。。。

使用特权

评论回复
5
eng588|  楼主 | 2010-7-8 15:44 | 只看该作者
ST网站上来的,下载地址http://www.st.com/mcu/familiesdocs-110.html

使用特权

评论回复
6
vigia| | 2010-7-8 15:51 | 只看该作者
这个OTG LIB主要给OTG模块做HOST用的

要做DEVICE的还是看STM32_USB-FS-Device_Lib V3.2.0,里面的DEVICE LIB做的算完善了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

179

帖子

0

粉丝