打印

STM32的USB中断上传数据错误,请高手指点!

[复制链接]
4114|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lmp|  楼主 | 2009-10-10 10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lmp 于 2009-10-10 10:23 编辑

大家好,
       我用STM32的USB功能,除端点0外增加了3个端点,1-IN,2-OUT,3-Interrup.
现在3号端点(INTERRUPT)上传的数据总是相同,用仿真器跟踪,发现是从40006000内存地址发出的数据,我的配置如下:

  SetEPType(ENDP3, EP_INTERRUPT);
  SetEPTxAddr(ENDP3, ENDP3_TXADDR);
  SetEPTxCount(ENDP3, 4);
  SetEPRxStatus(ENDP3, EP_RX_DIS);
  SetEPTxStatus(ENDP3, EP_TX_NAK);


#define BTABLE_ADDRESS      (0x00)
/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x18)
#define ENDP0_TXADDR        (0x58)
/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0x98)
/* EP2  */
/* Rx buffer base address */
#define ENDP2_RXADDR        (0xD8)
/* EP3  */
/* tx buffer base address */
#define ENDP3_TXADDR        (0x118)



    while(SC_InsertFlag == 0x55)
    {
      
       SC_InsertFlag = 0x00;
      
       TempCCIDBuff[0] = 0x50;
       TempCCIDBuff[1] = 0X00;
       TempCCIDBuff[2] = 0X02;
       TempCCIDBuff[3] = 0X03;
  
RespLength = 4;

CCID_Transfer_Data_Request(TempCCIDBuff, RespLength);
      
    }


void CCID_Transfer_Data_Request(u8* Data_Pointer, u16 Data_Length)
{  
  UserToPMABufferCopy(Data_Pointer, ENDP3_TXADDR, Data_Length);
  SetEPTxCount(ENDP3, Data_Length);
  SetEPTxStatus(ENDP3, EP_TX_VALID);
}

现在每次从中断端点上传的数据总是 58 00 1A 00
我用仿真器跟踪发现数据是从40006000发出来的: 58 00 00 00 1a 00 00 00

而缓存区40006230(0X118*2+40006000)的数据是:50 00 00 00 02 03

请高手指点一下,为此我已经折腾一周了,恳求高手指点!!
沙发
vigia| | 2009-10-10 11:58 | 只看该作者
你试试:

#define BTABLE_ADDRESS      (0x00)
/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x00)
#define ENDP0_TXADDR        (0x40)
/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0x80)
/* EP2  */
/* Rx buffer base address */
#define ENDP2_RXADDR        (0xC0)
/* EP3  */
/* tx buffer base address */
#define ENDP3_TXADDR        (0x100)

使用特权

评论回复
板凳
lmp|  楼主 | 2009-10-10 13:05 | 只看该作者
谢谢2楼,

         我刚才试了,但是不行,改成上面的地址主机会报告"无法识别的设备",
还有其它的方法吗?恳请帮助!急

使用特权

评论回复
地板
vigia| | 2009-10-10 13:25 | 只看该作者
汗。。。我以前碰到过类似的问题,好像改了地址就好了。

这个是我现在在用的分配地址,和你的应用差不多,要不你再试试:
#define BTABLE_ADDRESS      (0x00)

/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x40)
#define ENDP0_TXADDR        (0x80)

/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0xC0)
#define ENDP2_TXADDR        (0x100)
#define ENDP3_RXADDR        (0x110)

因为我的EP2是中断端点,所以用到的字节少。

使用特权

评论回复
5
lmp|  楼主 | 2009-10-10 14:26 | 只看该作者
;P;P;P

正常了,非常感谢!

我现在改成  #define ENDP3_TXADDR        (0x140)
但是我没有明白,#define ENDP3_TXADDR        (0x118)
的地址也是4(双字)的整倍数,为什么会不行呢,我一直没有怀疑是地址的问题,非常感谢vigia.:handshake

使用特权

评论回复
6
perfect13| | 2009-10-10 14:29 | 只看该作者
usb缓冲区是16位的 但是按32位对齐的 只用了低16位 高16不用
开始搞的时候也碰到这个问题

使用特权

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

本版积分规则

lmp

11

主题

30

帖子

0

粉丝