打印
[STM32F4]

F4 USB使用中遇到的问题

[复制链接]
864|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
seawwh|  楼主 | 2015-7-27 12:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USB, spi, pi, DM, DMA
   F4 USB使用中遇到的问题

固件库:  STM32_USB-Host-Device_Lib_V2.1.0  
硬件构成:
  F4的 USB Device 虚拟串口与PC机相连;
  F4的 USB Host 访问U盘;
  SPI2 读取外部数据,中断触发,DMA方式读入;
工作模式:
  每秒3000次外部触发SPI,每次触发SPI做2次 DMA读取,每次读32字节。
  使用了外部引脚中断和SPI DMA Rx 中断。

  与此同时 读取的数据在缓冲区满的时候,写入到U盘中,每秒有3-4次写盘动作。

问题:
  工作时SPI传输数据有错位现象,出错帧约有0.1-0.05%. 如果关闭U盘写入操作,无上述出错现象。
  工作时中断有些频繁,外部引脚中断3000次和SPI DMA Rx 中断6000次。
处理:
  使用非DMA模式接收数据证明,数据不是发送方面的问题;

可能原因:
  1. 我的代码有问题
  2. 固件库有问题;
   3. F405 有设计缺陷;

针对我的程序将频繁中断方式改为主程序中的查询状态机方式,此现象依然存在。


沙发
mmuuss586| | 2015-7-27 12:35 | 只看该作者
改成寄存器读写操作;
如果是CPU来不及处理,可以考虑加个系统;
中断程序尽量短;

使用特权

评论回复
板凳
ticomi| | 2015-7-27 15:13 | 只看该作者
中国问题是中断优先级造成的,USB的中断时间很长,如果其中断优先级高的话,那么很容易出现这个问题。我曾遇到过类似的问题!

使用特权

评论回复
地板
seawwh|  楼主 | 2015-7-27 22:05 | 只看该作者
楼上的观点,我在坛子里也有看到。
不解的是,改为查询模式的SPI DMA操作后,也还是有问题。这时中断已关闭。
下面是非中断SPI DMA 接收数据的示意代码(会发生数据错位)。

  while (1) {
    USBH_Process(&USB_OTG_Core, &USB_Host);  // Host Task handler
    switch(ST) {
    case 0:
      if (IRQ==0) {
        Trig_SPI_DMARx();   // 触发Rx DMA
        ST=1;
        break;
     }
     case 1:
        if (SPI_DMARx_End) {// DMA 完成判断
          Data_Proc();
          ST=0;
       }
        break;
    }
  }

下面是查询SPI 接收数据的示意代码(不会发生数据错位)。

  while (1) {
    USBH_Process(&USB_OTG_Core, &USB_Host);  // Host Task handler
    if (IRQ==0) {
      for(i=0; i<32; i++) {
        SPI2->DR=0;
        while (!SPI2_Rx_Rdy()); // 等待SPI Rx接收完成
        Bu[i]=SPI2->DR;
        break;
      }
    }
  }


  比较上面两段代码可以发现,使用DMA操作会发生错位问题,但愿不会是硬件的Bug。


使用特权

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

本版积分规则

145

主题

368

帖子

0

粉丝